Core concepts
Deadzones
A deadzone is the inner region of a stick or trigger where small movements get ignored. Per-axis tuning eliminates jitter without sacrificing expressive control.
Updated
A clean deadzone setup makes a $70 DualSense feel as precise as a $400 MIDI controller. A deadzone is the inner region of a stick or trigger where small movements are clamped to zero — it exists because no analog input rests at exactly zero, and you don't want a CC stream jittering between 0 and 2 while your hands are off the controller.
The jitter problem
Sticks float. Triggers float. Even a brand-new DualSense at rest will report values bouncing in a small range around centre — typically ±3 on a 0–255 stick, ±1 on a trigger. That's mechanical play, ADC noise, and thermal drift, and there's no fixing it in hardware.
Without a deadzone, that idle noise becomes a constant stream of MIDI CCs leaving the app at ~100 Hz. Your DAW chokes, the modulation lane fills with garbage, and any sound modulated by that CC gets a permanent fine tremolo. Not the vibe.
{
"leftStick": { "deadzoneX": 0.08, "deadzoneY": 0.08 },
"rightStick": { "deadzoneX": 0.10, "deadzoneY": 0.06 },
"leftTrigger": { "deadzone": 0.04 },
"rightTrigger": { "deadzone": 0.04 }
} Defaults by axis
The app ships with sensible defaults per axis. Y axes default a touch higher than X because thumb resting position has a slight downward bias on most controllers. Trigger defaults are deliberately low — triggers rest cleanly on the spring and rarely need a fat deadzone:
| Axis | Default inner | Default outer | When to raise |
|---|---|---|---|
| Left stick X | 0.08 | 0.97 | Drift while idle |
| Left stick Y | 0.08 | 0.97 | Thumb pulls slightly down at rest |
| Right stick X | 0.10 | 0.97 | Heavier use, more wear |
| Right stick Y | 0.06 | 0.97 | Rarely needs adjustment |
| L2 trigger | 0.04 | 0.99 | Spring loose / over-travel |
| R2 trigger | 0.04 | 0.99 | Won't hit 127 on full press |
| Touchpad X/Y | 0.00 | 1.00 | Almost never — touchpad is capacitive |
Per-axis matters
Deadzones are set per axis, not per stick. The left stick X and Y are independent — and they should be. The Y axis often needs a larger deadzone because thumb resting position usually has a slight downward bias, while the X axis sits cleanly at centre.
Default values: 0.08 for sticks (8% of range), 0.04 for triggers. Worn controllers may need 0.12 or higher on a problem axis. Pristine ones can drop to 0.05.
Inner vs outer
Universal Controller MIDI also supports an outer deadzone — the region near max travel where values get clamped to the maximum. This helps controllers that can't quite hit 127 hit it reliably without slamming the stick into the bezel.
The remapped output is linear across the live zone (between inner and outer deadzones) so dynamic range is preserved. You're losing 8% at each end and stretching the middle 84% across the full 0–127 MIDI range.
Radial vs axial deadzones
By default, deadzones are axial — applied to each axis independently. For a stick, that means the deadzone region is a square. Radial deadzones use the magnitude (distance from centre) instead, creating a circular dead region. Radial is better when the source feeds a single CC derived from stick distance; axial is better when X and Y feed two separate CCs:
{
"leftStick": {
"shape": "radial",
"innerRadius": 0.08,
"outerRadius": 0.97
},
"rightStick": {
"shape": "axial",
"deadzoneX": 0.10,
"deadzoneY": 0.06
}
} Common mistakes
- Setting deadzones before calibrating. Calibration normalises the raw range first; deadzones operate on the normalised value. Calibrate, then deadzone. See calibration.
- Symmetric X and Y on a worn left stick. Drift is rarely symmetric. If only Y drifts, raise only Y. Raising both wastes range.
- Using a global deadzone for every mapping. The per-binding override exists for a reason — your filter-cutoff CC might want a tighter threshold than your pan CC, even on the same stick.
- Forgetting the outer deadzone. Inner is famous; outer is unsung. If your max press always reads 124, set an outer deadzone at 0.97 and the value snaps to 127.
- Tuning by feel without the readout. The live controller value readout is the source of truth. Eyeballing the dot position is much less precise than reading the number.
Where to set it
Open Settings → Controller → Deadzones, or per-binding inside the mapping editor. Per-binding overrides the global setting — useful when a single mapping needs a tighter or looser threshold than the rest. Pair this with a clean calibration pass for best results.