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).
Improve status/error logging on the LCD.
Also fix clearing the screen on reboot by moving the call to Clear() to
the UI core and waiting for the UI core to be done before rebooting.
Now that the LCD updates are done from a secondary core, the scheduler
is unavailable for implementing timing delays.
Replace them with simple delay loops from the CTimer class.
Refactor synth code to decouple it from the audio driver and instead use
the drivers' Write() methods to insert rendered audio into a queue from
CPU core 2.
Changes to the velocity scaling logic were also made; mt32lcd now
normalizes the MT-32 part velocity to a floating point number between 0
and 1. The LCD driver can then translate this into a bar pixel height as
required.
Rename enums, functions parameters and class member variables so that
they match the Circle coding style more closely.
Replace /* ... */ comments with // comments.
Fixup some indentation issues/trailing whitespace.
Remove undefined functions and unused #defines.