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 macrosZxx 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 (007F):

jobmessagehow to write it
volume (level, controller 07)Bc 07 zan SFx parametered macro, driven by Z00Z7F; 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 Z80ZFF
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 Z80ZFF
  • Static macros Z80ZFF hold fixed messages; parametered macros SF0SFF select one of sixteen templates whose z byte comes from Z00Z7F — 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