MIDI Mapping
This is Fusor Studio's canonical MIDI mapping: the abstract control addresses, MIDI channels, and message assignments used to communicate with DJ software. The mapping is the same regardless of which DJ application you use.
Channel layout
Fusor Studio runs over one MIDI bus. Direction is carried by channel: Fusor Studio sends on channels 1–8 and the DJ app replies with telemetry on channels 9–16. For every bidirectional address, the IN channel is always OUT + 8.
| Pair | OUT / IN | Scope |
|---|---|---|
| 1 | 1 / 9 | Deck A: core controls, stems, per-deck FX, telemetry |
| 2 | 2 / 10 | Deck B: same pattern |
| 3 | 3 / 11 | Deck C: same pattern |
| 4 | 4 / 12 | Deck D: same pattern |
| 5 | 5 / 13 | Master & Mixer: master tempo, crossfader |
| 6 | 6 / 14 | FX Units: global FX 1–4 (wet/dry, slot amounts, slot enables) |
| 7 | 7 / 15 | Global: app-wide toggles |
| 8 | 8 / 16 | Reserved for future use |
Why one bus with a channel split: separating OUT and IN by channel on a single bus prevents echo loopback the same way two physical buses would, while letting you configure one virtual MIDI bus (FusorBus or loopMIDI, for example) instead of two. Anything that belongs to a single deck (stems and per-deck FX routing included) lives on that deck's channel, so role swap (incoming ↔ outgoing resolving to deck.X) is always a single channel pair.
The CC and note numbers themselves are identical on the OUT and IN sides; only the channel differs.
Message types
Fusor Studio uses two MIDI message types:
| Message | Used For | Value Range |
|---|---|---|
| CC (Control Change) | Continuous parameters (knobs, faders) | 0–127 |
| Note | Triggers and toggles (buttons) | 0 = off, 127 = on |
The CC and Note namespaces are independent per channel; each has its own 128-slot budget.
Control semantics
| Semantic | Message | Meaning |
|---|---|---|
| Unipolar | CC | Linear 0 to max (0 = minimum, 127 = maximum) |
| Bipolar | CC | Center at 0.5 (0 = full cut, 64 = neutral, 127 = full boost) |
| Trigger | Note | On/off toggle (0 = off, 127 = on) |
| Indexed | CC | Discrete value picks an index. Used for selectors |
Deck controls (OUT channels 1–4, IN channels 9–12)
Every deck (A through D) carries the same control set on its own channel. The table below summarizes the categories; full per-entry detail is in scripts/canonical_mapping.json.
| Category | Message Type | Notes |
|---|---|---|
| EQ: Low / Mid / High | CC (knob) | Bipolar knobs at 64 = unity. No kill buttons — a curve to 0 is the equivalent (see Domains) |
| Volume | CC (fader) | Unipolar channel fader |
| Mixer FX: Adjust / Enable | CC + Note | Bipolar adjust knob, Note enable (Traktor, Virtual DJ) |
| Tempo: Adjust / Range / Master | CC + Note | Bipolar fader, indexed range telemetry, master trigger |
| Transport: Sync | Note | Sync to master tempo |
| Key: Adjust / Lock | CC + Note | Bipolar pitch shift, key-lock enable |
| FX Assign 1–4 | Note | Route deck through FX units 1–4 (Traktor, Mixxx) |
| Deck FX Active | Note | Per-deck FX enable (djay) |
| Crossfader Assign: Left / Right / Thru | Note | Route the deck to a side of the crossfader. Notes 65 / 66 / 67; Thru is rekordbox-only. Taught as a set under Teach Mode's Global context — see Teach Mode |
| Stems 1–4: Volume / Filter / FX Send | CC + Note | Per-stem controls incl. Filter/FX-Send enables (Traktor, with stem volumes also supported on djay, Virtual DJ, and rekordbox). No mute — a volume curve to 0 is the equivalent |
| Per-deck FX banks: Amount / Wet/Dry / Route / Enable / Select | CC + Note | djay-specific per-deck FX bank controls |
| Playing (telemetry) | Note (in) | Deck play state (1 = playing, 0 = stopped). DJ app → Fusor Studio. Read-only |
App availability is encoded per entry via the apps field. Stems and per-deck FX banks are app-specific; universal controls (EQ, Volume, Crossfader, Tempo, Key) work on every supported app.
Master / Mixer (OUT channel 5, IN channel 13)
| Address | Message | Control | Semantic | Description |
|---|---|---|---|---|
mixer.crossfader | CC 1 | Crossfader | Bipolar | Master crossfader (0 = Deck A side, 64 = center, 127 = Deck B side) |
master.tempo | Note 10 | Set Master Tempo | Trigger | Set master clock as tempo master (Traktor) |
master.auto | Note 11 | Auto Master Mode | Hold | Enable automatic tempo master selection (Traktor) |
FX Units (OUT channel 6, IN channel 14)
Fusor Studio addresses FX Units 1–4 globally on channel 6, not per-deck. Each unit exposes the same control set; the slot enable for each effect uses a separate Note number.
| Category | Message Type | Per Unit |
|---|---|---|
| Wet/Dry | CC (bipolar knob) | One per unit |
| Slot 1 / 2 / 3 Amount | CC (unipolar knob) | Three per unit |
| Slot 1 / 2 / 3 Enable | Note (hold) | Three per unit |
FX Units are supported in Traktor and Mixxx.
Global (OUT channel 7, IN channel 15)
App-wide toggles that don't belong to a deck or FX unit.
| Address | Message | Control | Description |
|---|---|---|---|
global.sendMonitorState | Note 1 | Request Monitor State | Asks the DJ app to broadcast current state for echo reconciliation |
global.showeffects.toggle | Note 2 | Toggle Show Effects | Shows/hides the FX panel (djay) |
Reserved (OUT channel 8, IN channel 16)
Currently unused. Reserved for future expansion without renumbering the existing channels.
Notes on the mapping
- All addresses follow the pattern
{scope}.{parameter}. For example,deck.a.eq.highresolves to Channel 1, CC 3. - fusor schemas use role-based addresses (
incoming.*,outgoing.*). The Control Surface API resolves these to absolute deck addresses at runtime, and re-resolves them after role swap. - Continuous parameters use CC messages. Triggers and toggles use Note messages.
- MIDI output is quantized to 128 steps (0–127). This is the resolution limit of standard 7-bit MIDI.
- Bidirectional controls both send and receive. Fusor Studio sends on the OUT channel and reads telemetry back on the IN channel (= OUT + 8) for the same CC or note number.
- The authoritative machine-readable mapping is
scripts/canonical_mapping.json(schema version 3.1; the v3.1 normalization expands per-deck templates programmatically while keeping the channel layout described above unchanged from v3.0). The specification that governs the schema isdocs/specs/XF-MAPPING.md.