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
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