properly handle FS pitch-bend - closes #7140
authorRobin Gareus <robin@gareus.org>
Mon, 28 Nov 2016 11:53:20 +0000 (12:53 +0100)
committerRobin Gareus <robin@gareus.org>
Mon, 28 Nov 2016 11:53:20 +0000 (12:53 +0100)
libs/ardour/fluid_synth.cc
libs/plugins/a-fluidsynth.lv2/a-fluidsynth.c

index 333738766a642e067cff52b7ccc134a82909f3ca..45653a9e7046ca813c136c93428014edc4efe05f 100644 (file)
@@ -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);
 }
index 4fc53a6d22894af65b198002f0f2a7062eeeacd0..9a83a029a79a63ca99a72a3991fd1d7f297667eb 100644 (file)
@@ -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);
                }
        }