#include #include #include #include #include WORD MidiTrack::readHeader(void) { if(!mMidiFile.isOkay())return FALSE; if(!mMidiFile.seek(mHeaderPosition,MemFile::SeekBeginning))return FALSE; if(!mMidiFile.read(mTrack,sizeof(mTrack)))return FALSE; if(!mMidiFile.read(mLengthData))return FALSE; return TRUE; } WORD MidiTrack::writeHeader(void) { if(!mMidiFile.isOkay())return FALSE; if(!mMidiFile.seek(mHeaderPosition,MemFile::SeekBeginning))return FALSE; if(!mMidiFile.write(mTrack,sizeof(mTrack)))return FALSE; if(!mMidiFile.write(mLengthData))return FALSE; return TRUE; } WORD MidiTrack::writeMetaEvent(MetaEventType metaEventType,void *lpData,BYTE lengthData) { BYTE eventType(MetaEvent); if(!mMidiFile.isOkay())return FALSE; if(!writeTimeValue(mDeltaTime))return FALSE; if(!mMidiFile.write(eventType))return FALSE; if(!mMidiFile.write((BYTE)metaEventType))return FALSE; if(!mMidiFile.write(lengthData))return FALSE; if(!mMidiFile.write((char*)lpData,lengthData))return FALSE; mByteCount+=(3+lengthData); if(!flushTrack())return FALSE; return TRUE; } WORD MidiTrack::writeMidiChannelMessage(MidiChannelMsg midiChannelMessage,BYTE channel,void *lpData,BYTE lengthData) { BYTE midiMessage(midiChannelMessage|channel); if(!mMidiFile.isOkay())return FALSE; if(!writeTimeValue(mDeltaTime))return FALSE; if(!mMidiFile.write(midiMessage))return FALSE; if(!mMidiFile.write((char*)lpData,lengthData))return FALSE; mByteCount+=(lengthData+1); if(!flushTrack())return FALSE; return TRUE; } WORD MidiTrack::writeEndTrack(void) { BYTE eventType(MetaEvent); BYTE metaEventType(EndOfTrack); BYTE nullByte(0); if(!mMidiFile.isOkay())return FALSE; if(!writeTimeValue(mDeltaTime))return FALSE; if(!mMidiFile.write(eventType))return FALSE; if(!mMidiFile.write(metaEventType))return FALSE; if(!mMidiFile.write(nullByte))return FALSE; mByteCount+=3; if(!flushTrack())return FALSE; return TRUE; } WORD MidiTrack::flushTrack(void) { DWORD currPos(mMidiFile.tell()); if(!readHeader())return FALSE; mLengthData=mByteCount; if(!writeHeader())return FALSE; if(!mMidiFile.seek(currPos,MemFile::SeekBeginning))return FALSE; return TRUE; } WORD MidiTrack::writeTimeValue(DWORD value) { DWORD tempValue; tempValue=(value&0x7F); while((value>>=7)>0) { tempValue<<=8; tempValue|=0x80; tempValue+=(value&0x7F); } while(TRUE) { if(!mMidiFile.write((BYTE)(tempValue&0xFF)))return FALSE; mByteCount++; if(!(tempValue&0x80))break; tempValue>>=8; } return TRUE; }