Files
Work/midiwrt/MIDITRCK.HPP
2024-08-07 09:16:27 -04:00

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