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

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;
}