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
.amxdUser Remote Scripts (next release). - FL Studio
.fsccontroller scripts. - Logic Pro
controller assignments.csdumps. - Bitwig
.bwcontrollerJS controller scripts (extraction only, no logic).
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:
| Source | Source concept | Maps to | Fidelity |
|---|---|---|---|
.tsi | Button → MIDI note | buttons | lossless |
.tsi | Encoder → CC | axes | lossless |
.tsi | Modifier layer 1 | flattened into base | lossless |
.tsi | Modifier layer 2+ | _import_meta.dropped_layers | dropped |
.tsi | LED feedback | — | dropped |
.tsi | Conditional ("if deck B playing") | — | dropped |
.midi-map | Reaper CC binding | axes | lossless |
.midi-map | Reaper note binding | buttons | lossless |
| CSV | Index + note | buttons | lossless |
.json | v1 schema | migrated to v2 | lossless |
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
- Templates → Import, pick the source file.
- Review the conversion report (drop-list + warnings).
- Save as a new template, or merge into an existing one.
- Test in your DAW; tweak the parts that didn't survive translation.
- Strip
_import_metabefore 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-mapexport gives you a cleanbuttonstable 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.