Apply a patch to Circle to replace the default heap allocator with the
zone allocator.
Now system allocations, memory obtained through malloc()/new and
FluidSynth all share the same allocator and we no longer have to reserve
an arbitrary fixed-size block for malloc()/new.
When the 1MHz timer wraps, the MIDI level meters would appear to be
stuck after a while.
Implement some additional state tracking to guard against timer wrap.
Fixes#148.
Previously, the LCD code needed to be aware of each synthesizer to know
how to draw their respective displays, which wasn't very maintainable.
Introduce a UI class where generic drawing utility functions and
"system" drawing code can be implemented, and move synth-specific
drawing to the synth classes themselves. This simplifies the LCD/OLED
drivers to just being interfaces to the hardware.
Also introduce a "MIDI monitor" class which tracks the state of all MIDI
activity per-synth for level meter drawing purposes. This ensures we
never miss a note; previously we were simply polling each synth engine
for its note velocities per LCD update, which was prone to missing fast
notes and also didn't account for channel volume or expression pedal.
Finally, enable support for 16-character wide displays (closes#58).
This commit introduces the notion of "effects profiles", with
reverb/chorus settings that can be set on a per-SoundFont basis.
The configuration file has been updated with an example of applying a
profile to the GeneralUser GS SoundFont.
Add a Doom-style "zone" memory allocator that can be used instead of
malloc()/realloc()/free() for FluidSynth.
This removes the need to reconfigure the Circle heap and could reduce
fragmentation caused by repeated loading/unloading of SoundFonts.
Work around the lack of a lazy unload timer by avoiding use of
fluid_synth_sfunload() and instead simply recreating the synth instance
when switching to a new SoundFont.