|
From: Jerome F. <kin...@us...> - 2009-06-11 13:03:48
|
Update of /cvsroot/munt/mt32emu/src In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv16414/src Modified Files: part.h synth.cpp part.cpp Log Message: - Implemented MIDI data entry/RPN handling (used for setting pitch bend range). - Improved sysex reset - now more closely matches the behaviour documented by Mok. Index: synth.cpp =================================================================== RCS file: /cvsroot/munt/mt32emu/src/synth.cpp,v retrieving revision 1.62 retrieving revision 1.63 diff -C2 -d -r1.62 -r1.63 *** synth.cpp 7 Jun 2009 18:32:20 -0000 1.62 --- synth.cpp 11 Jun 2009 13:03:39 -0000 1.63 *************** *** 630,635 **** break; case 0x06: ! // FIXME: This really needs to be implemented (it's supported, at least on the LAPC-I, for bender range setting) ! printDebug("MIDI data entry unimplemented. Note=0x%02x, Velo=0x%02x", note, velocity); break; case 0x07: // Set volume --- 630,634 ---- break; case 0x06: ! parts[part]->setDataEntryMSB(velocity); break; case 0x07: // Set volume *************** *** 647,660 **** case 0x40: // Hold (sustain) pedal //printDebug("Hold pedal set: %d", velocity); ! parts[part]->setHoldPedal(velocity>=64); break; case 0x79: // Reset all controllers //printDebug("Reset all controllers"); ! // CONFIRMED:Mok: A real LAPC-I responds to this controller as follows: ! parts[part]->setHoldPedal(false); ! parts[part]->setModulation(0); ! parts[part]->setExpression(127); ! parts[part]->setBend(0x2000); break; --- 646,666 ---- case 0x40: // Hold (sustain) pedal //printDebug("Hold pedal set: %d", velocity); ! parts[part]->setHoldPedal(velocity >= 64); ! break; ! ! case 0x62: ! case 0x63: ! parts[part]->setNRPN(); ! break; ! case 0x64: ! parts[part]->setRPNLSB(velocity); ! break; ! case 0x65: ! parts[part]->setRPNMSB(velocity); break; case 0x79: // Reset all controllers //printDebug("Reset all controllers"); ! parts[part]->resetAllControllers(); break; *************** *** 1100,1104 **** mt32ram = mt32default; for (int i = 0; i < 9; i++) { ! parts[i]->refresh(); } refreshSystem(); --- 1106,1115 ---- mt32ram = mt32default; for (int i = 0; i < 9; i++) { ! parts[i]->reset(); ! if (i != 8) { ! parts[i]->setProgram(controlROMData[controlROMMap->programSettings + i]); ! } else { ! parts[8]->refresh(); ! } } refreshSystem(); Index: part.cpp =================================================================== RCS file: /cvsroot/munt/mt32emu/src/part.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** part.cpp 24 May 2009 15:36:00 -0000 1.42 --- part.cpp 11 Jun 2009 13:03:39 -0000 1.43 *************** *** 78,87 **** } ! void Part::setHoldPedal(bool pedalval) { ! if (holdpedal && !pedalval) { holdpedal = false; stopPedalHold(); } else { ! holdpedal = pedalval; } } --- 78,116 ---- } ! void Part::setDataEntryMSB(unsigned char midiDataEntryMSB) { ! if (nrpn) { ! // The last RPN-related control change was for an NRPN, ! // which the real synths don't support. ! return; ! } ! if (rpn != 0) { ! // The RPN has been set to something other than 0, ! // which is the only RPN that these synths support ! return; ! } ! patchTemp->patch.benderRange = midiDataEntryMSB > 24 ? 24 : midiDataEntryMSB; ! updatePitchBenderRange(); ! } ! ! void Part::setNRPN() { ! nrpn = true; ! } ! ! void Part::setRPNLSB(unsigned char midiRPNLSB) { ! nrpn = false; ! rpn = (rpn & 0xFF00) | midiRPNLSB; ! } ! ! void Part::setRPNMSB(unsigned char midiRPNMSB) { ! nrpn = false; ! rpn = (rpn & 0x00FF) | (midiRPNMSB << 8); ! } ! ! void Part::setHoldPedal(bool pressed) { ! if (holdpedal && !pressed) { holdpedal = false; stopPedalHold(); } else { ! holdpedal = pressed; } } *************** *** 104,107 **** --- 133,149 ---- } + void Part::resetAllControllers() { + modulation = 0; + expression = 100; + pitchBend = 0; + setHoldPedal(false); + } + + void Part::reset() { + resetAllControllers(); + allSoundOff(); + rpn = 0xFFFF; + } + void RhythmPart::refresh() { // (Re-)cache all the mapped timbres ahead of time *************** *** 196,211 **** } - void Part::updatePitchBenderRange() { - pitchBenderRange = patchTemp->patch.benderRange * 683; - } - void Part::setProgram(unsigned int patchNum) { setPatch(&synth->mt32ram.patches[patchNum]); updatePitchBenderRange(); setTimbre(&synth->mt32ram.timbres[getAbsTimbreNum()].timbre); - refresh(); ! allSoundOff(); //FIXME:KG: Is this correct? } --- 238,251 ---- } void Part::setProgram(unsigned int patchNum) { setPatch(&synth->mt32ram.patches[patchNum]); updatePitchBenderRange(); + allSoundOff(); setTimbre(&synth->mt32ram.timbres[getAbsTimbreNum()].timbre); refresh(); + } ! void Part::updatePitchBenderRange() { ! pitchBenderRange = patchTemp->patch.benderRange * 683; } Index: part.h =================================================================== RCS file: /cvsroot/munt/mt32emu/src/part.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** part.h 24 May 2009 15:36:00 -0000 1.23 --- part.h 11 Jun 2009 13:03:39 -0000 1.24 *************** *** 56,59 **** --- 56,61 ---- Bit8u expression; Bit32s pitchBend; + bool nrpn; + Bit16u rpn; Bit16u pitchBenderRange; // (patchTemp->patch.benderRange * 683) at the time of the last MIDI program change or MIDI data entry. *************** *** 67,70 **** --- 69,78 ---- Part(Synth *synth, unsigned int usePartNum); ~Part(); + void reset(); + void setDataEntryMSB(unsigned char midiDataEntryMSB); + void setNRPN(); + void setRPNLSB(unsigned char midiRPNLSB); + void setRPNMSB(unsigned char midiRPNMSB); + void resetAllControllers(); virtual void noteOn(unsigned int midiKey, unsigned int velocity); virtual void noteOff(unsigned int midiKey); |