The midi parser interface should take a const byte array so that engines can
pass data with more confidence. This also allows them to be more const correct
on their side.
There was one place where the input byte stream was actually being modified by
the midi parser to overwrite tempo values. Pointed to a static byte array for
this case.
Type 1 SMF files consist of multiple tracks that are to be played simultaneously
in parallel. Support for this was previously implemented by merging these tracks
into one single track, then treating the result as a regular type 0 SMF file.
This commit adds full support for type 1 files. The parallel tracks are loaded
as subtracks of the parent track and played simultaneously in real time. This
allows for support of MIDI formats with parallel subtracks that do not use the
SMF format (Dark Seed floppy version) or that jump to offsets within each
parallel subtrack (Origin MIDI).
This commit adds MIDI parser subclasses for the Simon 1 GMF format and for the
SMF variant used by the Windows versions of Simon 1 and 2.
The GMF format was handled by the SMF parser, which can now be removed from
that class. It also fixes the tempos not matching the DOS interpreter.
The Simon Windows SMF variant was handled in the AGOS midi class. Moving it to
a separate parser allows for some cleaner code in that class. It now also
corrects the tempos to match those of the DOS interpreter.
This allows the SMF parser to work with MidiDriver implementations that support
multiple MIDI sources. You can set the source number when constructing the
parser. This is then passed along when MIDI messages are sent to the driver.