Universal Controller MIDI

Templates

Import a .tsi or DAW-specific file

Convert Traktor .tsi mappings and other DAW-native controller files into Universal Controller MIDI templates. What converts cleanly, what doesn't.

Updated

You've got a stash of .tsi files from Traktor, a few Ableton drum-rack mappings, maybe a Live .amxd wrapper. Universal Controller MIDI can ingest most of them via Templates → Import and convert to the native schema_version: 2 JSON. The conversion is one-way — the importer reads the source format, builds the closest valid template, and surfaces everything it had to drop in a report.

That last bit matters. Most DAW-native formats encode behaviour the template schema deliberately doesn't (modifier layers, conditional logic, LED feedback loops). Importing isn't free — it's a starting point that gets you 70–90% of the way there.

Supported formats now

  • .tsi — Native Instruments Traktor controller mappings. Button-to-CC pairs translate cleanly. Modifier layers flatten into the first layer.
  • .json — Other Universal Controller MIDI exports (cross-version import).
  • .midi-map — Reaper's MIDI Learn export. CC mappings only.
  • Generic CSV — Two columns, button index and MIDI note, header row optional.

Roadmap formats

  • Ableton Live .amxd User Remote Scripts (next release).
  • FL Studio .fsc controller scripts.
  • Logic Pro controller assignments.cs dumps.
  • Bitwig .bwcontroller JS controller scripts (extraction only, no logic).
.tsi / source controls[] channels[] commands[] convert template.json bindings midi_channel haptics
Import a .tsi file — source fields convert into the UCM v2 schema, ready to load.

Source format → target field map

Here's exactly which source-format pieces land where in the resulting schema_version: 2 template. Use this to predict what will and won't survive a round-trip:

SourceSource conceptMaps toFidelity
.tsiButton → MIDI notebuttonslossless
.tsiEncoder → CCaxeslossless
.tsiModifier layer 1flattened into baselossless
.tsiModifier layer 2+_import_meta.dropped_layersdropped
.tsiLED feedbackdropped
.tsiConditional ("if deck B playing")dropped
.midi-mapReaper CC bindingaxeslossless
.midi-mapReaper note bindingbuttonslossless
CSVIndex + notebuttonslossless
.jsonv1 schemamigrated to v2lossless

What converts cleanly, what doesn't

Lossless: button-to-note, axis-to-CC, channel, deadzone (when present). Lossy or dropped:

  • Modifier layers — Traktor's "shift" pages flatten to the base layer; the rest are dumped into a sidecar JSON for you to wire manually.
  • Conditional logic — anything like "if deck B playing, send X" is ignored. Templates are stateless by design.
  • LED feedback — Universal Controller MIDI handles its own haptics and visuals, not LED state on the source controller.
  • Custom value curves — linear/log/exponential CC scaling collapses to linear; re-add curves manually if you depend on them.
{
  "name": "Imported from Traktor F1.tsi",
  "schema_version": 2,
  "midi_channel": 0,
  "deadzone": 0.05,
  "poll_hz": 100,
  "buttons": { "0": 36, "1": 37, "2": 38, "3": 39 },
  "axes": { "0": 7, "1": 8, "2": 11, "3": 12 },
  "_import_meta": {
    "source": "tsi",
    "source_file": "Traktor F1.tsi",
    "modifiers_dropped": 2,
    "led_bindings_dropped": 14,
    "imported_at": "2026-05-29T10:00:00Z"
  }
}

An example sidecar — the file that lives next to the imported template carrying everything that didn't survive translation:

{
  "source_file": "Traktor F1.tsi",
  "dropped_modifier_layers": [
    { "trigger": "Shift", "bindings": 16 },
    { "trigger": "Shift+Hold", "bindings": 8 }
  ],
  "dropped_led_bindings": 14,
  "dropped_conditionals": [
    "if deck_b.is_playing then cc 23"
  ]
}

The _import_meta block is preserved through saves so you remember the file's origin. Strip it before sharing to the marketplace — the validator rejects unknown top-level fields, and the underscore prefix flags it as private metadata.

Workflow

  1. Templates → Import, pick the source file.
  2. Review the conversion report (drop-list + warnings).
  3. Save as a new template, or merge into an existing one.
  4. Test in your DAW; tweak the parts that didn't survive translation.
  5. Strip _import_meta before sharing.

Don't import the same .tsi twice. The second import doesn't overwrite — it creates a sibling, and you'll wonder which one your DAW is reacting to. If you need to re-import, delete the previous template first.

Universal Controller MIDI's schema is stateless and flat on purpose. That trade-off is what makes .tsi conversion lossy: Traktor encodes behaviour, we encode mappings. Behaviour belongs in the DAW, not the controller layer.

Real-world template patterns from imports

  • Traktor F1 finger-drum kit — strip shift layers, keep the 16 base pads, re-channel for your drum bus.
  • Traktor Kontrol Z2 mixer remap — encoders survive as axes; you'll rewire the cue buttons manually.
  • Reaper transport remap.midi-map export gives you a clean buttons table for play/stop/record.
  • CSV from a spreadsheet — fastest way to brute-force a 64-pad layout; build it in Numbers/Excel, import, done.
  • Legacy v1 JSON upgrade — drop in any old export, the importer migrates it through the v1 → v2 path documented at versioning.

Once it works, bump the schema version if needed and consider sharing your converter recipe. For the deeper philosophy of mapping surfaces, see mapping editor concept.

Edit this page on GitHub Updated
ESC

Type to search.