101 lines
2.5 KiB
C++
101 lines
2.5 KiB
C++
#include <string.h>
|
|
#include <iostream.h>
|
|
#include <iomanip.h>
|
|
#include <assert.h>
|
|
#include <midiwrt/miditrck.hpp>
|
|
|
|
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;
|
|
}
|
|
|