Initial
This commit is contained in:
205
midiwrt/MUSCNV.CPP
Normal file
205
midiwrt/MUSCNV.CPP
Normal file
@@ -0,0 +1,205 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user