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):

jobmessagehow to write it
volume (level, controller 07)Bc 07 zan 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 zSFx macro
pan (controller 0A; 00 left, 40 centre, 7F right)Bc 0A zSFx macro, or the pan line as Bc 0A x
bank select (00 = MSB, 20 = LSB)Bc 00 a Bc 20 bstatic macro Z80–ZFF
program changeCc ppstatic macro
reverb / chorus send (some synths)Bc 5B z / Bc 5D zSFx macro
breath 0B, sostenuto 42 (00–3F off, 40–7F on), soft pedal 43, balance 08Bc nn zas above
hold pedal, GM mode, patch/performance mode, sysexsynth-specificstatic macros Z80–ZFF
  • Static macros Z80–ZFF hold fixed messages; parametered macros SF0–SFF select one of sixteen templates whose z byte comes from Z00–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 $1 circuit — 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.

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

source file wiki/techniques/midi-in-trackers.md · graph