summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-11-28 12:53:20 +0100
committerRobin Gareus <robin@gareus.org>2016-11-28 12:53:20 +0100
commit7b687d08a19a74af3b84ec310150be7576c9ee9d (patch)
treee5682054351f26339c45dde4bd00d48981cfdb38
parentbf15e93cdedd7a2fb1342183d7977afe97b7bcdb (diff)
properly handle FS pitch-bend - closes #7140
-rw-r--r--libs/ardour/fluid_synth.cc7
-rw-r--r--libs/plugins/a-fluidsynth.lv2/a-fluidsynth.c8
2 files changed, 13 insertions, 2 deletions
diff --git a/libs/ardour/fluid_synth.cc b/libs/ardour/fluid_synth.cc
index 333738766a..45653a9e70 100644
--- a/libs/ardour/fluid_synth.cc
+++ b/libs/ardour/fluid_synth.cc
@@ -135,7 +135,12 @@ FluidSynth::midi_event (uint8_t const* const data, size_t len)
fluid_midi_event_set_key (_f_midi_event, data[1]);
}
if (len > 2) {
- fluid_midi_event_set_value (_f_midi_event, data[2]);
+ if (0xe0 /*PITCH_BEND*/ == fluid_midi_event_get_type (_f_midi_event)) {
+ fluid_midi_event_set_value (_f_midi_event, 0);
+ fluid_midi_event_set_pitch (_f_midi_event, ((data[2] & 0x7f) << 7) | (data[1] & 0x7f));
+ } else {
+ fluid_midi_event_set_value (_f_midi_event, data[2]);
+ }
}
return FLUID_OK == fluid_synth_handle_midi_event (_synth, _f_midi_event);
}
diff --git a/libs/plugins/a-fluidsynth.lv2/a-fluidsynth.c b/libs/plugins/a-fluidsynth.lv2/a-fluidsynth.c
index 4fc53a6d22..9a83a029a7 100644
--- a/libs/plugins/a-fluidsynth.lv2/a-fluidsynth.c
+++ b/libs/plugins/a-fluidsynth.lv2/a-fluidsynth.c
@@ -446,8 +446,14 @@ run (LV2_Handle instance, uint32_t n_samples)
fluid_midi_event_set_key (self->fmidi_event, data[1]);
}
if (ev->body.size > 2) {
- fluid_midi_event_set_value (self->fmidi_event, data[2]);
+ if (0xe0 /*PITCH_BEND*/ == fluid_midi_event_get_type (self->fmidi_event)) {
+ fluid_midi_event_set_value (self->fmidi_event, 0);
+ fluid_midi_event_set_pitch (self->fmidi_event, ((data[2] & 0x7f) << 7) | (data[1] & 0x7f));
+ } else {
+ fluid_midi_event_set_value (self->fmidi_event, data[2]);
+ }
}
+
fluid_synth_handle_midi_event (self->synth, self->fmidi_event);
}
}