diff options
-rw-r--r-- | src/adlmidi_midiplay.cpp | 8 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 10 |
2 files changed, 16 insertions, 2 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 39d7bff..e7489b1 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -2358,8 +2358,14 @@ void MIDIplay::SetRPN(unsigned MidCh, unsigned value, bool MSB) switch(addr + nrpn * 0x10000 + MSB * 0x20000) { case 0x0000 + 0*0x10000 + 1*0x20000: // Pitch-bender sensitivity - Ch[MidCh].bendsense = value / 8192.0; + { + if (MSB) + Ch[MidCh].bendsense_msb = value; + else + Ch[MidCh].bendsense_lsb = value; + Ch[MidCh].updateBendSensitivity(); break; + } case 0x0108 + 1*0x10000 + 1*0x20000: // Vibrato speed if(value == 64) Ch[MidCh].vibspeed = 1.0; else if(value < 100) Ch[MidCh].vibspeed = 1.0 / (1.6e-2 * (value ? value : 1)); diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 9fd6f97..5ac6ebc 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -599,6 +599,7 @@ public: uint8_t panning, vibrato, sustain; char ____padding[6]; double bend, bendsense; + int bendsense_lsb, bendsense_msb; double vibpos, vibspeed, vibdepth; int64_t vibdelay; uint8_t lastlrpn, lastmrpn; @@ -791,7 +792,9 @@ public: void resetAllControllers() { bend = 0.0; - bendsense = 2 / 8192.0; + bendsense_msb = 2; + bendsense_lsb = 0; + updateBendSensitivity(); volume = 100; expression = 127; sustain = 0; @@ -803,6 +806,11 @@ public: portamento = 0; brightness = 127; } + void updateBendSensitivity() + { + int cent = bendsense_msb * 100 + bendsense_lsb; + bendsense = cent * (0.01 / 8192.0); + } MIDIchannel() { activenotes_clear(); |