Recent Changes
What's new in 2.6.0?
- A lookahead limiter has been added, see
synth.limiter.activeand other related limiter settings - Support for 24bit and 32bit audio has been added, see
fluid_synth_write_s24()andfluid_synth_write_s32() - Added
fluid_voice_set_callback()for voice lifecycle notifications FLUID_INTERP_7THORDERwas deprecated. Since its value aliased withFLUID_INTERP_HIGHESTboth now indicate the highest interpolation fluidsynth can achieve, which is also the slowest. Much slower than in previous versions. For faster sinc interpolations, pls. refer to the newly added valuesFLUID_INTERP_MIDandFLUID_INTERP_HIGH
What's new in 2.5.4?
- By default, fluidsynth now auto selects the TCP port for the shell server, see
shell.port
What's new in 2.5.0?
FLUID_MOD_SINis now deprecated, use the newly addedfluid_mod_set_custom_mapping()- A new mode for the custom IIR filter has been added:
FLUID_IIR_BEANLAND fluid_mod_get_transform()now receives aconstargumentfluid_version_str()now returns aconstchar array- An API for manipulating
fluid_sfont_tspecific default modulators has been added:fluid_sfont_get_default_mod()andfluid_sfont_set_default_mod() - Support for specifying a synth-wide mode to interpret portamento time has been added, see
fluid_portamento_time_mode,fluid_synth_get_portamento_time_mode(),fluid_synth_set_portamento_time_mode()and settingsynth.portamento-time - In all previous versions of fluidsynth, the synth's API mutex was unlocked too early when calls to
fluid_synth_unset_program()andfluid_synth_alloc_voice()had been made; this race condition has been fixed
What's new in 2.4.5?
- In order to use the sdl3 audio driver, the downstream application is responsible for calling
SDL_Init()andSDL_Quit(), just like it was practice for the sdl2 audio driver. Fluidsynth may raise a warning if this isn't done, see Creating the audio driver
What's new in 2.4.3?
synth.note-cuthas been introduced
What's new in 2.4.0?
synth.device-idnow has a default value of 16- Default values of reverb and chorus settings have been tuned
fluid_mod_get_transform()andfluid_mod_set_transform()for SoundFont 2.04 compliant modulators
What's new in 2.3.2?
fluid_player_get_division()has been added
What's new in 2.2.7?
- Most getter functions of the MIDI event API are now const correct
fluid_event_from_midi_event()has been added
What's new in 2.2.0?
fluid_file_callbacks_tnow useslong longas file-offset type (seefluid_long_long_t).This is a breaking change, which allows to load SoundFonts bigger than 2GiB on Windows. This change required to bump fluidsynth's SOVERSION.- various fluid_event_*() functions that received a "value" argument of type
shortnow receive anintargument in preparation for MIDI 2.0 support - fluid_event_any_control_change() has been removed
-
the sequencer has received a major revisal. For you that means:
- the sequencer's queue no longer blocks the synthesizer thread, due to being busy arranging its events internally.
- events that share the same tick was given a new, documented order, see
fluid_sequencer_send_at(). - the sequencer's scale can now be used for arbitrary tempo changes. Previously, the scale of the sequencer was limited to 1000. The only limitation now is >0.
- there is now a dedicated event type for changing the sequencer's time scale, see
fluid_event_scale().
-
the dynamic-sample-loader has learned support to pin samples, see
fluid_synth_pin_preset()andfluid_synth_unpin_preset() - added getter and setter functions for individual effect groups
- support for UTF-8 filenames under Windows, see
fluid_synth_sfload() - MIDI Tempo of the fluid_player can now be overridden, see
fluid_player_set_tempo() - a per-tick callback has been added to the MIDI player, see
fluid_player_set_tick_callback() - WASAPI audio driver is now available on Windows
- the following drivers have gained support for
new_fluid_audio_driver2():- DSound
- WaveOut
- WASAPI
What's new in 2.1.7?
- a regression introduced in 2.1.0 prevented chorus from being audible when
fluid_synth_process()was used
What's new in 2.1.4?
- a regression introduced in 2.1.3 broke
fluid_synth_start()for DLS presets
What's new in 2.1.1?
- requirements for explicit sequencer client unregistering have been relaxed:
delete_fluid_sequencer()now correctly frees any registered sequencer clients (clients can still be explicitly unregistered) - using the sequencer with the system timer as timing source has been deprecated
What's new in 2.1.0?
- refrain from using
fluid_synth_set_sample_rate() synth.sample-rateis no real-time setting anymore, see note aboutfluid_synth_set_sample_rate()- new reverb engine
- chorus is now stereophonic
- smallest allowed chorus speed is now 0.1 Hz (previously 0.29 Hz)
- the following audio drivers were added:
- opensles
- oboe
- sdl2
- waveout
What's new in 2.0.8?
fluid_sample_set_sound_data()caused broken sound when copying sample data
What's new in 2.0.7?
fluid_free()has been added to allow proper deallocation by programming languages other than C/C++
What's new in 2.0.6?
- the MIDI player did not emit any audio when calling
fluid_player_play()afterfluid_player_stop()
What's new in 2.0.5?
fluid_synth_process()omitted audio samples when called with arbitrary sample counts that were not a multiple offluid_synth_get_internal_bufsize()fluid_synth_sfunload()was not releasing sample buffers of SoundFont3 files ifsynth.dynamic-sample-loadingwas set to FALSE
What's new in 2.0.3?
- fix incorrect behaviour of
fluid_sample_set_sound_data() - add missing getters for midi events:
What's new in 2.0.2?
fluid_synth_error()has been deprecated, usefluid_set_log_function()to interfere log messages
What's new in 2.0.0?
FluidSynths major version was bumped. The API was reworked, deprecated functions were removed.
Important changes that may not result in a compilation error but may cause your app to misbehave:
- all public
fluid_settings_*functions that return an integer which is not meant to be interpreted as bool consistently return eitherFLUID_OKorFLUID_FAILED fluid_settings_setstr()cannot be used to set integer (toggle) settings with "yes" or "no" values anymore. Usefluid_settings_setint()instead, for example:fluid_settings_setint(settings, "synth.reverb.active", 0)instead offluid_settings_setstr(settings, "synth.reverb.active", "no")- explicit client unregistering is required for
fluid_sequencer_register_client()andfluid_sequencer_register_fluidsynth()(since fluidsynth 2.1.1 not required anymore, but still recommend) - all public functions consistently receive signed integers for soundfont ids, bank and program numbers
- use unique device names for the
audio.portaudio.devicesetting fluid_synth_process()received a new more flexible implementation, but now requires zeroed-out sample buffers
Other changes in FluidSynth 2.0.0 concerning developers:
- all public
delete_*functions return void and are safe when called with NULL - the shell command handler was decoupled internally, as a consequence the param list of
new_fluid_server()andnew_fluid_cmd_handler()was adapted fluid_settings_set*functions no longer silently register unknown settings but return an error instead- reverb: roomsize is now limited to an upper threshold of 1.0 to avoid exponential volume increase
- rename
fluid_mod_new()andfluid_mod_delete()to match naming conventions:new_fluid_mod()anddelete_fluid_mod() - rename chorus getters to match naming conventions:
fluid_synth_get_chorus_speed()andfluid_synth_get_chorus_depth() fluid_synth_remove_sfont()returnsFLUID_OKorFLUID_FAILED- introduce a separate data type for sequencer client IDs:
fluid_seq_id_t fluid_get_userconf()has been implemented for Windows
New Features and API additions:
- add
midi.autoconnecta setting for automatically connecting fluidsynth to available MIDI input ports - add
synth.overflow.importantandsynth.overflow.important-channelssettings to take midi channels during overflow calculation into account that are considered to be "important" - add
synth.dynamic-sample-loadinga setting for enabling on demand sample loading - add support for polyphonic key pressure events, see
fluid_event_key_pressure()andfluid_synth_key_pressure() - add
fluid_synth_add_default_mod()andfluid_synth_remove_default_mod()for manipulating default modulators - add individual reverb setters:
fluid_synth_set_reverb_roomsize(),fluid_synth_set_reverb_damp(),fluid_synth_set_reverb_width(),fluid_synth_set_reverb_level() - add individual chorus setters:
fluid_synth_set_chorus_nr(),fluid_synth_set_chorus_level(),fluid_synth_set_chorus_speed(),fluid_synth_set_chorus_depth(),fluid_synth_set_chorus_type() - add realtime settings for
synth.reverb.dampandsynth.chorus.depthparameters - add seek support to midi-player, see
fluid_player_seek() - expose functions to manipulate the ladspa effects unit (see ladspa.h)
- add support for text and lyrics midi events, see
fluid_midi_event_set_lyrics()andfluid_midi_event_set_text() -
complete rewrite of the soundfont loader API, settingsee sfont.h
- support for 24 bit audio samples, see
fluid_sample_set_sound_data() - expose
new_fluid_defsfloader()to support loading soundfonts from memory, seefluid_sfloader_set_callbacks()and fluidsynth_sfload_mem.c - remove these structs from the public API and provide proper getter and setter functions instead:
- struct _fluid_sfloader_t
- struct _fluid_sample_t
- struct _fluid_sfont_t
- struct _fluid_preset_t
- support for 24 bit audio samples, see
-
add an additional general-purpose IIR filter, see
fluid_synth_set_custom_filter() - add a custom sinusoidal modulator mapping function, see
FLUID_MOD_SIN - implement polymono support according to MIDI specs:
- add basic channel support, see
fluid_synth_reset_basic_channel(),fluid_synth_set_basic_channel(),fluid_synth_get_basic_channel() - implement MIDI modes Omni On, Omni Off, Poly, Mono, see
fluid_basic_channel_modes - implement portamento control, see
fluid_synth_set_portamento_mode(),fluid_synth_get_portamento_mode() - implement legato control, see
fluid_synth_set_legato_mode(),fluid_synth_get_legato_mode() - implement breath control, see
fluid_synth_set_breath_mode(),fluid_synth_get_breath_mode()
- add basic channel support, see
API cleanups:
- the ramsfont has been removed, because it is unmaintained and believed to be unused; please get in touch with the mailing list if you still need it
- remove deprecated fluid_synth_get_channel_info() in favour of
fluid_synth_get_program()andfluid_synth_get_channel_preset() - remove deprecated fluid_settings_getstr()
- remove deprecated fluid_synth_set_midi_router(), instead supply the midi-router instance when creating a command handler with
new_fluid_cmd_handler() - remove deprecated fluid_get_hinstance() and fluid_set_hinstance() (dsound driver now uses the desktop window)
- remove deprecated fluid_synth_create_key_tuning(), use fluid_synth_activate_key_tuning(synth, bank, prog, name, pitch, FALSE) instead
- remove deprecated fluid_synth_create_octave_tuning(), use fluid_synth_activate_octave_tuning(synth, bank, prog, name, pitch, FALSE) instead
- remove deprecated fluid_synth_select_tuning(), use fluid_synth_activate_tuning(synth, chan, bank, prog, FALSE) instead
- remove deprecated fluid_synth_reset_tuning(), use fluid_synth_deactivate_tuning(synth, chan, FALSE) instead
- remove deprecated FLUID_HINT_INTEGER
- remove deprecated fluid_synth_set_gen2() as there doesn't seem to be a use case for absolute generator values
- remove deprecated "synth.parallel-render" setting
- remove obsolete "audio.[out|in]put-channels" settings
- remove unimplemented "synth.dump" setting
- remove fluid_cmd_handler_register() and fluid_cmd_handler_unregister() from public API, as they seem to be unused downstream
- remove misspelled FLUID_SEQ_PITCHWHHELSENS macro
- remove struct _fluid_mod_t from public API, use the getters and setters of mod.h instead
- remove struct _fluid_gen_t, fluid_gen_set_default_values() and enum fluid_gen_flags from public API
- remove macros
fluid_sfont_get_id()and fluid_sample_refcount() from public API - remove FLUID_NUM_MOD macro from public API
- remove the following deprecated enum values from public API:
- GEN_LAST
- LAST_LOG_LEVEL
- FLUID_SEQ_LASTEVENT
- FLUID_MIDI_ROUTER_RULE_COUNT