#include #include bool 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; readTime(); if(NullEvent==mRunningEvent)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)) { outDebug("[isChannelMessage] FAIL",eventType); 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; mLastData=mEventType; 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 : outDebug("[handleMetaEvent]SequenceNumberEvent"); returnCode=handleMetaSequenceNumberEvent(); break; case TextEvent : outDebug("[handleMetaEvent]TextEvent"); returnCode=handleMetaTextEvent(); break; case CopyrightNotice : outDebug("[handleMetaEvent]CopyrightNotice"); returnCode=handleMetaTextEvent(); break; case SequenceTrackName : outDebug("[handleMetaEvent]SequenceTrackName"); handleGenericMetaEvent(); break; case InstrumentName : outDebug("[handleMetaEvent]InstrumentName"); handleGenericMetaEvent(); break; case Lyric : outDebug("[handleMetaEvent]Lyric"); handleGenericMetaEvent(); break; case Marker : outDebug("[handleMetaEvent]Marker"); handleGenericMetaEvent(); break; case CuePoint : outDebug("[handleMetaEvent]CuePoint"); handleGenericMetaEvent(); break; case ChannelPrefix : outDebug("[handleMetaEvent]ChannelPrefix"); handleChannelPrefix(); break; case EndOfTrack : outDebug("[handleMetaEvent]EndOfTrack"); handleGenericMetaEvent(); endOfTrack(); returnCode=FALSE; break; case SetTempo : outDebug("[handleMetaEvent]SetTempo"); handleSetTempoEvent(); break; case SMPTEFormatSpec : outDebug("[handleMetaEvent]SMTPFormatSpec"); handleSMPTEFormatEvent(); break; case TimeSignature : outDebug("[handleMetaEvent]TimeSignature"); handleTimeSignatureEvent(); break; case KeySignature : outDebug("[handleMetaEvent]KeySignature"); handleGenericMetaEvent(); break; case SequencerSpecificMetaEvent : outDebug("[handleMetaEvent]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; String strText; if(!mMidiFile.read(textLength))return FALSE; mBytesRead++; for(short index=0;index