88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
#ifndef _MIDITRACK_HPP_
|
|
#define _MIDITRACK_HPP_
|
|
#include <stdio.h>
|
|
#include <common/windows.hpp>
|
|
#include <common/memfile.hpp>
|
|
#include <midiwrt/midihdr.hpp>
|
|
|
|
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
|