Blog Performance 9 min read

Theatre Cue Stack — Gamepad as the Operator's Controller

A theatre cue stack mapped to a DualSense — GO, STOP, PANIC on face buttons, d-pad navigation, three cue layers, full operator workflow with QLab.

By Aidxn Design

A theatre cue stack lives or dies on the operator. They sit in the booth, follow the SM's cue calls in their cans, and press GO at the right moment for every sound, light state, and video clip in the show. The traditional setup is a QLab laptop with a spacebar and an iPad. A theatre cue gamepad setup replaces the spacebar with something that lives in the operator's hand instead of on the desk — and it turns out a DualSense is unreasonably well-suited to the job. Here's the full operator workflow.

TL;DR
  • Cross = GO, the most-pressed button in the run.
  • Circle = STOP (clean), Triangle = PANIC (everything off, house lights up).
  • D-pad navigates the cue list; L1/R1 swaps cue layer focus (sound / lights / video).
  • Sticks ride live parameters — lighting intensity, sound bed gain — never navigation.
  • L2-hold-to-arm prevents resting-thumb accidents during quiet scenes.

Why a gamepad belongs in the booth

QLab's spacebar workflow has been the small-theatre standard for over a decade. It works. But the operator's hand lives chained to the laptop, the spacebar is a 14 mm strip, and the keyboard is a stack of failure modes (sticking keys, accidental nudges, accidental shortcuts). A DualSense in the operator's hand puts every function under a labelled button, leaves the eyes free for the script and the SM's cue calls, and survives being thrown into a Pelican case at the end of strike. The Universal Controller MIDI bridge sends standard MIDI cues that QLab consumes natively — covered in detail in the QLab show control guide.

The cue map — what every input does

InputFunctionQLab actionFrequency in a typical 90-min show
Cross (X / A)GOFire current cue, advance cursor~60 presses
CircleSTOPStop current cue with fade-out~4 presses
TrianglePANICKill all running cues, raise house0 (hopefully)
SquareLOADPreload next heavy cue (video file)~6 presses
D-pad up/downCue cursorMove selection without firing~12 presses
D-pad left/rightAct jumpJump to Act II / Act I markers~2 presses
L1Layer cycleSound → Lights → Video focus~10 presses
R1Layer confirmLock layer focus visuallymatches L1
L2 (hold)ArmingRequired for cross/triangle to fireheld during cues
R2Live fadeRide master fader (lights or sound)~8 cues use it
Left stick YSound bed levelLive underscore gain~3 scenes
Right stick YLight masterIntensity ride during transitions~5 transitions
Touchpad clickCue list refreshRe-sync to QLab if displaced0 (failsafe)

QLab MIDI input — the bridge config

QLab consumes MIDI on a per-cue basis via MSC (MIDI Show Control) triggers or simple Note On bindings. Notes are easier to reason about for a cue list. Map each DualSense button to a unique Note number in the bridge, then bind those notes to QLab cues with the inspector's MIDI tab. The bridge config below is the canonical theatre preset.

# Theatre operator preset — DualSense → QLab
[buttons]
cross      = { note = "C2",  channel = 1, action = "go" }
circle     = { note = "C#2", channel = 1, action = "stop" }
triangle   = { note = "D2",  channel = 1, action = "panic", require = "L2" }
square     = { note = "D#2", channel = 1, action = "load" }

[dpad]
up    = { note = "E2",  channel = 1 }   # cursor up
down  = { note = "F2",  channel = 1 }   # cursor down
left  = { note = "F#2", channel = 1 }   # prev act
right = { note = "G2",  channel = 1 }   # next act

[shoulders]
L1 = { note = "G#2", channel = 1 }       # layer cycle
R1 = { note = "A2",  channel = 1 }       # layer confirm
L2 = { mode = "modifier" }               # arming hold
R2 = { cc = 7, channel = 1 }             # live fade (volume)

[sticks]
left_y  = { cc = 7,  channel = 2, polarity = "positive" }   # sound bed gain
right_y = { cc = 7,  channel = 3, polarity = "positive" }   # light master

[safety]
double_press_guard = "200ms"   # debounce GO
panic_requires     = "L2"      # both buttons or no panic

The arming model — preventing the wrong cue at the wrong time

The operator's thumb rests on cross for most of the show. That's fine — that's the point — until a quiet scene where an accidental press would be catastrophic. The fix is L2-hold-to-arm: cross only fires when L2 is held. During cued moments the operator squeezes L2 with their index finger and is armed; during long quiet scenes they release L2 and the cross is inert. Triangle (panic) always requires L2 — there's no universe where an accidental panic is acceptable.

Operator workflow — three layers, three colours

QLab projects with 60+ cues benefit from layered organisation. Sound on one cue list, lights on another, video on a third. L1 cycles which layer the d-pad cursor is currently in. R1 visually confirms the focus (the bridge changes the DualSense lightbar colour: teal for sound, amber for lights, magenta for video). The operator never has to look at the laptop to know what GO will fire next. Cue colours match across the production stylebook — see the Stage Lighting Primer's cue sheet conventions for the canonical scheme.

Tech week — how to rehearse the rig itself

  • Monday (paper tech): SM and op walk the cue list cold. No actors. Op holds the DualSense and dry-fires every cue at the right moment. Find the cue numbers that need re-labelling.
  • Tuesday (dry tech): Run cues with set and lights but no actors. Op presses GO on every cue. Identify any cue that's hard to find on the d-pad.
  • Wednesday (wet tech): Add sound and video. Op now runs all three layers via L1 cycling. Time the layer flips.
  • Thursday (Q2Q): Cue-to-cue with actors. Op runs the full stack. SM watches op's right hand and confirms button presses match call sheet.
  • Friday (dress): Full run. Op runs the show end-to-end. Any failover drill (USB cable yank, pad reconnect) happens here, not at preview.

Failure modes and how they get handled

FailureDetectionRecoveryAudience impact
USB-C dislodgedQLab MIDI input idleAuto-reconnect <1.5 s, or fall to keyboard backupOne missed beat at worst
Pad battery diesBridge shows red battery indicatorCannot happen on USB-Cn/a
Op presses wrong layer's GOWrong cue firesOp hits triangle (PANIC) only if catastrophic, else ride throughMinor — most wrong cues are recoverable
QLab crashesHard silenceSM holds for line, op reloads QLab from autosave (~30 s)Visible pause, recoverable
Sticky cross buttonDouble-fire on GOBridge's 200 ms debounce eats itInvisible

What the operator carries to the booth

  • DualSense (primary) on a 2 m USB-C tether to the QLab Mac.
  • DualSense (spare), unpowered, on the desk — emergency swap-in.
  • Wired USB keyboard mapped to the same GO macro in QLab — last-resort fallback.
  • Printed cue list, A3, in a script-stand binder.
  • Cans (single-side, so they can still hear the room).
  • Penlight clipped to the script binder.
  • A bottle of water — booth gets hot under the cue light.

Pre-show checklist (the laminated A5 next to the laptop)

  • QLab project loaded; cue 1 selected.
  • Bridge UI shows DualSense connected, lightbar = teal (sound layer focused).
  • Test fire: cue 0.5 ("preset check") fires from cross.
  • Test panic: triangle + L2 raises house lights, no audio, no video.
  • Reset panic: SM calls "house out", op fires cue 1.
  • Confirm with SM over cans: "Op ready."

A gamepad in the booth is the difference between an operator chained to a laptop and an operator with their eyes on the actors. Universal Controller MIDI ships the theatre preset out of the box — load it, point QLab at the MIDI input, run your tech. The QLab show control deep-dive covers MSC routing for multi-machine productions. The DMX lighting bridge covers driving the lighting board directly if you don't have a separate LX op. Back at the homepage — the bridge is the bit that doesn't change between a festival and a fringe theatre. Same software, different room.

Keep reading

More setup walkthroughs