aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/adlmidi_midiplay.cpp13
-rw-r--r--src/adlmidi_private.hpp12
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()
{