LTC-file reader: offset frame position (not timecode)
[ardour.git] / libs / ardour / fluid_synth.cc
index 30d70bb876c5653f2443effc18d891fe8806689a..45653a9e7046ca813c136c93428014edc4efe05f 100644 (file)
@@ -60,44 +60,44 @@ FluidSynth::~FluidSynth ()
 bool
 FluidSynth::load_sf2 (const std::string& fn)
 {
-        _synth_id = fluid_synth_sfload (_synth, fn.c_str (), 1);
-        if (_synth_id == FLUID_FAILED) {
-                return false;
-        }
-
-        fluid_sfont_t* const sfont = fluid_synth_get_sfont_by_id (_synth, _synth_id);
-        if (!sfont) {
-                return false;
-        }
-
-        size_t count;
-        fluid_preset_t preset;
-
-        sfont->iteration_start (sfont);
-        for (count = 0; sfont->iteration_next (sfont, &preset) != 0; ++count) {
-                if (count < 16) {
-                        fluid_synth_program_select (_synth, count, _synth_id, preset.get_banknum (&preset), preset.get_num (&preset));
-                }
-                _presets.push_back (BankProgram (
-                                        preset.get_name (&preset),
-                                        preset.get_banknum (&preset),
-                                        preset.get_num (&preset)));
-        }
-
-        if (count == 0) {
-                return false;
-        }
-
-        /* boostrap synth engine. The first call re-initializes the choruscw
-               * (fluid_rvoice_mixer_set_samplerate) which is not rt-safe.
-               */
-        float l[1024];
-        float r[1024];
-        fluid_synth_all_notes_off (self->synth, -1);
-        fluid_synth_all_sounds_off (self->synth, -1);
-        fluid_synth_write_float (self->synth, 1024, l, 0, 1, r, 0, 1);
-
-        return true;
+       _synth_id = fluid_synth_sfload (_synth, fn.c_str (), 1);
+       if (_synth_id == FLUID_FAILED) {
+               return false;
+       }
+
+       fluid_sfont_t* const sfont = fluid_synth_get_sfont_by_id (_synth, _synth_id);
+       if (!sfont) {
+               return false;
+       }
+
+       size_t count;
+       fluid_preset_t preset;
+
+       sfont->iteration_start (sfont);
+       for (count = 0; sfont->iteration_next (sfont, &preset) != 0; ++count) {
+               if (count < 16) {
+                       fluid_synth_program_select (_synth, count, _synth_id, preset.get_banknum (&preset), preset.get_num (&preset));
+               }
+               _presets.push_back (BankProgram (
+                                       preset.get_name (&preset),
+                                       preset.get_banknum (&preset),
+                                       preset.get_num (&preset)));
+       }
+
+       if (count == 0) {
+               return false;
+       }
+
+       /* boostrap synth engine. The first call re-initializes the chorus
+        * (fluid_rvoice_mixer_set_samplerate) which is not rt-safe.
+        */
+       float l[1024];
+       float r[1024];
+       fluid_synth_all_notes_off (_synth, -1);
+       fluid_synth_all_sounds_off (_synth, -1);
+       fluid_synth_write_float (_synth, 1024, l, 0, 1, r, 0, 1);
+
+       return true;
 }
 
 bool
@@ -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);
 }