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