Initial
This commit is contained in:
87
midiwrt/MIDITRCK.HPP
Normal file
87
midiwrt/MIDITRCK.HPP
Normal file
@@ -0,0 +1,87 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user