Overview of Changes in liquidsfz-0.4.2:

* File dialog updates:
  - for bundled Ardour: restore environment variables to make file dialog work
  - fix yad arguments (use yad --file instead of --file-selection)
  - replace some unsafe fork() based code with posix_spawn()
  - use procfs on linux to safely read environment while host may modify it
* LV2Plugin: add midi keyboard widget, display switches and range/notes
  - add API for querying Synth keyboard state
  - add UI for drawing keyboard, make it fast to only draw if keys changed
* Support building with clang++ realtime sanitizer
* Support building with undefined behaviour sanitizer
* Update static build base to Ubuntu 22.04, g++-15
* Fixes:
  - fix negative offset crashes
  - use RTMutex in liquidsfz jack client to avoid RT unsafe std::mutex
  - make frequency wrapping never stall audio thread for small loops
  - avoid undefined behaviour for some float->int conversions (saturate)
  - avoid undefined behaviour in Filter (nullptr addition)
  - Loader::convert_uint: saturate values out of uint range, don't wrap
  - avoid problems with very large playback frequencies (cap freqencies)
  - minor build flags cleanups
  - license of the LV2 plugin now says MPL-2.0
  - add test to check flac support in static build
* Fixes after AI code review (#56):
  - do not hold the plugin mutex while scheduling LV2 work (F01)
  - keep LFO back-pointers valid when growing the voice vector (F03)
  - stop all voices before unloading regions (F04)
  - run queued JACK synth commands under the synth lock (F05)
  - bounds-check UI program selection (F07)
  - release mmap/fd resources even when opening a sound file fails (F08)
  - make phase wrapping never stall audio thread (F09)
  - remove hidden allocation from LFO modulation updates (F10)
  - reject PEQ as a regular filter type (F11)
  - allocate enough FFT output space in the resampling test tool (F12)
  - transpose velocity-zero note-on only once (F13)
  - apply octave offset to keyswitch lookup (F14)
  - include key zero and preserve switch metadata (F15)
  - reset sample selection on overrides (F16)
  - initialize keyswitch / supported ccs arrays (F17)
  - satisfy enlarged preload on cache hits (F19)
  - handle filesystem lookup errors without exceptions (F20)
  - use normalized Pugl mouse button indices (F21)
  - handle UI initialization failures safely (F22)
  - validate MIDI and state values and report save errors (F23)
  - restore missing synthesis assertions (F24)
  - preserve playback requests during eviction (I02)
  - ignore bank define with empty variable names (I08)

Overview of Changes in liquidsfz-0.4.1:

* New robust low level SFZ parser:
  - do not fail on parse error, only emit warning and continue
   => improve compatibility while loading broken sfzs
  - improved performance compared to regex parser
* LV2 plugin:
  - display number of warnings / errors / cache status
  - default to kdialog on KDE, zenity otherwise
  - support yad as alternative to kdialog / zenity
  - use LV2 logger interface for warnings / errors generated by Synth
  - don't access Synth in run during load (thread safety)
  - compute necessary window height / width before showing the window
  - show error message if dialog helpers are missing (#51)
* New opcodes:
  - gain_onccN, loop_count
* Fixes:
  - fix cache misses triggered when first playing a looped note
  - fix off-by-one error interpreting wav file loop points
  - change ampeg_release default to 30ms to avoid clicks
  - ignore invalid loop modes
  - loop range sanity checks while loading
  - smaller performance optimizations
  - move pugixml to LiquidSFZInternal namespace to avoid name clashes
  - convert #include paths to native filenames
  - support $VARIABLE expansion in #include filenames
  - merge <control> section contents if more than one section is defined
  - only emit one single warning for each undefined opcode

Overview of Changes in liquidsfz-0.4.0:

* New opcodes:
  - eqN_freq, eqN_gain... - equalizer support (based on code by Eric Bateman)
  - global_volume, master_volume, group_volume
  - width, end (#49), phase=invert, sustain_cc
  - delay_random, octave_offset, pitch_veltrack
  - amp_veltrack_onccN and amp_veltrackccN
* Implement some extended CCs:
  - CC131 - note on velocity
  - CC133 - note key
  - CC135 - random unipolar
  - CC136 - random bipolar
* Add simple generators:
  - sample=*silence generator
  - sample=*sine generator
  - sample=*noise generator
* AriaBank support
  - Added API and UI for selecting AriaBank programs
  - Support parsing and loading AriaBank .bank.xml files
* Add LV2 custom UI based on pugl and ImGUI (Linux only)
* Parser/Loader improvements:
  - Support case-insensitive filenames to load .sfz files tested on Windows
  - Make parser more permissive, accept uppercase opcodes
  - Support #include="foo.sfz" in addition to #include "foo.sfz"
  - Improve preprocessor performance
* Fixes:
  - Sort incoming midi events if necessary, fix Reaper crash (#47)
  - Ignore extra spaces surrounding = (#40)
  - Fix default_path for absolute paths (#48)
  - Don't add path seperator automatically for default_path
  - Use new locations for LV2 headers if available
  - Stop existing voices before loading (fix samplecache race)

Overview of Changes in liquidsfz-0.3.2:

* Fix crashes triggered by Carla while saving without path
* Allow multiple overlapping notes during sustain (#38)
* Provide cross compiled LV2 plugin for Windows
* Use LV2_STATE__freePath if available (fixes LV2 on windows)
* Fixes for building on macOS and Windows
* Improve tests and CI checks

Overview of Changes in liquidsfz-0.3.1:

* Fix crash in voice processing when gain smoothing is active
* Fix crash caused by libstdc++ debug assertions (#34)
* Add missing #include statements (#33, #35)
* Setup CI using github actions, build and lv2lint the plugin
* Add testsynth program for regression tests (make check and CI)
* Support address sanitizer and C++ STL debug checks from autogen.sh

Overview of Changes in liquidsfz-0.3.0:

* Change license to MPL-2.0
* Load sample data on demand (preload start, background load as needed)
* Improve sound quality by using better interpolation / resampling
* Support CC7=Volume and CC10=Pan if not defined in .sfz file (#30)
* Various performance optimizations
* Fix LFO ranges for square like LFOs
* Implement sustain loops (loop_mode=loop_sustain)
* Added new public API functions for new features
* Make it possible to use absolute paths in .sfz file
* Use mmap() for soundfiles on 64bit platforms
* Add a few new commands / command line options to liquidsfz jack client
* Statically linked plugin is compiled using Ubuntu 18.04 (instead of 16.04)
* Minor fixes and cleanups

Overview of Changes in liquidsfz-0.2.3:

* Implement LFO support
  - old style (amplfo_*, pitchlfo_*, fillfo_*)
  - new style (lfoN_freq, lfoN_pitch,...)
* Preprocessor improvements
  - allow #define / #include in the middle of a line
  - allow to #include the same file twice
  - support C style block comments
* Support curve sections and related opcodes
* Portability changes which should allow building the lib on windows
* Minor fixes and cleanups

Overview of Changes in liquidsfz-0.2.2:

* Implement filters (fil_type, cutoff, resonance, ...)
  - all SFZ1 filter types (lpf_1p, lpf_2p, hpf_1p...)
  - some SFZ2 filter types (lpf_4p, lpf_6p, hpf_4p, hpf_6p)
  - filter envelope (fileg_attack, fileg_depth, ...)
* Support midnam for LV2 to provide controller/key/switch information
* Key/Key Switch information:
  - API: provide key and key switch information (Synth::list_keys)
  - opcodes: implement key and keyswitch names (sw_label, label_keyN)
  - hydrogen loader: provide key names for each mapped key
  - add keys/switches/ccs command in liquidsfz jack client
* Improve key switch handling to fix problems with some sfzs #20
* Fix problems with clang++ using libc++ (for instance on macOS) #19
* Minor fixes and cleanups

Overview of Changes in liquidsfz-0.2.1:

* New opcodes: offset / offset_random / offset_ccN / offset_onccN
* Support loading Hydrogen drumkit.xml files
* Make liquidsfz JACK client interactive, support typing commands
* Support building as shared library
* Share the same sample cache between all Synth instances
* Opcode aliases for volume_cc and volume_oncc
* RT cleanups for standard logging (info/warning/error)
* Document threading / RT constraints
* API additions
  - Synth::active_voice_count
  - Synth::all_sound_off
  - Synth::system_reset
* Support compiling without some features (--without-jack / --without-lv2)
* Fixes
  - make string->double conversion work on any locale
  - preallocate event buffers to avoid malloc for new events
  - allow one parameter to be modulated by multiple CCs
  - don't crash on broken sfz which have uint out of range
  - fix overriding sample loop_mode/loop_start/loop_end
  - constrain ranges for cc/pitch_bend (i.e. enforce cc to [0..127])

Overview of Changes in liquidsfz-0.2.0:

* Provide LV2 plugin
* Support for <control>/<global>/<master> sections
* Handle #define
* Lots of new opcodes supported, including
  - key switches
  - crossfading for layers
  - more amp-related opcodes
  - allow changing more parameters using CCs
* API additions
  - load progress function (Synth::set_progress_function)
  - global gain factor (Synth::set_gain)
  - provide list of CCs supported by .sfz file (Synth::list_ccs)
  - support pitch bend (Synth::add_event_pitch_bend)

Overview of Changes in liquidsfz-0.1.0:

* Initial public release
  - liquisfz: a commandline jack client
  - libliquidsfz.a: a static library
