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.

PairOUT / INScope
11 / 9Deck A: core controls, stems, per-deck FX, telemetry
22 / 10Deck B: same pattern
33 / 11Deck C: same pattern
44 / 12Deck D: same pattern
55 / 13Master & Mixer: master tempo, crossfader
66 / 14FX Units: global FX 1–4 (wet/dry, slot amounts, slot enables)
77 / 15Global: app-wide toggles
88 / 16Reserved 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 (incomingoutgoing 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:

MessageUsed ForValue Range
CC (Control Change)Continuous parameters (knobs, faders)0–127
NoteTriggers 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

SemanticMessageMeaning
UnipolarCCLinear 0 to max (0 = minimum, 127 = maximum)
BipolarCCCenter at 0.5 (0 = full cut, 64 = neutral, 127 = full boost)
TriggerNoteOn/off toggle (0 = off, 127 = on)
IndexedCCDiscrete 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.

CategoryMessage TypeNotes
EQ: Low / Mid / HighCC (knob)Bipolar knobs at 64 = unity. No kill buttons — a curve to 0 is the equivalent (see Domains)
VolumeCC (fader)Unipolar channel fader
Mixer FX: Adjust / EnableCC + NoteBipolar adjust knob, Note enable (Traktor, Virtual DJ)
Tempo: Adjust / Range / MasterCC + NoteBipolar fader, indexed range telemetry, master trigger
Transport: SyncNoteSync to master tempo
Key: Adjust / LockCC + NoteBipolar pitch shift, key-lock enable
FX Assign 1–4NoteRoute deck through FX units 1–4 (Traktor, Mixxx)
Deck FX ActiveNotePer-deck FX enable (djay)
Crossfader Assign: Left / Right / ThruNoteRoute 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 SendCC + NotePer-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 / SelectCC + Notedjay-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)

AddressMessageControlSemanticDescription
mixer.crossfaderCC 1CrossfaderBipolarMaster crossfader (0 = Deck A side, 64 = center, 127 = Deck B side)
master.tempoNote 10Set Master TempoTriggerSet master clock as tempo master (Traktor)
master.autoNote 11Auto Master ModeHoldEnable 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.

CategoryMessage TypePer Unit
Wet/DryCC (bipolar knob)One per unit
Slot 1 / 2 / 3 AmountCC (unipolar knob)Three per unit
Slot 1 / 2 / 3 EnableNote (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.

AddressMessageControlDescription
global.sendMonitorStateNote 1Request Monitor StateAsks the DJ app to broadcast current state for echo reconciliation
global.showeffects.toggleNote 2Toggle Show EffectsShows/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.high resolves 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 is docs/specs/XF-MAPPING.md.