#ifndef _MIDITRACK_HPP_ #define _MIDITRACK_HPP_ #include #include #include #include class MidiTrack { public: enum EventType{MetaEvent=0xFF,SystemExclusiveOne=0xF0,SystemExclusiveTwo=0xF7,NullEvent=0x00}; enum MidiChannelMsg{MIDIProgramChange=0xC0,MIDINoteOff=0x80,MIDINoteOn=0x90, MIDIKeyPressure=0xA0,MIDIParameter=0xB0,MIDIPitchBend=0xE0,MIDIProgram=0xC0, MIDIChannelPressure=0xD0}; enum MetaEventType{SequenceNumberEvent=0x00,TextEvent=0x01,CopyrightNotice=0x02, SequenceTrackName=0x03,InstrumentName=0x04,Lyric=0x05,Marker=0x06,CuePoint=0x07, EndOfTrack=0x2F,SetTempo=0x51,SMPTEFormatSpec=0x54,TimeSignature=0x58, KeySignature=0x59,SequencerSpecificMetaEvent=0x7F}; MidiTrack(MemFile &midiFile); ~MidiTrack(); WORD writeHeader(void); WORD readHeader(void); WORD rewind(void); void setDeltaTime(DWORD eventTime); WORD writeMetaEvent(MetaEventType metaEventType,void *lpData,BYTE lengthData); WORD writeMidiChannelMessage(MidiChannelMsg midiChannelMessage,BYTE channel,void *lpData,BYTE lengthData); WORD writeEndTrack(void); DWORD length(void)const; void setLocation(MemFile &midiFile); private: enum {TrackIDLen=4}; void length(DWORD lengthData); WORD flushTrack(void); WORD writeTimeValue(DWORD longValue); char mTrack[TrackIDLen]; DWORD mLengthData; DWORD mDeltaTime; DWORD mHeaderPosition; DWORD mByteCount; MemFile &mMidiFile; }; inline MidiTrack::MidiTrack(MemFile &midiFile) : mLengthData(0), mDeltaTime(0), mHeaderPosition(0L), mMidiFile(midiFile), mByteCount(0) { ::memcpy(mTrack,"MTrk",sizeof(mTrack)); } inline MidiTrack::~MidiTrack() { } inline void MidiTrack::setDeltaTime(DWORD eventTime) { mDeltaTime=eventTime; } inline DWORD MidiTrack::length(void)const { return mLengthData; } inline void MidiTrack::length(DWORD lengthData) { mLengthData=lengthData; } inline WORD MidiTrack::rewind(void) { if(!mMidiFile.seek(mHeaderPosition,MemFile::SeekBeginning))return FALSE; return TRUE; } inline void MidiTrack::setLocation(MemFile &midiFile) { mLengthData=mDeltaTime=mByteCount=0; mHeaderPosition=midiFile.tell(); } #endif