206 lines
7.0 KiB
C++
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;
|
|
}
|
|
|