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

206 lines
7.0 KiB
C++

#include <iostream.h>
#include <midiwrt/muscnv.hpp>
#include <midiwrt/midiptch.hpp>
MUSConverter::MUSConverter(String midiPathFileName,String musPathFileName)
: MUSFile(musPathFileName), mMidiData(midiPathFileName),
mNumTracks(0), mMidiTrack((MemFile&)mMidiData)
{
}
MUSConverter::~MUSConverter()
{
}
WORD MUSConverter::convertFile(void)
{
if(!isOkay())return FALSE;
if(!writeInfoTrack())return FALSE;
if(!readMUSFile())return FALSE;
if(!updateTrackInfo())return FALSE;
return TRUE;
}
WORD MUSConverter::updateTrackInfo(void)
{
if(!mNumTracks)return FALSE;
mMidiHeader.tracks(mNumTracks);
if(!mMidiData.writeHeader(mMidiHeader))return FALSE;
if(!mMidiData.flush())return FALSE;
return TRUE;
}
WORD MUSConverter::writeInfoTrack(void)
{
String copyRightNotice("(c) Copyright 1995 Sean M. Kessler.");
String textEventOne("WINMUS v1.00 Beta.");
char timeSignature[]={0x04,0x02,0x60,0x08};
char setTempo[]={0x09,0xA3,0x1A};
if(!mMidiData.isOkay()||!MUSFile::isOkay())return FALSE;
if(!mMidiData.writeHeader(mMidiHeader))return FALSE;
mMidiTrack.setLocation((MemFile&)mMidiData);
if(!mMidiTrack.writeHeader())return FALSE;
if(!mMidiTrack.writeMetaEvent(MidiTrack::TimeSignature,(void*)timeSignature,sizeof(timeSignature)))return FALSE;
mMidiTrack.setDeltaTime(0);
if(!mMidiTrack.writeMetaEvent(MidiTrack::SetTempo,(void*)setTempo,sizeof(setTempo)))return FALSE;
mMidiTrack.setDeltaTime(0);
if(!mMidiTrack.writeMetaEvent(MidiTrack::CopyrightNotice,(void*)(LPSTR)copyRightNotice,copyRightNotice.length()))return FALSE;
mMidiTrack.setDeltaTime(0);
if(!mMidiTrack.writeMetaEvent(MidiTrack::TextEvent,(void*)(LPSTR)textEventOne,textEventOne.length()))return FALSE;
mMidiTrack.setDeltaTime(0);
if(!mMidiTrack.writeEndTrack())return FALSE;
mNumTracks++;
return TRUE;
}
WORD MUSConverter::handleScoreStart(void)
{
mMidiTrack.setLocation((MemFile&)mMidiData);
if(!mMidiTrack.writeHeader())return FALSE;
mDeltaTime.resetTime();
return TRUE;
}
WORD MUSConverter::handleReleaseNote(PureEvent &pureEvent,PureDelay &pureDelay,PureNote &releaseNote,BYTE trackNumber)
{
fixChannel(pureEvent,trackNumber);
mDeltaTime+=pureDelay.deltaTicks();
mMidiTrack.setDeltaTime(mDeltaTime.deltaTime());
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDINoteOff,pureEvent.channel(),(void*)&releaseNote,PureNote::DataLength);
return FALSE;
}
WORD MUSConverter::handlePlayNote(PureEvent &pureEvent,PureDelay &pureDelay,PureNote &playNote,BYTE trackNumber)
{
fixChannel(pureEvent,trackNumber);
mDeltaTime+=pureDelay.deltaTicks();
mMidiTrack.setDeltaTime(mDeltaTime.deltaTime());
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDINoteOn,pureEvent.channel(),(void*)&playNote,PureNote::DataLength);
return FALSE;
}
WORD MUSConverter::handlePitchBend(PureEvent &pureEvent,PureDelay &pureDelay,BYTE pitchBenderValue,BYTE trackNumber)
{
fixChannel(pureEvent,trackNumber);
MidiPitchBend midiPitchBend(pitchBenderValue);
mDeltaTime+=pureDelay.deltaTicks();
mMidiTrack.setDeltaTime(mDeltaTime.deltaTime());
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIPitchBend,pureEvent.channel(),(BYTE*)midiPitchBend,MidiPitchBend::PitchBendDataLength);
return FALSE;
}
WORD MUSConverter::handleReset(PureEvent &pureEvent,PureDelay &pureDelay,BYTE tempoValue,BYTE trackNumber)
{
BYTE resetData[2];
fixChannel(pureEvent,trackNumber);
mDeltaTime+=pureDelay.deltaTicks();
mMidiTrack.setDeltaTime(mDeltaTime.deltaTime());
resetData[1]=0;
switch(tempoValue)
{
case 0x0A :
resetData[0]=0x78;
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIParameter,pureEvent.channel(),resetData,sizeof(resetData));
break;
case 0x0B :
resetData[0]=0x7B;
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIParameter,pureEvent.channel(),resetData,sizeof(resetData));
break;
case 0x0C :
resetData[0]=0x7E;
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIParameter,pureEvent.channel(),resetData,sizeof(resetData));
break;
case 0x0D :
resetData[0]=0x7F;
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIParameter,pureEvent.channel(),resetData,sizeof(resetData));
break;
case 0x0E :
resetData[0]=0x79;
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIParameter,pureEvent.channel(),resetData,sizeof(resetData));
break;
default :
resetData[0]=0;
mMidiTrack.writeMidiChannelMessage(MidiTrack::MIDIParameter,pureEvent.channel(),resetData,1);
break;
}
return TRUE;
}
WORD MUSConverter::handleController(PureEvent &pureEvent,PureDelay &pureDelay,PureController &pureController,BYTE trackNumber)
{
MidiTrack::MidiChannelMsg midiChannelMessage;
BYTE midiData[2];
fixChannel(pureEvent,trackNumber);
mDeltaTime+=pureDelay.deltaTicks();
mMidiTrack.setDeltaTime(mDeltaTime.deltaTime());
if(0==pureController.controllerNumber())midiChannelMessage=MidiTrack::MIDIProgram;
else midiChannelMessage=MidiTrack::MIDIParameter;
switch(pureController.controllerNumber())
{
case 0x00 :
midiData[0]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,1);
break;
case 0x01 :
midiData[0]=0x00;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x02 :
midiData[0]=0x01;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x03 :
midiData[0]=0x07;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x04 :
midiData[0]=0x0A;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x05 :
midiData[0]=0x0B;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x06 :
midiData[0]=0x5B;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x07 :
midiData[0]=0x5D;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x08 :
midiData[0]=0x40;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
case 0x09 :
midiData[0]=0x43;
midiData[1]=pureController.controllerValue();
mMidiTrack.writeMidiChannelMessage(midiChannelMessage,pureEvent.channel(),midiData,sizeof(midiData));
break;
}
return TRUE;
}
WORD MUSConverter::handleScoreEnd(PureDelay &pureDelay)
{
if(!mMidiTrack.length()){mMidiTrack.rewind();return TRUE;}
mDeltaTime+=pureDelay.deltaTicks();
mMidiTrack.setDeltaTime(mDeltaTime.deltaTime());
mMidiTrack.writeEndTrack();
mNumTracks++;
return TRUE;
}