Initial
This commit is contained in:
131
midiwrt/MUSFILE.CPP
Normal file
131
midiwrt/MUSFILE.CPP
Normal file
@@ -0,0 +1,131 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user