Universal Controller MIDI

Templates

Best practices for template design

Hard-won rules for building Universal Controller MIDI templates that feel good, scale to performance, and pass marketplace review on the first try.

Updated

Most templates work. Few feel good. The gap is a handful of design rules that take seconds to follow and save hours of "why is this twitchy" debugging. Every rule on this page exists because someone (often me) shipped a template that violated it and immediately regretted it on stage or in a session.

Naming and scope

  • One template, one job. Don't try to be a finger drummer and a VJ in the same file. Split.
  • Name like a search query. DAW — Use case is the convention: FL Studio — Channel Rack + Mixer, not my fl thing.
  • Keep name under 50 chars. Long names truncate in the dropdown.
  • Suffix custom versions with (custom) or (v2) — never overwrite the source name silently.
scope one job metadata tags + DAW validate schema clean test on hardware
Best practices for template design — narrow scope, rich metadata, validate, then test on hardware.

Deadzone and poll rate

Two settings, big impact. Defaults are conservative; tune them per controller. Here's the table I keep pinned:

Use casedeadzonepoll_hzWhy
Finger drumming0.05120Tight enough to trigger cleanly
DJ scratching0.03200Latency is everything
VJ / clip launching0.0860Triggers don't need sub-frame timing
MPE / aftertouch0.02200Tiny movements matter
Drifty 3rd-party stick0.10–0.12100Filter out resting jitter
Bluetooth on slow link0.0560Don't flood the radio
OSC drone control0.04150Smooth analog beats discrete
Streamer / podcast soundboard0.0560Save CPU for OBS/Riverside
{
  "name": "Live DJ Scratch (custom)",
  "schema_version": 2,
  "midi_channel": 0,
  "deadzone": 0.03,
  "poll_hz": 200,
  "axes": { "0": 1, "1": 11 }
}

Stick corners — hysteresis matters

Set r_exit noticeably lower than r_enter. The gap is what stops chatter when you hover near a zone boundary. A tight gap (0.92 / 0.88) feels precise but jittery. A wide gap (0.92 / 0.70) feels confident.

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

Setting r_exit too low (under 0.5) means notes hang once triggered. The stick has to return almost to centre before the zone releases. Fine for sustained pads, terrible for fast playing.

Haptics — restraint wins

Adaptive triggers are intoxicating. Resist. Pick one effect per trigger and stick with it. The full effect catalogue is at adaptive effects; the short version:

  • trigger_resist for bow-like expression (continuous controllers).
  • trigger_click for hard transients (kick triggers, sample one-shots).
  • null for everything else — uniform feedback gets exhausting.
{
  "l2_haptic_effect": "trigger_click",
  "r2_haptic_effect": null
}

If a template needs more than a sentence of explanation to use, it's two templates. Split it.

For marketplace uploads

  • Test on a clean install before sharing. The 48 bundled templates set unconscious expectations.
  • Document quirks in the description, not in the JSON. Reviewers read descriptions.
  • Tag aggressively — three to five tags is the sweet spot.
  • Strip _import_meta and any other underscore-prefixed fields; the validator rejects them and they bloat your 64 KB budget.
  • Pre-flight against the approval criteria table — every auto-check should pass locally before you upload.

Most rejected uploads fail on three things: missing description, non-lowercase tags, and being a two-field diff from a bundled template. None of those are about quality — they're about hygiene. Fix them and your acceptance rate goes from 60% to 95%.

Real-world template patterns that consistently pass review

  • Tuned DAW transport — bundled DAW template + remapped face buttons + description naming the DAW version. Clear, useful, low controversy.
  • Genre-locked drum kit — 16 buttons mapped to a specific genre's GM drum layout, deadzone tuned, name like "Drill Kit — DualSense + FL Studio".
  • Hysteresis-tuned scale corners — both sticks at n: 8, scale-locked notes, wide r_enter/r_exit gap for live-playing confidence.
  • Adaptive-trigger MPE rigl2_haptic_effect: "trigger_resist" with axis routed to channel aftertouch, sticks driving expression CCs.
  • Per-controller hardware niche — fills a gap in the bundled set: 8BitDo Pro 2 paddles for transport, Steam Controller trackpads as XY pads.

Cross-references: customize, versioning, share to the marketplace, migrate from another controller.

Edit this page on GitHub Updated
ESC

Type to search.