Blog Adaptive Triggers 11 min read

Adaptive Trigger Velocity Curves: DualSense Deep Dive

Adaptive trigger velocity curves on the DualSense — three force zones, response shapes, MPE Z mapping, and Bezier presets. Build expressive MIDI triggers.

By Aidxn Design

Adaptive trigger velocity curves are what separates a DualSense from every other USB MIDI controller, and most gamepad-to-MIDI bridges throw them away. They treat the triggers as glorified buttons — pulled or not pulled, a single CC value rising linearly with travel. Spoiler: that's leaving 90% of the controller on the table. The Sony DualSense has a brushless-motor adaptive trigger on L2 and R2, an 8-bit travel sensor at 250 Hz, and three programmable force zones that work as discrete musical zones once the bridge exposes them. This is a deep dive into how to use those zones, shape the response curve, and send force commands back so the player physically feels the curve they are playing through.

TL;DR
  • What: use DualSense adaptive triggers as expressive velocity curves, not on/off buttons.
  • What you need: DualSense, Universal Controller MIDI v1.2+, a DAW that accepts 7-bit CC or MPE Z (Ableton, Bitwig, Logic).
  • Time: 30 minutes to set up your first three-zone velocity curve.
  • Cost: bridge Pro license $89. Free tier covers single-zone curves.

What you'll learn

  • How the DualSense brushless trigger motor maps to three programmable musical zones.
  • The math behind linear, exponential, log, S-curve, and stepped response shapes — and when each one wins.
  • How to write a triggers.json preset the bridge can hot-load.
  • How to route per-zone CC into MPE Z for polyphonic chord pressure.
  • The "feel the kick" haptic loop — sidechain a trigger force command to the kick bus.

What an adaptive trigger actually does (and why it suits velocity curves)

Each DualSense trigger has a brushless motor that applies variable resistance against your finger across the trigger's travel range. Travel reports as an 8-bit unsigned value, 0–255, sampled at the bridge's poll rate (default 250 Hz). The motor accepts force commands across the same range and can hold any force level indefinitely or pulse at audio rates.

Sony's SDK exposes seven trigger effect modes: Off, Feedback, Weapon, Vibration, SlopeFeedback, MultiplePositionFeedback, and MultiplePositionVibration — documented in the PlayStation developer reference and reverse-engineered for cross-platform use in the open-source hidapi community. The bridge wraps these into musically-useful primitives: zones, resistance curves, and haptic ticks. The full hardware spec is covered in the haptic feedback post and the PS5 trigger feedback walkthrough.

Why a curve beats a ramp

A linear CC ramp from 0–127 across trigger travel is fine for filter cutoff. It is terrible for velocity. Real velocity curves are logarithmic — small pressure changes at low force should produce small output changes, then the response should steepen so a hard squeeze produces a maximum velocity hit. That is how piano keys, drum pads, and saxophone reeds all behave, and how human hands expect to interact with pressure-sensitive surfaces.

The three force zones inside an adaptive trigger velocity curve

The whole game is here: divide trigger travel into up to three contiguous zones, each with its own response curve and MIDI output. The defaults that ship with the Ableton preset:

  • Zone 1 (rest → 30%): light resistance, sends CC values 0–42. Soft expression range — strings swells, sub-bass fade-in.
  • Zone 2 (30% → 70%): stepped resistance bump at the boundary, sends CC values 43–85. Mid-range expression — filter sweep useful range.
  • Zone 3 (70% → 100%): hard wall, sends CC values 86–127 with a velocity-triggered note-on at the boundary crossing. The bottoming-out feels like a kick drum pad.

The genius move is the boundary haptics. The trigger applies a force step at each zone boundary, so the player feels exactly where the response curve changes shape. You play through detents you can feel — a clutch with three gears.

127 0 rest full pull (255) trigger travel (8-bit) linear S-curve log
Three velocity-curve shapes — linear, S-curve, log — mapping trigger travel to MIDI value.

Zone configuration JSON

The bridge exposes zones as JSON in ~/Library/Application Support/UCMIDI/triggers.json. Default L2:

{
  "trigger": "L2",
  "zones": [
    { "start": 0,   "end": 76,  "curve": "exp",    "ccLow": 0,  "ccHigh": 42,  "resistance": 30  },
    { "start": 77,  "end": 178, "curve": "linear", "ccLow": 43, "ccHigh": 85,  "resistance": 90  },
    { "start": 179, "end": 255, "curve": "log",    "ccLow": 86, "ccHigh": 127, "resistance": 200,
      "noteOnAtStart": { "note": 36, "velocity": "fromForce", "channel": 10 } }
  ]
}

resistance is the motor force in the bridge's 0–255 range. curve controls how trigger travel inside a zone maps to CC output. noteOnAtStart fires a MIDI note when the player crosses into the zone, with velocity sampled from the entry force.

Velocity-curve shapes that matter for adaptive triggers

Picking the right shape is the difference between "trigger feels alive" and "trigger feels like a toggle switch". The five built-in curves and their formulas, with the actual MIDI output at three reference travel positions (0.25, 0.5, 0.75 of full pull), scaled to 0–127:

CurveFormula (t in 0..1)Out @ 25%Out @ 50%Out @ 75%Best for
Linear127 · t326495Filter cutoff, pan
Exponential127 · t^2.452467Drum velocity, keyboard feel
Logarithmic127 · log(1+6t)/log(7)5083108Orchestral swells, slow opens
S-curve127 · 1/(1+e^(-12(t-0.5)))664121Sidechain duck, gate gestures
Stepped-8127 · floor(8t)/7185490Chord/key change, scene jump
Bezier (Pro)custom 4-pointMatch MPC, Seaboard, P-125

The bridge supports five curve shapes and a custom mode for power users.

Linear

Output rises 1:1 with input. Best for filter cutoff, pan position, any continuous control where the player wants predictable, even response. Boring but reliable.

Exponential

Output is (travel / 255) ^ 2.4 scaled to the CC range. Slow response at low force, fast acceleration near the top. Best for keyboard-style velocity emulation, drum velocity, articulation control. Matches the way most acoustic instruments respond to player input.

Logarithmic

Output is log(1 + travel * 6) / log(7). Fast response at low force, plateaus near the top. Best for soft expression — orchestral hairpins, slow filter opens, anything where a small input should produce immediate musical change without punishing the player for squeezing all the way.

S-curve

Sigmoid centered at trigger midpoint. Slow at both extremes, fast through the middle. Best for binary-feeling-but-continuous gestures — sidechain ducks, gate threshold modulation, controls that want a clear "on" zone and a clear "off" zone with a fast transition between.

Stepped

Output quantised to 4, 8, 12, or 16 discrete values across the zone. Pair it with a force detent at each step and the trigger feels like a tactile rotary encoder. Best for chord selection, key changes, beat repeat rate selection, scene jumping.

Custom — Bezier handles

Pro license unlocks a Bezier editor with four control points per zone. Drag the curve to match a hardware response you already love — I've matched the velocity curve of an MPC One drum pad, a Roli Seaboard's strike response, and a Yamaha P-125's heavy-touch piano setting. Export the JSON, share it with the band, version-control it.

L2 / R2 zones along trigger travel Zone 1 CC 0–42 Zone 2 CC 43–85 Zone 3 CC 86–127 rest hard wall ↑ haptic detents at zone boundaries
Trigger pressure crosses three zones; motor pulses a detent at each boundary the player feels.

Mapping adaptive trigger velocity curves to MPE Z

Single-channel CC is fine until you hold a chord and want every note to breathe independently. For that the trigger needs to talk MPE. The bridge supports MPE Z (channel pressure) per active note. Setup:

  1. Open Settings → MPE in the bridge and enable MPE output. The bridge switches its output port from a single-channel port to a 15-channel MPE zone with channel 1 as the master.
  2. Set R2 trigger to MPE Z source for active notes. Now any held note from the face buttons receives per-note channel pressure from R2.
  3. In the DAW (Bitwig and Live 12 both support MPE natively), enable MPE on the receiving track.

The result: hold a chord on the face buttons, sweep R2, every note in the chord receives the same Z pressure curve simultaneously. Pair with the MPE post for the polyphonic per-finger setup.

Force feedback that mirrors the audio (haptic curves)

The trigger motor pulses at frequencies up to 200 Hz — that is audio-rate kick-drum territory. The bridge supports two feedback modes that close the loop between audio output and player feel:

  • Beat-locked pulse: trigger pulses on every quarter note from Ableton Link or DAW clock. Player feels the tempo through the controller. Great for keeping time without monitoring.
  • Sidechain-driven force: a separate MIDI CC feeds the trigger resistance in real time. Map a kick-drum envelope follower to it and every kick gives the trigger a hard pump. Player physically feels the kick. Covered in the trigger feedback post.

The "feel the kick" curve

My favourite production curve: R2 mapped to filter cutoff with an exponential curve, resistance sidechained to the kick drum bus. Ride the filter open and you feel the kick punching back through the trigger. The trigger becomes a haptic monitor for the rhythm section — after a few hours you stop watching the meters because your finger is the meter. Yes, really.

8-bit pressure · 250 Hz · one sample every 4 ms 0 8 ms 16 ms 24 ms 32 ms sample cursor
Each dot is a fresh 0–255 pressure read; the bridge sees a new sample every 4 ms.

Per-DAW gotchas for adaptive trigger velocity curves

Ableton Live 12

CC values smooth automatically over 5 ms when fed to a parameter — good for most cases, bad for fast trigger work. Bypass it by routing CC through a Max for Live patch with its own envelope, or use the bridge's Send raw CC mode. MPE Z requires Live 12.0.5 or later — earlier versions drop Z messages silently.

Bitwig 5

MPE works out of the box. Note Grid responds to all five MPE dimensions including the trigger's Z — see the Bitwig modulator mapping post for hooking the trigger into the Modulator stack. Latency is the lowest of any DAW I have tested at 4.2 ms mean for a CC ride.

Logic Pro 11

7-bit CC works fine. MPE Z support is partial — Logic accepts channel pressure but does not visualise it in the piano roll. The workaround: record the MPE part, then convert Z to a standard automation lane.

Velocity-curve presets worth stealing

Three curves that have earned their place in my live set:

  • "Sax breath": single zone, log curve from 0–110, motor force ramps with travel. Soft at first, gentle plateau, light resistance. Best for woodwind VST expression.
  • "Drum velocity": three zones, expo curves, hard wall at zone 3 with note-on triggered at boundary. Velocity from force at the boundary crossing. Best for drum-rack triggers.
  • "Filter wobble": two zones, S-curve in zone 1, stepped 8 in zone 2 with motor detents. Fast filter rides in zone 1, then quantised resonance jumps in zone 2. Built for bass music.

Recording adaptive trigger velocity curves as automation

Live recording the trigger CC stream produces noisy automation lanes — 250 Hz input rate, fine wiggle that adds CPU and looks ugly in the arrangement view. The bridge has a Smooth output mode that applies a single-pole low-pass to the CC stream before it hits the DAW. Cutoff is configurable from 10 Hz to 120 Hz. Set it to 40 Hz for general production work — fast enough to keep gestures musical, slow enough that automation lanes look clean.

For drum velocity work, leave smoothing off. The whole point is the sharp transient at the boundary crossing — smoothing rounds it off and the kick loses punch. Smoothing belongs on filter sweeps, not on hits. The bridge stores the setting per mapping, so one trigger can be smoothed and the other raw.

Take folder workflow

Recording four takes of the same trigger ride into Live's take folder gives you a comp source for the cleanest pass. The bridge tags every CC value with its source curve so even if you re-record with a different curve later, you can identify which take used which curve in the take folder name. Useful for A/B-ing curve shapes after the fact.

When to ignore adaptive trigger velocity curves entirely

Using the triggers for transport and macro-level controls? Default linear CC is fine. Velocity curves and force feedback are worth the setup time when the trigger is the expressive surface — doing the work a violin bow does, not the work a foot pedal does. For a sustain pedal, leave it alone. For lead expression, this is the highest-leverage part of the controller.

Universal Controller MIDI Pro unlocks the full Bezier editor and the sidechain feedback modes. The free tier covers single-zone linear and exponential curves, enough to get the idea. Build your first three-zone curve and you will not go back to on/off triggers.

FAQ

How are adaptive trigger velocity curves different from a normal MIDI velocity curve?

A normal MIDI velocity curve is a software remap of a single 0–127 strike value. An adaptive trigger velocity curve runs on a continuous 8-bit pressure stream at 250 Hz, divided into up to three force zones with physical resistance changes the player can feel mid-press. It is closer to a wind controller's breath curve than to a keyboard velocity curve.

Do I need MPE support to use the velocity curves?

No. Single-channel 7-bit CC works fine for filter sweeps, drum velocity, and macro control. MPE Z is only needed if you want per-note channel pressure on a held chord, which requires Ableton Live 12.0.5+, Bitwig 5, or Logic Pro 11 with the MPE workaround documented above.

Will the adaptive trigger motor wear out with constant force commands?

Sony rates the trigger motors for a service life that exceeds typical gaming use, but holding maximum resistance continuously will heat the motor. The bridge throttles sustained force above 200 on the 0–255 scale and inserts micro-rests every 30 seconds to keep the motor cool.

Can I import velocity curve presets from other users?

Yes — the bridge stores curves as JSON in ~/Library/Application Support/UCMIDI/triggers.json. Drop a community preset into that folder, restart the bridge, and it appears in the curve picker. The Pro Bezier editor exports the same JSON shape so curves are portable across machines.

Does the curve work over Bluetooth?

Yes, but with caveats. Trigger travel reporting drops to ~100 Hz over Bluetooth instead of 250 Hz wired, and force-feedback commands have 15–20 ms of extra latency. Velocity capture is still musical, but boundary haptics feel mushy. Wired USB-C is strongly recommended for serious velocity-curve work.

Keep reading

More setup walkthroughs