Files
Work/midiwrt/MUSFILE.CPP
2024-08-07 09:16:27 -04:00

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;
}