Universal Controller MIDI

Templates

Customize a template

Override fields on a built-in template without forking. Change MIDI channel, deadzone, button notes, and stick corner counts in place.

Updated

You almost never want to write a template from scratch. The faster move is customize an existing one — duplicate, override the fields that matter, save. The app keeps both versions, your edits live in the user library, and the original built-in stays clean even if you nuke your custom version.

Customisation is also how most marketplace templates are born. Somebody takes FL Studio — Channel Rack, swaps the channel, tunes the deadzone for their drifty third-party stick, adds touchpad XY, and ships the result. That's a totally valid contribution.

Duplicate first, edit second

Hit Templates → Duplicate on any preset. The app writes a copy to your user library with a (custom) suffix and selects it. Edit fields in the UI panels — buttons, axes, sticks, haptics — and changes save on blur. No "Save" button, no version conflicts, no orphaned drafts.

The user library is plain JSON in your app data directory. Open the folder from Settings → Reveal library and edit with your favourite editor if the UI feels slow. The app watches the directory and hot-reloads changes within ~250ms.

stock duplicate override channel, CC, curve save new slug
Customise a template — duplicate the stock one, override fields, save under a new slug.

The fields most worth changing

Eighty percent of customisations touch three things. Here's the cheat sheet, with sane ranges and what each value actually does:

FieldDefaultSafe rangeWhat it controls
midi_channel00–15MIDI channel for all notes/CCs in this template
deadzone0.050.01–0.20Radial deadzone applied to both sticks
poll_hz10030–250How often controller state is sampled
buttonsvariesMIDI notes 0–127Face/shoulder/special button to note number
axesvariesCC numbers 0–127Stick / trigger axis to MIDI CC
left_stick_corners.n84, 8, 12, 16Angular zone count on left stick
right_stick_corners.n84, 8, 12, 16Angular zone count on right stick
{
  "name": "Beat Making — Finger Drumming (custom)",
  "schema_version": 2,
  "midi_channel": 2,
  "deadzone": 0.08,
  "poll_hz": 120,
  "buttons": { "0": 36, "1": 38, "2": 40, "3": 41 },
  "axes": { "0": 1, "1": 11 }
}

Stick corners — the secret weapon

Most users ignore left_stick_corners and right_stick_corners until they discover them. Each stick can fire up to 16 notes based on angular zone. Set n to the zone count, list the notes, then tune r_enter / r_exit for hysteresis (prevents chatter at the deadzone boundary). Read the deep dive at stick corners.

{
  "left_stick_corners": {
    "enabled": true,
    "n": 8,
    "notes": [60, 62, 64, 65, 67, 69, 71, 72],
    "r_enter": 0.9,
    "r_exit": 0.7
  }
}

If r_exit is higher than r_enter the zone will retrigger on every micro-jitter. Always keep r_exit < r_enter, with at least a 0.10 gap between them.

Trigger haptics

On PS5 controllers, l2_haptic_effect and r2_haptic_effect turn analog triggers into tactile feedback. Set to "trigger_resist" for bow-like expression, "trigger_click" for hard transients, or null to keep the trigger free-running. The full effect catalogue lives at adaptive effects.

Customising in place beats forking because every saved field is independent. If a future schema bump adds vibration_curve, your customised template inherits the new field with a sensible default — a forked one wouldn't.

Real-world template patterns

  • Channel-matched DAW preset — clone FL Studio — Channel Rack, set midi_channel to 10 so it plays nice with drum tracks routed there.
  • Drift-tolerant live rig — clone any template, bump deadzone to 0.10–0.12 for stage-worn controllers.
  • Scale-locked corners — clone Beat Making, replace left_stick_corners.notes with a C-minor pentatonic, save per key.
  • Expression-heavy MPE — clone MPE Polyphonic, drop deadzone to 0.02 and bump poll_hz to 200.
  • Haptic-restricted streamer rig — clone any template, set both haptic fields to null so the controller stays quiet during long sessions.

Polished it? See best practices for safe defaults, then share when it's ready.

Edit this page on GitHub Updated
ESC

Type to search.