/*!

\page RecentChanges Recent Changes
\section NewIn2_6_0 What's new in 2.6.0?
- A lookahead limiter has been added, see \setting{synth_limiter_active} and other related limiter settings
- Support for 24bit and 32bit audio has been added, see fluid_synth_write_s24() and fluid_synth_write_s32()
- Added fluid_voice_set_callback() for voice lifecycle notifications
- #FLUID_INTERP_7THORDER was deprecated. Since its value aliased with #FLUID_INTERP_HIGHEST both 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 values #FLUID_INTERP_MID and #FLUID_INTERP_HIGH

\section NewIn2_5_4 What's new in 2.5.4?
- By default, fluidsynth now auto selects the TCP port for the shell server, see \setting{shell_port}

\section NewIn2_5_0 What's new in 2.5.0?
- #FLUID_MOD_SIN is now deprecated, use the newly added fluid_mod_set_custom_mapping()
- A new mode for the custom IIR filter has been added: #FLUID_IIR_BEANLAND
- fluid_mod_get_transform() now receives a <code>const</code> argument
- fluid_version_str() now returns a <code>const</code> char array
- An API for manipulating fluid_sfont_t specific default modulators has been added: fluid_sfont_get_default_mod() and fluid_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 setting \setting{synth_portamento-time}
- In all previous versions of fluidsynth, the synth's API mutex was unlocked too early when calls to fluid_synth_unset_program() and fluid_synth_alloc_voice() had been made; this race condition has been fixed

\section NewIn2_4_5 What's new in 2.4.5?
- In order to use the sdl3 audio driver, the downstream application is responsible for calling <code>SDL_Init()</code> and <code>SDL_Quit()</code>, just like it was practice for the sdl2 audio driver. Fluidsynth may raise a warning if this isn't done, see \ref CreatingAudioDriver

\section NewIn2_4_3 What's new in 2.4.3?
- \setting{synth_note-cut} has been introduced

\section NewIn2_4_0 What's new in 2.4.0?
- \setting{synth_device-id} now has a default value of 16
- Default values of reverb and chorus settings have been tuned
- fluid_mod_get_transform() and fluid_mod_set_transform() for SoundFont 2.04 compliant modulators

\section NewIn2_3_2 What's new in 2.3.2?

- fluid_player_get_division() has been added


\section NewIn2_2_7 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


\section NewIn2_2_0 What's new in 2.2.0?

- #fluid_file_callbacks_t <span style="color:red">now uses <code>long long</code> as file-offset type (see #fluid_long_long_t).</span><span style="color:red;font-weight:bold">This is a breaking change</span>, which allows to load SoundFonts bigger than 2GiB on Windows. This change required to bump fluidsynth's SOVERSION.
- <span style="color:red">various fluid_event_*() functions that received a "value" argument of type <code>short</code> now receive an <code>int</code> argument</span> 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() and fluid_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


\section NewIn2_1_7 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

\section NewIn2_1_4 What's new in 2.1.4?

- a regression introduced in 2.1.3 broke fluid_synth_start() for DLS presets

\section NewIn2_1_1 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

\section NewIn2_1_0 What's new in 2.1.0?

- <span style="color:red">refrain from using fluid_synth_set_sample_rate()</span>
- \setting{synth_sample-rate} is no real-time setting anymore, see note about fluid_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

\section NewIn2_0_8 What's new in 2.0.8?

- fluid_sample_set_sound_data() caused broken sound when copying sample data

\section NewIn2_0_7 What's new in 2.0.7?

- fluid_free() has been added to allow proper deallocation by programming languages other than C/C++

\section NewIn2_0_6 What's new in 2.0.6?

- the MIDI player did not emit any audio when calling fluid_player_play() after fluid_player_stop()

\section NewIn2_0_5 What's new in 2.0.5?

- fluid_synth_process() omitted audio samples when called with arbitrary sample counts that were not a multiple of fluid_synth_get_internal_bufsize()
- fluid_synth_sfunload() was not releasing sample buffers of SoundFont3 files if \setting{synth_dynamic-sample-loading} was set to FALSE

\section NewIn2_0_3 What's new in 2.0.3?

- fix incorrect behaviour of fluid_sample_set_sound_data()
- add missing getters for midi events:
  - fluid_midi_event_get_text()
  - fluid_midi_event_get_lyrics()

\section NewIn2_0_2 What's new in 2.0.2?

- fluid_synth_error() has been deprecated, use fluid_set_log_function() to interfere log messages

\section NewIn2_0_0 What's new in 2.0.0?

FluidSynths major version was bumped. The API was reworked, deprecated functions were removed.

<strong><span style="color:red">Important changes that may not result in a compilation error but may cause your app to misbehave:</span></strong>

- all public \c fluid_settings_* functions that return an integer which is not meant to be interpreted as bool consistently return either #FLUID_OK or #FLUID_FAILED
- fluid_settings_setstr() cannot be used to set integer (toggle) settings with "yes" or "no" values anymore. Use fluid_settings_setint() instead, for example: <br /><code>fluid_settings_setint(settings, "synth.reverb.active", 0)</code> instead of <code>fluid_settings_setstr(settings, "synth.reverb.active", "no")</code>
- <span style="text-decoration:line-through;">explicit client unregistering is required for fluid_sequencer_register_client() and fluid_sequencer_register_fluidsynth()</span> (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 \setting{audio_portaudio_device} setting
- fluid_synth_process() received a new more flexible implementation, but now requires zeroed-out sample buffers

<strong>Other changes in FluidSynth 2.0.0 concerning developers:</strong>

- all public \c 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() and new_fluid_cmd_handler() was adapted
- \c 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 \c fluid_mod_new() and \c fluid_mod_delete() to match naming conventions: new_fluid_mod() and delete_fluid_mod()
- rename chorus getters to match naming conventions: fluid_synth_get_chorus_speed() and fluid_synth_get_chorus_depth()
- fluid_synth_remove_sfont() returns #FLUID_OK or #FLUID_FAILED
- introduce a separate data type for sequencer client IDs: #fluid_seq_id_t
- fluid_get_userconf() has been implemented for Windows

<strong>New Features and API additions:</strong>

- add \setting{midi_autoconnect} a setting for automatically connecting fluidsynth to available MIDI input ports
- add \setting{synth_overflow_important} and \setting{synth_overflow_important-channels} settings to take midi channels during overflow calculation into account that are considered to be "important"
- add \setting{synth_dynamic-sample-loading} a setting for enabling on demand sample loading
- add support for polyphonic key pressure events, see fluid_event_key_pressure() and fluid_synth_key_pressure()
- add fluid_synth_add_default_mod() and fluid_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 \setting{synth_reverb_damp} and \setting{synth_chorus_depth} parameters
- 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() and fluid_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, see fluid_sfloader_set_callbacks() and <a href="fluidsynth_sfload_mem_8c-example.html">fluidsynth_sfload_mem.c</a>
  - 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
- 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()

<strong>API cleanups:</strong>
  
- 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() and fluid_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

*/
