Teach Mode

Teach Mode is the recommended way to build or maintain a DJ-app MIDI mapping against Fusor Studio's canonical mapping. It exposes every entry in the canonical mapping as a row with a Send button and a Test button, so you can drive the DJ app's own MIDI-learn workflow one binding at a time without a hardware controller, then confirm the binding landed on the right control.

Use it when:

  • You're building a fresh TSI or mapping for Traktor, Mixxx, djay Pro, or Virtual DJ.
  • You're validating that an existing mapping still matches the canonical channel/CC/note assignments.
  • You're isolating a single binding to confirm it routes the way you expect.

Opening Teach Mode

Settings > Teach Mode tab.

The tab opens with two dropdowns at the top (Context and Direction) and a list of grouped entries below them. Default selection is Deck A / In.


The Context dropdown

Teach Mode shows a lot of bindings (every entry in the canonical mapping), so the context dropdown narrows the list to one MIDI channel's worth at a time:

ContextCanonical channelShows
Deck Ach 1Deck A controls only
Deck Bch 2Deck B controls only
Deck Cch 3Deck C controls only
Deck Dch 4Deck D controls only
Master & Mixerch 5Master tempo + crossfader
FXch 6All four FX units
Globalch 7App-wide toggles (for example, sendMonitorState), plus the Crossfader Assign subgroup for the deck → crossfader-side routing controls
AllEvery entry, grouped by namespace

(The dropdown labels themselves do not include the channel; it's listed here only as a reference. Each row shows its effective channel as dimmed text.)

Pick the context that matches the section of your DJ-app mapping you're working on.


The Direction dropdown

Direction selects which side of the DJ app's MIDI mapping you are teaching:

DirectionUse forSend channel
In (to {DJ app})The DJ app's In tab. Bindings the DJ app receives from Fusor StudioCanonical channel (for example, crossfader on ch 5)
Out (from {DJ app})The DJ app's Out / feedback tab. Bindings the DJ app sends back to Fusor StudioCanonical channel + 8 (for example, crossfader on ch 13)

The CC or note number is identical in both directions; only the channel differs. This follows the canonical channel split (mapping schema v3.0/v3.1): Fusor Studio sends on channels 1-8, the DJ app replies on channels 9-16.

Direction also filters the entry list:

  • In mode hides entries Fusor Studio doesn't send (only canonical out and bidirectional rows are shown).
  • Out mode hides entries Fusor Studio doesn't receive (only canonical in and bidirectional rows are shown).

Almost every entry is bidirectional and appears in both modes on different channels. The exceptions are worth knowing:

  • In mode only: Request Monitor State and Toggle Show Effects. Fusor Studio sends these and never expects an answer.
  • Out mode only: Playing, the per-deck play state. Fusor Studio only ever reads it, so it belongs to the DJ app's feedback tab.

The per-row channel badge always reflects the effective channel for the active direction. The crossfader shows ch 5 in In mode and ch 13 in Out mode.

Your DJ app filters the list too

The entry list is narrowed by a third axis the two dropdowns don't show: the DJ application selected in Settings → Connection. Entries that declare which apps they apply to are hidden when your app isn't among them. So All means "every entry that applies to your DJ app," not every entry in the canonical mapping. Switching apps can change what you see without you touching either dropdown.


Subgroups and rows

Within a context, entries are grouped into collapsible subgroups by category. For deck contexts the subgroups are EQ, Volume, Mixer FX, Tempo, Transport, FX Assign, Key, Stems, and Playback. The FX context groups by FX unit (FX 1 through FX 4). The Master context groups into Master and Mixer. The Global context has two subgroups: Global (app-wide toggles) and Crossfader Assign.

The Crossfader Assign subgroup holds the eight controls that route each deck to the left or right side of the crossfader (Deck A — Xfader Assign Left, Deck A — Xfader Assign Right, and the same pair for decks B, C, D). These controls technically belong to each deck's MIDI channel (Deck A's assign binding sits on channel 1, Deck B's on channel 2, and so on) but they are mixer-level decisions about routing, not per-deck adjustments. They surface under Global rather than under each deck so all eight live side-by-side and are easy to teach as a set. For the same reason, the per-deck contexts (Deck A through Deck D) deliberately do not show them. The All context also collects them into the same Crossfader Assign subgroup.

On rekordbox the subgroup holds twelve rows rather than eight: rekordbox exposes a Thru assignment per deck alongside Left and Right.

The Action Editor's address picker follows the same convention: the Crossfader Assign addresses appear under the Common context in a Crossfader Assign subgroup with the same Deck X — label prefix, and the per-role contexts (incoming / outgoing) and per-deck contexts skip them.

Each subgroup label shows an entry count, e.g. EQ (3). Click the chevron to expand or collapse.

Each row shows:

  • Control label. For example, "EQ High", "Volume", "Playing".
  • MIDI detail. CC 3 for control changes, or a note name + number for notes (for example, F4 (65) for Deck A — Xfader Assign Left). Note names use scientific pitch, so note 0 displays as C-1 (0).
  • Channel. ch N, the effective channel for the current direction.
  • Control hint. Knob, hold, momentary, and so on.
  • Send button. Fires the MIDI message.
  • Test button. Modulates the bound control so you can confirm it's bound to the right one.

The Send button

Click Send to fire the entry's MIDI message. Both kinds send a pair, 50 ms apart, on the entry's channel:

  • Note entries. Note On, then Note Off.
  • CC entries. CC value 64, then the control's own rest value. On an indexed control such as Tempo Range, whose values are discrete positions rather than a sweep, both messages are 64.

The first message is what MIDI-learn binds to: one clean, mid-range event, which is what learn workflows expect. The second returns the control to where it belongs, so teaching a binding doesn't leave a fader parked halfway.

On a knob whose rest value is the middle (an EQ, a filter) both messages are 64, so you may see no movement at all. That's correct, and it's what the Test button is for.


The Test button

A single Send is ambiguous: a knob that jumps once could just as easily be its neighbor catching the message. Test removes the ambiguity by actuating the bound control for a couple of seconds, so you watch the DJ app and confirm the right control moved:

  • CC controls. The control sweeps across its full range and returns to its rest value.
  • Note and trigger controls. The control blinks a few times and ends off.

A Test always settles the control back to neutral, whether it finishes on its own, you start another Test before it finishes, or you close the Settings window mid-run. You don't need a deck playing to run one.

One exception, and it's the DJ app's doing rather than Fusor Studio's. Some controls can't be released once set. In Traktor, testing Tempo Master on a playing deck makes that deck the tempo master and leaves it there. Tempo master is exclusive, so there's nothing for the closing message to hand it back to. On a stopped deck it simply blinks and nothing is assigned. Worth knowing before you test that row mid-set.

Test is the one place Teach Mode actually moves a DJ-app control rather than just announcing a binding to it. That's safe here because Settings closes itself the moment a transition starts (see The Player Window), so a Test run can never collide with a live mix.


Building a mapping end-to-end

The intended workflow when building a new TSI, XML, or .djayMidiMapping from scratch:

  1. Pick a context in Fusor Studio's Teach Mode (start with Deck A) and set Direction to In.
  2. In your DJ app's controller manager, start MIDI-learn for the binding you want to assign. For example, Deck A volume fader.
  3. In Fusor Studio, find the matching row (Volume > Volume Fader) and click Send.
  4. The DJ app captures the MIDI message and binds the control to the entry's channel/CC/note.
  5. Repeat for each binding in the context. Move on to Deck B, then Master & Mixer, FX, and Global.
  6. Switch Direction to Out and repeat the same loop against the DJ app's Out / feedback tab to teach return values.

Teaching a bidirectional control (Traktor crossfader, for example)

The crossfader is bidirectional, so it needs to be taught on both sides:

  1. In mode. Add an In mapping in Traktor for the crossfader, click Learn, then click Send in Fusor Studio. Traktor captures channel 5 + the canonical CC.
  2. Out mode. Add an Out mapping in Traktor for the crossfader, click Learn, then click Send in Fusor Studio. Traktor's Out tab captures channel 13 + the same CC.

A uni-directional entry needs only the pass for its own direction. Request Monitor State is taught in In mode and never appears in Out; Playing is taught in Out mode and never appears in In.

Because every Send button maps to a canonical-mapping entry, the resulting mapping is guaranteed to match what Fusor Studio sends and receives at runtime.


Teaching Crossfader Assign in Traktor

The eight Crossfader Assign entries each need their own binding in Traktor's Controller Manager. They behave like the Mixer FX On binding: Traktor expects a button-style trigger, and the binding holds the assignment ON while the note is asserted.

For each (deck × side) pair, eight bindings total:

  1. In Traktor's Controller Manager → In tab, add a binding at Mixer > XFader > Assign Left (or Assign Right for the right side).
  2. Type of Controller auto-resolves to Button once the note is captured.
  3. Assignment: pick the explicit deck letter (Deck A, Deck B, Deck C, or Deck D). Do not use Device Target; these bindings are pinned to a specific deck.
  4. Mode: Hold (the same mode Mixer FX On uses).
  5. Value (deck combination): the matching single deck. A for the Deck A binding, B for Deck B, and so on.
  6. Click Learn, then in Fusor Studio's Teach Mode (Global context, Crossfader Assign subgroup, Direction = In), click Send on the matching row. Traktor captures note F4 for Assign Left or F#4 for Assign Right, on channel 1 for Deck A, channel 2 for Deck B, channel 3 for C, channel 4 for D. The note number is the same for every deck; the channel is what disambiguates.
  7. Repeat in the Out tab for the telemetry side. The note numbers are the same; the channel is + 8 (channel 9 for Deck A, 10 for B, 11 for C, 12 for D), following Fusor Studio's standard Out convention.

Once all eight bindings are in place, telemetry flows in both directions. When you change a crossfader assignment in Traktor's UI, Traktor sends a feedback note on the matching Out channel and Fusor Studio's state cache stays in sync.

A note on note names: Fusor Studio's Teach Mode UI and Traktor's Controller Manager both use scientific pitch notation, so MIDI note 65 displays as F4 in both places. Some MIDI Monitor utilities use Yamaha convention and show the same note as F3. That is purely a display difference; the underlying note number is identical and Traktor will bind correctly either way.


Tips

  • Work one context at a time. Finish Deck A end-to-end before switching.
  • If a Send doesn't seem to register in the DJ app, confirm the MIDI port is open (Settings → Connection) and that the DJ app is in MIDI-learn mode for the intended binding.
  • Use All when you want to scan the full canonical mapping or hunt for an entry whose category you're unsure of.
  • Teach Mode doesn't listen for incoming MIDI. Send puts out a learn-friendly event and then returns the control to rest; Test actuates the control for a few seconds so you can watch the DJ app and confirm it's the control you meant to bind.
  • A Send that appears to do nothing has usually worked anyway. See The Send button, and use Test if you need to see movement.