Universal Controller MIDI
Blog MPE 9 min read

MPE Polyphonic Expression on a Gamepad — Yes, It Works

MPE is the per-note expression spec used by ROLI Seaboards and LinnStrument. Here is how a $109 DualSense becomes an MPE controller with per-note pitch, slide, and pressure.

By Aidxn Design

MPE — MIDI Polyphonic Expression — is the spec that powers expressive instruments like the ROLI Seaboard ($1,300+), the LinnStrument ($1,499), and the Sensel Morph. It assigns each note to its own MIDI channel so per-note bend, slide, and pressure all work without notes stepping on each other. Spoiler: a DualSense has more than enough inputs to drive MPE, and the bridge has shipped MPE mode since v1.2. Behold the cheapest MPE controller you'll ever own.

TL;DR
  • What MPE is: per-note MIDI on its own channel, with pitch (bend), slide (CC74), and pressure (channel pressure).
  • Why it needs its own channel per note: MIDI 1.0 pitch-bend is per-channel, so two notes on the same channel cannot bend independently.
  • Gamepad inputs used: face buttons = note triggers, R-stick X = bend, R-stick Y = slide, R2 trigger = pressure.
  • Cost: $109 controller + $49 bridge = $158 vs $1,499 for a LinnStrument.

What MPE actually is

MIDI 1.0 has a problem: pitch bend, channel pressure, and most CCs are per-channel, not per-note. If you play a chord on a single channel and bend, all the notes bend together. The MPE spec (officially adopted by the MMA in 2018) solves this by spreading notes across channels. A "lower zone" MPE setup uses channel 1 as the master/manager and channels 2–16 as member channels, one note per channel. Each member channel gets its own bend, its own pressure, its own CC74. The receiver knows the convention and treats them as one logical polyphonic stream.

The three "dimensions of touch" the spec promotes are:

  • Strike — note-on velocity (how hard you hit).
  • Press — channel pressure / aftertouch (how hard you hold).
  • Glide — pitch bend (lateral movement / sliding).
  • Slide — CC74 (vertical movement on a 2D surface).
  • Lift — note-off velocity (how fast you release).

Why a gamepad is surprisingly good at MPE

Look at the inputs on a DualSense: four face buttons (strike), two analog triggers (press), two analog sticks (glide and slide), motion sensors (an extra dimension if you want it), a pressure-sensitive touchpad. That's more independently-controllable continuous axes than a ROLI Seaboard 25-key has per voice. The trick is mapping them to MPE in a way that's actually playable.

Our default MPE preset uses the four face buttons as four note slots. Hold one button = one note voiced. The right stick X and Y, and the R2 trigger pressure, are routed to the most recently voiced note's channel. So you can play a four-note chord and bend / slide / press the lead voice while the others sustain unchanged. Releasing the lead button switches the expression target to whatever was voiced before it. It feels remarkably like a Seaboard once you've spent ten minutes with it.

The channel allocator

The hard engineering bit is the channel allocator. When a button press creates a new note, the bridge picks the lowest unused member channel (2–16), records the mapping, and routes the note plus its expression there. When the note ends, the channel returns to the pool. Channels are sticky during a note's lifetime — bend on channel 4 stays on channel 4 even as new notes spawn on 5, 6, 7.

{`// Channel allocator, simplified
class MPEAllocator {
  private free = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
  private active = new Map<string, number>();

  noteOn(buttonId: string, note: number, velocity: number): number {
    const ch = this.free.shift() ?? this.stealOldest();
    this.active.set(buttonId, ch);
    sendNoteOn(ch, note, velocity);
    return ch;
  }

  noteOff(buttonId: string, note: number): void {
    const ch = this.active.get(buttonId);
    if (ch == null) return;
    sendNoteOff(ch, note, 64);
    this.active.delete(buttonId);
    this.free.unshift(ch);
  }

  expression(value: number, axis: 'bend'|'slide'|'press'): void {
    const lead = [...this.active.values()].pop();
    if (lead == null) return;
    sendExpression(lead, axis, value);
  }
}`}
Get Universal Controller MIDI Pro — $49 →

The MPE config block

The bridge ships an MPE preset with these defaults. Edit the JSON to taste:

{`{
  "name": "MPE Default (lower zone)",
  "mode": "mpe",
  "mpe": {
    "zone": "lower",
    "memberChannels": [2,15],
    "managerChannel": 1,
    "bendRange": 48,
    "stealPolicy": "oldest"
  },
  "lanes": [
    { "input": "button.cross",    "type": "mpe-note", "note": 60, "slot": 0 },
    { "input": "button.square",   "type": "mpe-note", "note": 64, "slot": 1 },
    { "input": "button.triangle", "type": "mpe-note", "note": 67, "slot": 2 },
    { "input": "button.circle",   "type": "mpe-note", "note": 72, "slot": 3 },
    { "input": "stick.right.x",   "type": "per-note-bend", "scope": "lead" },
    { "input": "stick.right.y",   "type": "per-note-cc", "cc": 74, "scope": "lead" },
    { "input": "trigger.r2",      "type": "per-note-pressure", "scope": "lead" }
  ]
}`}

Set scope to "all" instead of "lead" and the expression broadcasts to every active note. That's not real MPE — it's the MIDI 1.0 mono mode — but it's occasionally useful for swelling all voices at once.

Which synths actually receive MPE

Not all synths are MPE-aware. The good news: the ones that matter for expressive playing all are.

  • Equator2 (ROLI) — designed for MPE, sounds best with it.
  • Diva, Repro-5, Hive (u-he) — MPE since 2019.
  • Pigments 5 (Arturia) — full MPE.
  • Vital — MPE-capable.
  • Serum 2 — added MPE in 2025.
  • Logic Sculpture / Alchemy — MPE-aware.
  • Ableton Wavetable / Sampler — MPE in Live 11+.
  • Bitwig grid devices — MPE native.

Limitations and roadmap

  • Four-voice ceiling on a standard gamepad. You only have four face buttons. With d-pad + L1/R1 you can stretch to ten, but ergonomics suffer.
  • MIDI 2.0 makes MPE simpler. Per-note messages are first-class in 2.0 — no channel rotation needed. The bridge auto-upgrades when the destination speaks UMP.
  • Older DAWs (Pro Tools, Studio One pre-6) have incomplete MPE handling. Test before committing to a session.
  • Channel stealing can pop a sustained note if you exceed 15 voices. Stealing policy is configurable.
  • Roadmap: d-pad as four extra MPE slots in v1.4, configurable button-to-note-name mapping in v1.5.

MPE on a gamepad is the single most "you bought a Seaboard for $1,500 and feel silly now" feature in the bridge. Grab Universal Controller MIDI, switch on MPE mode, load Equator2 or Pigments, and play.

Keep reading

More setup walkthroughs