Page 1 of 1

Creating an aplaymidi (and compatibles) >16 channel midi file

Posted: Thu Sep 21, 2017 1:53 am
by jaffa225man
My objective was to create standard MIDI format files that play with greater than 16 channels in devices that support it.

First, I should say that I've considered writing a feature request for Rosegarden, but the more I think about it, the more I realize it may just create problems for the majority of its users. It does seem, though, that they could include a midi export option that would automatically insert "MIDI Port" Meta-Events based on each track's "Manage MIDI Devices" chosen output. Of course, "MIDI Port" Meta-Events are obsoleted in favor of "Device (Port) Name" Meta-Event's, but they're all that's supported by aplaymidi (and its derivatives) and are useful in that they're not hardcoded port names (i.e. "aplaymidi -p '28:0,28:1' smf-midi-file.mid" for a multi-Part sound module is just as valid as using multiple sound modules with "aplaymidi -p '28:0,32:0' smf-midi-file.mid". One concern would be alleviated if it's possible for "Device (Port) Name" Meta-Events to work with substrings (i.e. "Part A" instead of the whole "SC-8850 Part A") to work with other sound modules that have more "Parts" (Ports), but I can't test that as aplaymidi doesn't support it anyway. If substrings work, though, I would also consider writing a feature request for aplaymidi. See ... solete.htm for more info. Another (more practical?) possible feature request for Rosegarden, could be the ability to manually create Meta-Events using "Insert Event" in its "Event List Editor". That would function without introducing bugs.

Okay, here's my non-programmatic solution that you probably all can guess: just edit the exported SMF (format 1, multi-track) MIDI file with a hex editor.
1. Find the "MTrk"s throughout the file that pertain to channels you want to assign greater than 16.
2. For each, add 5 to the number contained in the 4 bytes directly following the "MTrk" in question (in hexadecimal) and store the sum in those same 4 bytes (in hexadecimal).
3. Also after each "MTrk" modified above, directly following the 4 bytes containing that changed sum, insert these 5 bytes: "00 FF 21 01 pp", where "pp" is 00, 01, 02, or 03 (which stands for Part A, Part B, Part C, or Part D... or really the port order specified to aplaymidi), so pp should be 01, 02, or 03, as 00 is the default port/Part normally used.

That works for me, and although it's dependent on an obsolete Meta-Event, it creates playable files (in GNU/Linux aplaymidi, etc.) without dealing with SysEx confusion and its checksums, or more complex/nonstandard software solutions (Rosegarden, CakeWalk, etc.).