Blog Hardware 9 min read

Dirtywave M8 — Gamepad as an External MIDI Controller

Use a gamepad as an external MIDI controller for the Dirtywave M8 tracker. Trigger notes into the grid, drive macros, sync clock — full setup.

By Aidxn Design

The Dirtywave M8 is a love letter from Trash80 to the LSDJ generation — a tracker that fits in a pocket, runs forever, and squeezes more music out of eight channels than most rigs four times its price. The on-device controls are perfect for the M8's design language but lean on a single d-pad and four face buttons for everything. The m8 tracker gamepad setup through Universal Controller MIDI hands you a second pair of hands for trigs, macros, and live performance gestures while the M8 keeps doing what it does.

TL;DR
  • What you do: bridge gamepad over USB to M8, send MIDI notes into the eight instrument channels.
  • Killer feature: face buttons trigger M8 instruments on top of whatever pattern is playing — live drum rolls.
  • What you need: M8 (any model), gamepad, laptop running the bridge, two USB-C cables.
  • Time: 10 minutes including the per-channel CC bank setup.

Why the M8 wants a second controller

The M8 is a tracker. Trackers are about step entry, parameter columns, and instrument design. The hardware-side control surface is fine for that — but live, when the pattern is already running, you want to layer hits, twist a macro, throw a fill on top. The M8's input is the d-pad. Doing all of the above through the d-pad means muting and unmuting fast. A gamepad solves it: trigger notes, sweep macros, hit a fill, all without touching the M8's display.

The M8 MIDI implementation in one paragraph

The M8 listens to eight MIDI channels — one per tracker channel. Each instrument channel responds to note ons, four macro CCs (CC 1, 2, 3, 4), and a velocity-modulating CC 7. Set MIDI IN PORT = USB and the M8 listens. Set RECEIVE SYNC = ON and the M8 follows external clock. Set RECEIVE TRANSPORT = ON and play/stop messages drive M8 transport. Confirm against the in-firmware MIDI page or the M8 product documentation for the current firmware revision (4.x at time of writing).

The mapping table

Gamepad inputM8 targetMIDI message
Cross (A)Channel 1 trig (kick)Note 36, channel 1
Circle (B)Channel 2 trig (snare)Note 36, channel 2
Square (X)Channel 3 trig (hat)Note 36, channel 3
Triangle (Y)Channel 4 trig (perc)Note 36, channel 4
D-pad up/downChannel 5 (bass) trig — note up/downNote 48/60, channel 5
D-pad left/rightChannel 6 (lead) trig — note prev/nextNote 48/55, channel 6
Left stick XChannel 1 macro 1CC 1, channel 1
Left stick YChannel 1 macro 2CC 2, channel 1
Right stick XChannel 1 macro 3CC 3, channel 1
Right stick YChannel 1 macro 4CC 4, channel 1
L1 / R1Switch active stick channel (1–8)internal bridge action
L2 triggerChannel 1 velocityCC 7, channel 1
R2 triggerChannel 1 filter cutoffCC 74, channel 1
Touchpad clickTap tempoMIDI clock

The killer move — face buttons into the input grid

The brief said this is the killer move and it really is. Trackers don't let you "play notes" the way a synth does. They let you place notes on a step grid. The M8's external-MIDI input bypasses that — notes arriving on channel 1–8 fire the instrument right now, on top of whatever the sequencer is already playing. Bind the four face buttons to the kick/snare/hat/perc instruments and you have a live finger-drumming layer.

# bridge — face-button trig section
[binding.cross]    = { type = "note", note = 36, channel = 1 }
[binding.circle]   = { type = "note", note = 36, channel = 2 }
[binding.square]   = { type = "note", note = 36, channel = 3 }
[binding.triangle] = { type = "note", note = 36, channel = 4 }

# velocity sensitivity — bind L2 to scale 0-127
[velocity.face_buttons]
modulator = "L2"
range_min = 40
range_max = 127

Per-channel stick banking

Eight channels, two sticks. The bridge banks the sticks across channels — L1 cycles down through 8→1, R1 cycles up 1→8. The currently active channel lights up in the bridge UI. Same trick as the Polyend Tracker preset; same pattern across hardware-tracker presets in general. See the Polyend Tracker post for the structural mirror.

Clock sync — the hands-free workflow

The M8 is happiest as a clock follower. Drive the bridge's tap-tempo button with the touchpad click. The bridge generates a stable MIDI clock and the M8 follows. Now you can change M8 tempo by tapping the gamepad — no menu diving on the device itself. For the full clock pipeline see tap tempo MIDI clock from gamepad buttons.

Live patterns that work

  • Fill on the fly. Hold L2 (velocity ramp) and mash Triangle 16 times during a turnaround. Velocity rises across the run, the M8 instrument's macro 4 follows L2, fill sounds intentional.
  • Filter-sweep into a drop. Bank to channel 1, R2 to filter cutoff, sweep R2 over the last bar of the breakdown.
  • Mute group toggle. Bind Select + face buttons to send Note 127 (used as a "mute toggle" by an M8 plugin script) per channel. Toggle channels in and out of the mix without touching the device.

What the M8 will not do

It will not learn CCs — the macro mapping is fixed. It will not send CC out for its own knob movements (only notes and clock). It does not accept MPE. And the headless M8 (no built-in screen) needs an additional USB hub if you want to power both the M8 and the gamepad off a single laptop — power-supply quirks matter on the model:01.

Related rigs

Tracker structural mirror: Polyend Tracker step + envelope control. Wider hardware context: gamepad to hardware synth via USB host. For raw finger-drumming workflow that doubles into the M8: beat making with a PS5 controller.

The M8 is enough on its own. But with the bridge and a gamepad, the live performance layer it always wanted is finally there.

Keep reading

More setup walkthroughs