#include #include WORD MidiTrack::readTrack(void) { mBytesRead=0; if(PureHeader::Unset==mTimingMethod)return FALSE; if(!mMidiFile.read(mTrack,sizeof(mTrack)))return FALSE; if(::strncmp(mTrack,"MTrk",sizeof(mTrack)))return FALSE; if(!mMidiFile.read(mLengthData))return FALSE; if(!mLengthData)return FALSE; readTime(); while(mBytesRead=mLengthData)break; if(NullEvent==mRunningEvent){readTime();mLastEventType=mEventType;} else mLastEventType=mRunningEvent; } return TRUE; } void MidiTrack::readTime(void) { switch(mTimingMethod) { case PureHeader::DeltaTime : case PureHeader::TimeCode : mDeltaTime=readVarLength(); break; } } WORD MidiTrack::handleEvent(void) { WORD returnCode; switch(mEventType) { case MetaEvent : mRunningEvent=NullEvent; returnCode=handleMetaEvent(); break; case SystemExclusiveOne : case SystemExclusiveTwo : mRunningEvent=NullEvent; returnCode=handleSystemExclusiveEvent(); break; default : returnCode=handleMIDIChannelMessage(); break; } return returnCode; } WORD MidiTrack::isChannelMessage(BYTE eventType)const { BYTE status((eventType>>4)&0x0F); if((status<=0x07)||(0x0F==status))return FALSE; if((status>=0x08&&status<=0x0B)||(status==0x0E))return 2; return 1; } WORD MidiTrack::handleMIDIChannelMessage(void) { WORD returnCode; if(isRunningStatus(mEventType)) { if(NullEvent==mRunningEvent)mRunningEvent=mLastEventType; mEventType=mLastEventType; } else mRunningEvent=NullEvent; if(isChannelMessage(mEventType))returnCode=processMIDIChannelMessage(); else returnCode=FALSE; return returnCode; } WORD MidiTrack::handleMetaEvent(void) { BYTE entryType; WORD returnCode(TRUE); if(!mMidiFile.read(entryType))return FALSE; mBytesRead++; switch(entryType) { case SequenceNumberEvent : returnCode=handleMetaSequenceNumberEvent(); break; case TextEvent : returnCode=handleMetaTextEvent(); break; case CopyrightNotice : returnCode=handleMetaTextEvent(); break; case SequenceTrackName : handleGenericMetaEvent(); break; case InstrumentName : handleGenericMetaEvent(); break; case Lyric : handleGenericMetaEvent(); break; case Marker : handleGenericMetaEvent(); break; case CuePoint : handleGenericMetaEvent(); break; case ChannelPrefix : handleChannelPrefix(); break; case EndOfTrack : handleGenericMetaEvent(); returnCode=FALSE; break; case SetTempo : handleSetTempoEvent(); break; case SMPTEFormatSpec : handleSMPTEFormatEvent(); break; case TimeSignature : handleTimeSignatureEvent(); break; case KeySignature : handleGenericMetaEvent(); break; case SequencerSpecificMetaEvent : handleGenericMetaEvent(); break; default : handleGenericMetaEvent(); break; } return returnCode; } WORD MidiTrack::handleSystemExclusiveEvent(void) { return handleGenericMetaEvent(); } WORD MidiTrack::handleMetaSequenceNumberEvent(void) { WORD sequenceNumber; if(!mMidiFile.read(sequenceNumber))return FALSE; mBytesRead++; return TRUE; } WORD MidiTrack::handleMetaTextEvent(void) { BYTE textLength; BYTE textByte; if(!mMidiFile.read(textLength))return FALSE; mBytesRead++; for(short index=0;index