MIDI output from trackers (Impulse Tracker macros)
What it is#
Playing an external synthesizer from the pattern: a MIDI instrument sends NOTE ON/OFF with the note and volume column, and MIDI controllers (volume, modulation, pan, program change, sysex) are written as macros — Zxx values on the effect column that expand to MIDI messages. impulse-tracker introduced the scheme; openmpt keeps it and reuses the same macros to drive its own resonant filter (filter-programming).
Why it matters#
The sound parameters live on the synth, not in the tracker: the controllers are "outside knobs and wheels" for vibrato, level, sustain pedal, filter cutoff. MIDI is a 31.5 kbps serial link, so everything on one tick is sent in channel order, left-most first — drums and rhythmic parts belong in the left channels, and controller floods cost timing (Airon, source: s-tw098-impulse-tracker-midi).
How to do it#
Impulse Tracker#
From Airon's 1997 guide (source: s-tw098-impulse-tracker-midi); all values hex, c = MIDI channel, z = the macro's data byte (00–7F):
| job | message | how to write it |
|---|---|---|
| volume (level, controller 07) | Bc 07 z | an SFx parametered macro, driven by Z00–Z7F; he could not make the volume line of MIDI Output Config behave |
| modulation (controller 01, usually vibrato depth) | Bc 01 z | SFx macro |
| pan (controller 0A; 00 left, 40 centre, 7F right) | Bc 0A z | SFx macro, or the pan line as Bc 0A x |
| bank select (00 = MSB, 20 = LSB) | Bc 00 a Bc 20 b | static macro Z80–ZFF |
| program change | Cc pp | static macro |
| reverb / chorus send (some synths) | Bc 5B z / Bc 5D z | SFx macro |
| breath 0B, sostenuto 42 (00–3F off, 40–7F on), soft pedal 43, balance 08 | Bc nn z | as above |
| hold pedal, GM mode, patch/performance mode, sysex | synth-specific | static macros Z80–ZFF |
- Static macros
Z80–ZFFhold fixed messages; parametered macrosSF0–SFFselect one of sixteen templates whosezbyte comes fromZ00–Z7F— the mechanism OpenMPT documents in full (source: s-openmpt-manual-zxx-macros). - Velocity: the volume column is sent as NOTE ON velocity (timbre, "how hard you hit"); MIDI volume (controller 07) is a separate level, "the distance to the listener".
- Note-off timing and legato: NOTE OFF is sent when the note's tracker volume reaches zero. A sample-style instrument with NNA note fade and a fade-out around 120 therefore sends NOTE OFF late; use NNA note cut and fade-out 0 for tight playing, or NNA note fade with a small fade-out on purpose — "the greater the VOLUME FADE, the less LEGATO" (new-note-actions).
^^^(note cut) sends NOTE OFF at once; most synths retrigger a repeated note without killing the previous one.
OpenMPT#
The macro configuration dialog defines the sixteen parametered and 128 fixed macros; Zxx/\xx in XM, IT and MPTM execute them, and external MIDI messages go to the first plugin in the channel's chain (source: s-openmpt-manual-zxx-macros).
MIDI versus tracking, in the interviews (1995–98)#
- blaze-runner (1995) used the AWE32 over MIDI for filter control "like on an analog synth", a small Yamaha keyboard as controller, and planned a MIDI TB-303 clone (source: s-tw008-interview-blaze-runner).
- acidfrog (1996): MIDI and tracking are the same idea, but MIDI is quicker, especially for effects — "even on FT2 you have to put alot more work into your music to get the same results" (source: s-tw044-interview-acidfrog).
- khyron (1997): tracking is for the broke — "you can be completely broke and just steal samples and make some great music with it" — while MIDI gives "realtime effects on the synthesizers, poweful sound programming capability you can't do with just straight sample playback"; his old Moogs have no MIDI, so he sampled them instead (source: s-tw111-interview-khyron).
- mental-floss (1998) wanted the reverse direction — "the ability to syncronize/start IT by MIDI" — so that a module could be mastered on a 64-channel console one isolated sample at a time, and "more MIDI<->Tracker capabilities" in general (source: s-tw119-interview-mental-floss; see sync).
Tips & pitfalls#
- One macro per row; "MIDI is a serial protocol so don't go wild!"
- Put the synth's MIDI implementation chart next to the tracker — which controllers a patch answers is the synth's decision, not the tracker's (source: s-tw098-impulse-tracker-midi).
Game Boy#
lsdj and nanoloop have no MIDI port; MIDI reaches them as beat clock over the link connector, through a box. The 2008–2011 landscape of those boxes, the pins each program listens on and the operating procedure are on sync. Two things there matter to a MIDI user in particular (sources: s-little-scale-sync-options-for-game-boys, s-little-scale-1-dollar-nanoloop-sync):
- Give the Game Boy its own MIDI port, carrying clock only. Several designs — gwEm's DIY interface, little-scale's
$1circuit — have no message parsing at all, so any non-clock byte breaks sync. - CONTINUE is not a resume. The boxes respond to CLOCK, START, STOP and CONTINUE, but on the LSDj side stopping the clock stops the song and starting it again plays from wherever the cursor is: "to start again from the same position in the LSDJ song, you will need to manually select it and press start" (source: s-little-scale-arduino-gameboy-sync-boxes). Note also that nanoloop wants 12 ppqn where MIDI beat clock sends 24, so a MIDI→Nanoloop box is halving the clock — the same box cannot feed both programs the same signal.
- A sync box can be a MIDI port. little-scale's 2011 Teensy build "shows up natively as a USB MIDI device, thereby requiring no drivers and no power beyond the standard USB connection" — a $16 board, two wires per Game Boy — and its later firmware adds DIN sync 24 out (24 ppqn, 3 ms pulses, 5 V playing / 0 V stopped) so analogue gear rides the same clock (source: s-little-scale-teensy-usb-midi-sync).
- MIDI out and thru were rare. In little-scale's 2008 chart only Trash80's Arduinoboy had both; Firestarter's LSDJMC2 had thru. Full note control of the sound chip needed a different class of thing entirely — Pushpin or mGB, which replace the tracker rather than clock it.
Related#
impulse-tracker · openmpt · new-note-actions · filter-programming · sync · recording-samples · live-tracking
Sources#
s-tw098-impulse-tracker-midi · s-openmpt-manual-zxx-macros · s-tw008-interview-blaze-runner · s-tw044-interview-acidfrog · s-tw111-interview-khyron · s-tw119-interview-mental-floss · s-little-scale-sync-options-for-game-boys · s-little-scale-1-dollar-nanoloop-sync · s-little-scale-arduino-gameboy-sync-boxes · s-little-scale-teensy-usb-midi-sync