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. The channel sets the direction: Fusor Studio sends on channels 1–8 and the DJ app sends 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 (a loopMIDI port named Fusor Studio on Windows, 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:

MessageUsed ForValue Range
CC (Control Change)Continuous controls (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) has 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, because a curve to 0 is the equivalent (see Domains)
VolumeCC (fader)Unipolar channel fader
Mixer FX: Amount / Enable / SelectorCC + NoteBipolar amount knob, Note enable (Traktor, Virtual DJ). Selector picks which effect: five positions on Traktor, and an action-only control (see below)
Tempo: Adjust / Range Selector / MasterCC + NoteBipolar fader, indexed range selector, 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 in Teach Mode's Crossfader group. See Teach Mode
Stems 1–4: Volume / Filter / FX SendCC + NotePer-stem controls including Filter/FX-Send enables (Traktor, with stem volumes also supported on djay, Virtual DJ, and rekordbox). No mute, because a volume curve to 0 is the equivalent
Per-deck FX banks: Amount / Dry/Wet / 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

Two of these are action-only. Mixer FX Selector and Tempo Range Selector pick one position from a short list rather than sweeping through a range, so they are settings you establish before or after a transition, not parameters a fusor modulates during one. They are not domain parameters and do not appear in Supported Parameters. You reach them from an action, by name: SET deck.incoming.mixerfx.select REVERB.

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.tempoCC 10Master Tempo SelectorSelectorWhich one is tempo master: the master clock (0) or Deck A to D (32, 64, 95, 127) (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 rather than per-deck. Each unit exposes the same control set; the slot enable for each effect uses a separate Note number.

CategoryMessage TypePer Unit
Dry/WetCC (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)

Unused. Reserved for 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.
  • Fusors use role-based addresses (incoming.*, outgoing.*). Fusor Studio resolves these to absolute deck addresses at runtime, and re-resolves them after role swap.
  • Continuous controls 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 specification that governs the schema is docs/specs/XF-MAPPING.md.