diff options
-rw-r--r-- | src/adlmidi_midiplay.cpp | 13 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 12 |
2 files changed, 10 insertions, 15 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 2413f39..d7155f4 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -1400,16 +1400,14 @@ void MIDIplay::realTime_PatchChange(uint8_t channel, uint8_t patch) void MIDIplay::realTime_PitchBend(uint8_t channel, uint16_t pitch) { channel = channel % 16; - Ch[channel].bendSrc = (int(pitch) - 8192); - Ch[channel].bend = Ch[channel].bendSrc * Ch[channel].bendsense; + Ch[channel].bend = int(pitch) - 8192; NoteUpdate_All(channel, Upd_Pitch); } void MIDIplay::realTime_PitchBend(uint8_t channel, uint8_t msb, uint8_t lsb) { channel = channel % 16; - Ch[channel].bendSrc = (int(lsb) + int(msb) * 128 - 8192); - Ch[channel].bend = Ch[channel].bendSrc * Ch[channel].bendsense; + Ch[channel].bend = int(lsb) + int(msb) * 128 - 8192; NoteUpdate_All(channel, Upd_Pitch); } @@ -1625,7 +1623,8 @@ void MIDIplay::NoteUpdate(uint16_t MidCh, // Don't bend a sustained note if(!d || !d->sustained) { - double bend = Ch[MidCh].bend + ins.ains.finetune; + double midibend = Ch[MidCh].bend * Ch[MidCh].bendsense; + double bend = midibend + ins.ains.finetune; double phase = 0.0; uint8_t vibrato = std::max(Ch[MidCh].vibrato, Ch[MidCh].aftertouch); vibrato = std::max(vibrato, i->vibrato); @@ -1646,7 +1645,7 @@ void MIDIplay::NoteUpdate(uint16_t MidCh, opl.NoteOn(c, BEND_COEFFICIENT * std::exp(0.057762265 * (static_cast<double>(tone) + bend + phase))); #undef BEND_COEFFICIENT if(hooks.onNote) - hooks.onNote(hooks.onNote_userData, c, tone, midiins, vol, Ch[MidCh].bend); + hooks.onNote(hooks.onNote_userData, c, tone, midiins, vol, midibend); } } } @@ -2390,12 +2389,10 @@ void MIDIplay::SetRPN(unsigned MidCh, unsigned value, bool MSB) case 0x0000 + 0*0x10000 + 1*0x20000: // Pitch-bender sensitivity Ch[MidCh].bendsense_msb = value; Ch[MidCh].updateBendSensitivity(); - NoteUpdate_All(MidCh, Upd_Pitch); break; case 0x0000 + 0*0x10000 + 0*0x20000: // Pitch-bender sensitivity LSB Ch[MidCh].bendsense_lsb = value; Ch[MidCh].updateBendSensitivity(); - NoteUpdate_All(MidCh, Upd_Pitch); break; case 0x0108 + 1*0x10000 + 1*0x20000: // Vibrato speed if(value == 64) Ch[MidCh].vibspeed = 1.0; diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index c720fc2..3aaeaf0 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -504,8 +504,8 @@ public: //! Is note aftertouch has any non-zero value bool noteAfterTouchInUse; char ____padding[6]; - double bendSrc; - double bend, bendsense; + int bend; + double bendsense; int bendsense_lsb, bendsense_msb; double vibpos, vibspeed, vibdepth; int64_t vibdelay; @@ -699,8 +699,7 @@ public: } void resetAllControllers() { - bendSrc = 0.0; - bend = 0.0; + bend = 0; bendsense_msb = 2; bendsense_lsb = 0; updateBendSensitivity(); @@ -724,9 +723,8 @@ public: } void updateBendSensitivity() { - int cent = bendsense_msb + static_cast<int>(static_cast<double>(bendsense_lsb) * (1.0 / 128.0)); - bendsense = static_cast<double>(cent) / 8192.0; - bend = bendSrc * bendsense; + int cent = bendsense_msb * 128 + bendsense_lsb; + bendsense = cent * (1.0 / (128 * 8192)); } MIDIchannel() { |