Teach Mode

Teach Mode is the DJ app tab of the Settings window's Mapping entry. It is the recommended way to build or maintain a DJ-app MIDI mapping against Fusor Studio's canonical mapping: every entry appears as a row in a grid, with Send and Test buttons for each deck, so you can use the DJ app's own MIDI-Learn workflow one binding at a time without a hardware controller, then confirm the binding is assigned to 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 the DJ app tab

Settings → Mapping, then the DJ app tab.

The DJ app you chose on Connection is named in plain text at the top, beside the Decks switch and Show hidden. Under it, one sentence tells you what to expect: if Fusor Studio's mapping file ships for that app, importing it sets up every control this tab shows, and the tab is where you check a control, change the MIDI Fusor Studio sends, or build your own mapping; if no mapping file ships for it, each control is set up here instead.


Edit the output mapping file

Edit the output mapping file sits at the top of the tab, collapsed by default. It shows the file that sets the MIDI Fusor Studio sends.

The mapping translates an abstract control address such as deck.a.eq.high into a MIDI channel and a CC or note number. MIDI Mapping documents the layout that file contains; this section is the file itself.

  • The Mapping File field shows the path, read-only, or (not found).
  • Reveal opens the containing folder in Explorer or Finder.
  • Edit opens the file in whatever your system uses for .json.
  • Format Reference is a collapsed section listing what each field in an entry means: addr, channel, cc / note, kind (midi_cc or midi_note), type (bipolar, unipolar, trigger, bool or indexed), direction (in, out or bidirectional), and min / max.

Read Before you edit literally. Back the file up before you edit it. Your DJ app's mapping has to match exactly, so changing a CC number here means changing the corresponding row in Traktor, Mixxx or whichever app you use. Don't put two controls on the same channel-and-CC pair, or telemetry coming back can't be attributed to either of them. Restart Fusor Studio after editing.

The mapping file ships with Fusor Studio and is not in your Fusor files folder, so keep your own copy of any edit. Edit it only when your DJ app cannot be taught a canonical number. Otherwise use the grid below, which teaches each entry to your DJ app at the numbers already in the file.


Test or Build your own mapping

Everything below is the grid: send a discovery message to your DJ app's MIDI Learn, test a completed binding, and tick it off once you've confirmed it.

The grid

One row per control, one column per deck. A row that doesn't belong to a deck, such as a global toggle, spans the full width as one wide cell. FX unit rows use FX 1–FX 4 as columns instead of decks.

A Decks 2 / 4 switch at the top of the screen sets how many decks the grid shows. At 2, the grid shows only the two decks of your deck layout, in the order that layout sets, which can be any pair. FX units 3 and 4 follow the same switch. Hiding a deck this way keeps anything already learned or ticked on it; the switch only limits what you're asked to map, never what a fusor may modulate.

Buttons show text labels at both 2 and 4 decks. At 4 decks the grid is wider than the Settings window's base size, so the window widens itself to fit it, then returns to its normal width when you leave the tab or switch back to 2 decks.

Rows are grouped by domain, in this order: Crossfader, EQ, Volume, Filter (Mixer FX), Tempo, Key, Stems, FX assign, Deck FX, FX units, Deck status, Global. Sync and the two master-tempo buttons sit under Tempo; the crossfader and the per-deck crossfader-assign buttons share Crossfader, with the Crossfader row first; the EQ rows read High, Mid, Low from top to bottom, matching the controller and Traktor; Playing and Loaded form Deck status, both report-only with no In. Deck FX holds djay's per-deck effect bank and is hidden for every other app. Groups collapse, and each group header shows "N of M tested", then, in orange, "K to test" for entries you've sent but not yet ticked, then a hidden count.

Entries are filtered to the DJ app selected in Settings → Connection. App-specific controls (stems, FX units, Mixer FX) appear only when your app supports them.


Cells: Send (In), Send (Out), Test, Tested

Each cell has, for that deck, in this order under the In and Out labels at the top of its column:

  • Send (In). Emits the canonical MIDI message for your DJ app's MIDI Learn to capture.
  • Send (Out). For a control your DJ app reports back, so you can teach the return side the same way.
  • Test. A roughly two-second modulation that verifies a completed In binding, once one exists.
  • Tested. A check only you set. Fusor Studio never ticks it, from telemetry or anything else. Re-sending or re-testing a cell leaves the check as you left it; clearing a row clears its check.

A row your DJ app never reports back leaves its Send (Out) space empty; a report-only row (Playing, Loaded) has no In, so its Send (In) and Test spaces are empty. The empty spaces keep every button in line down the column.

Send: discovery, then settle

Click Send to send the entry's MIDI message. It sends a pair, on the entry's channel:

  • Note entries. Note On, then Note Off.
  • CC entries. A fixed, mid-range value for your DJ app's MIDI Learn to bind to, then the control's own rest value.

The first message is what MIDI Learn binds to: one clean, mid-range event. The second sets the control to its rest value, so teaching a binding doesn't leave a fader at the halfway point.

On a knob whose rest value is the middle, such as an EQ or a filter, both messages send the same value, so you may see no movement. That's expected, and it's what Test is for.

Test: actuation, to confirm the right control moved

A single Send is ambiguous: a knob that jumps once could be a neighboring control bound to the same 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 comes from the DJ app. Some controls cannot be released once set. In Traktor, testing Tempo Master on a playing deck makes that deck the tempo master and leaves it there, because tempo master is exclusive, so the closing message has no other deck to return it to. On a stopped deck it blinks and nothing is assigned.

Settings closes itself the moment a transition starts (see The Player Window), so a Test run cannot collide with a running transition.


The row menu

The … menu on each row holds Hide and Clear row. Clear row clears the cells for the decks currently shown, never a deck the Decks switch is hiding.

On knob and fader rows with an In, the menu also holds a "soft takeover is set" note. See Tracking soft takeover below.

Hiding a row

Hide, in the row menu, removes a row from the grid. Show hidden, at the top of the screen, brings hidden rows back greyed, with an Unhide option in the same menu. Hidden rows are remembered per DJ app: switching apps in Connection shows a different hidden set. Hiding changes nothing about how a control works; it only removes it from the list you're working through.


Tracking soft takeover

Every knob and fader row with an In has a "soft takeover is set" note in its row menu, your own record that you turned on soft takeover for that binding in your DJ app's controller mapping (Traktor Pro Setup covers the steps). A noted row shows an orange mark beside its In buttons. Fusor Studio cannot read your DJ app's controller mapping, so setting the note does not check, confirm, or detect anything about it. Re-importing a TSI, swapping controllers, or rebuilding a mapping can drop soft takeover from a binding while its note stays set.

The note persists across restarts, one per DJ app.

To check a pickup, use Send. Test sweeps the control for about two seconds, so its value is never still long enough to pick up; Send sends one fixed value, so you can move the hardware control to it.


Building a mapping end-to-end

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

  1. Work through the groups from the top: EQ, Volume, Filter (Mixer FX), and onward.
  2. In your DJ app's controller manager, start MIDI Learn for the binding you want to assign, for example Deck A's volume fader.
  3. In Fusor Studio, find the matching row and deck column, and click Send in its In cell.
  4. The DJ app captures the MIDI message and binds the control to the entry's channel/CC/note.
  5. Repeat for each binding, deck by deck, then Send the Out cells against the DJ app's own feedback mapping to teach the return side.
  6. Tick Tested once you've confirmed a binding with Test.

Teaching a bidirectional control, using the Traktor crossfader

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

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

A one-directional entry needs only the pass for its own direction: Request Monitor State has no Out cell, and Playing has no In cell.

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, Assign Left and Assign Right for each deck, sit in the Crossfader group, one column per deck. 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, click Send in the matching row's In cell for that deck. 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 with the row's Out cell 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, MIDI 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 record of the assignment stays current.

A note on note names: Fusor Studio's grid 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 a display difference, and the underlying note number is identical.

On rekordbox the group holds twelve rows rather than eight, because rekordbox has a Thru assignment per deck alongside Left and Right.


Four things to know

  • If a Send doesn't 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.
  • Switch Decks to 4 to reach FX units 3 and 4, and the decks your deck layout doesn't already show at 2.
  • A Send that appears to do nothing has usually worked. See Send: discovery, then settle, and use Test if you need to see movement.
  • Hiding a row, or marking it tested, changes nothing about how the control works.