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
