132 lines
3.7 KiB
C++
132 lines
3.7 KiB
C++
#include <iostream.h>
|
|
#include <iomanip.h>
|
|
#include <stdio.h>
|
|
#include <midiwrt/musfile.hpp>
|
|
|
|
MUSFile::MUSFile(String musPathFileName)
|
|
: mMusFile(musPathFileName), mlpMUSInstruments(0), mhGlobalMUSInstruments(0),
|
|
mIsOkay(FALSE), mPitchBenderValue(0), mTempoValue(0)
|
|
{
|
|
String musIDString("MUS");
|
|
|
|
if(!mMusFile.isOkay())return;
|
|
if(!readHeader(mMusFile))return;
|
|
if(!(musIDString==headerID()))return;
|
|
if(!instruments())return;
|
|
mhGlobalMUSInstruments=::GlobalAlloc(GMEM_FIXED,instruments()*sizeof(WORD));
|
|
mlpMUSInstruments=(WORD FAR *)::GlobalLock(mhGlobalMUSInstruments);
|
|
for(int index=0;index<instruments();index++)mMusFile.read(*(mlpMUSInstruments+index));
|
|
mIsOkay=TRUE;
|
|
}
|
|
|
|
MUSFile::~MUSFile()
|
|
{
|
|
if(mlpMUSInstruments)
|
|
{
|
|
while(::GlobalUnlock(mhGlobalMUSInstruments));
|
|
::GlobalFree(mhGlobalMUSInstruments);
|
|
mlpMUSInstruments=0;
|
|
mhGlobalMUSInstruments=0;
|
|
}
|
|
}
|
|
|
|
WORD MUSFile::readMUSFile(void)
|
|
{
|
|
BYTE eventDescriptor;
|
|
BYTE trackNumber;
|
|
WORD isRunning(TRUE);
|
|
WORD returnCode(FALSE);
|
|
PureEvent pureEvent;
|
|
PureDelay pureDelay;
|
|
|
|
if(!isOkay())return FALSE;
|
|
mChannelNotes.size(MaxChannel);
|
|
for(trackNumber=0;trackNumber<=MaxTracks;trackNumber++)
|
|
{
|
|
isRunning=TRUE;
|
|
pureDelay.resetDelay();
|
|
if(!handleScoreStart())return FALSE;
|
|
if(!mMusFile.seek(scoreStart(),FileIO::SeekBeginning))return FALSE;
|
|
while(isRunning)
|
|
{
|
|
if(!mMusFile.read(eventDescriptor)){isRunning=FALSE;break;}
|
|
pureEvent.setEvent(eventDescriptor);
|
|
switch(pureEvent.eventType())
|
|
{
|
|
case PureEvent::ReleaseNote :
|
|
mChannelNotes[pureEvent.channel()].readNote(mMusFile);
|
|
if(pureEvent.channel()==trackNumber)
|
|
handleReleaseNote(pureEvent,pureDelay,mChannelNotes[pureEvent.channel()],trackNumber);
|
|
break;
|
|
case PureEvent::PlayNote :
|
|
mChannelNotes[pureEvent.channel()].readNote(mMusFile);
|
|
if(pureEvent.channel()==trackNumber)
|
|
handlePlayNote(pureEvent,pureDelay,mChannelNotes[pureEvent.channel()],trackNumber);
|
|
break;
|
|
case PureEvent::PitchWheel :
|
|
mMusFile.read(mPitchBenderValue);
|
|
if(pureEvent.channel()==trackNumber)
|
|
handlePitchBend(pureEvent,pureDelay,mPitchBenderValue,trackNumber);
|
|
break;
|
|
case PureEvent::Tempo :
|
|
mMusFile.read(mTempoValue);
|
|
if(pureEvent.channel()==trackNumber)
|
|
handleReset(pureEvent,pureDelay,mTempoValue,trackNumber);
|
|
break;
|
|
case PureEvent::ChangeController :
|
|
mPureController.readController(mMusFile);
|
|
if(pureEvent.channel()==trackNumber)
|
|
handleController(pureEvent,pureDelay,mPureController,trackNumber);
|
|
break;
|
|
case PureEvent::UnknownOne :
|
|
break;
|
|
case PureEvent::ScoreEnd :
|
|
isRunning=FALSE;
|
|
returnCode=TRUE;
|
|
handleScoreEnd(pureDelay);
|
|
break;
|
|
case PureEvent::UnknownTwo :
|
|
break;
|
|
}
|
|
if(pureEvent.hasTimeInfo())pureDelay.readDelay(mMusFile);
|
|
}
|
|
}
|
|
return returnCode;
|
|
}
|
|
|
|
WORD MUSFile::handleScoreStart(void)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSFile::handleReleaseNote(PureEvent &/*pureEvent*/,PureDelay &/*pureDelay*/,PureNote &/*releaseNote*/,BYTE /*trackNumber*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSFile::handlePlayNote(PureEvent &/*pureEvent*/,PureDelay &/*pureDelay*/,PureNote &/*playNote*/,BYTE /*trackNumber*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSFile::handlePitchBend(PureEvent &/*pureEvent*/,PureDelay &/*pureDelay*/,BYTE /*pitchBenderValue*/,BYTE /*trackNumber*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSFile::handleReset(PureEvent &/*pureEvent*/,PureDelay &/*pureDelay*/,BYTE /*tempoValue*/,BYTE /*trackNumber*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSFile::handleController(PureEvent &/*pureEvent*/,PureDelay &/*pureDelay*/,PureController &/*pureController*/,BYTE /*trackNumber*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSFile::handleScoreEnd(PureDelay &/*pureDelay*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|