Replace MidiCategory with MidiStatusByte permanently (see mididevice.cpp line 242.)
Persistent mapping preset drop-down (don't return to “…” unless Clear All is pressed. If the user tweaks the mapping, say “<custom>” or something.)
Also clear the list of MIDI scripts when Clear All is pressed
Do not commit changes to the MIDI mapping tables unless OK is pressed in the preferences window. (I.e. allow pressing the Cancel button or the X on the preferences window to restore the MIDI mappings to their previous states.)
Position-based scratching (as opposed to the current velocity-based.) Script use cases:
Relative: Tell the Engine to move the track X seconds forward/backward over Y seconds of real time. The engine will, without affecting play status, play all the samples between the current and target positions in the specified time (stretching as needed) and fire a signal when it's there, optionally holding at the target position until given further instruction. It must also queue requests so it ends up at the correct position.
Absolute: Tell the Engine to move to absolute time X (in elapsed or remaining seconds) over Y seconds of real time. Otherwise same behavior as above.
Update sound file test script in src/test/soundFileFormats to include M4A file generation