A native macOS replacement for Focusrite's discontinued MixControl 1.10.6,
for the 1st-generation Scarlett 8i6.
Note
Focusrite discontinued MixControl years ago. On modern macOS the app still launches but no longer finds the device — so the matrix mixer, routing, and DSP features your hardware actually has are unreachable. If you own a 1st-gen Scarlett 8i6 and want to use those features again on a modern Mac, this is for you.
| 🎛️ | Full 18 × 6 matrix mixer with per-cell gain, mute, solo, pan, stereo link |
| 🔀 | Output routing — Monitor / Phones / S/PDIF can pick any source (DAW, Analog, Mix M1–M6) |
| 🎤 | USB capture routing — choose what your DAW sees on each input channel |
| 📌 | Pinned DAW return strip — DAW 1/2 back into the matrix with one linked fader |
| 🔘 | Hardware switches — line/inst impedance, hi/lo gain, clock source, sample rate |
| 📊 | Live peak meters — all 18 inputs + 6 mix buses + 6 DAW playbacks, with held peaks |
| 💾 | Save to hardware — persist mixer state to device flash, survives power cycle |
| 📁 | Snapshots — save / load full configurations as .8i6 JSON files (⌘S / ⌘O) |
| 🔌 | Connection resilience — auto-reconnect on USB drops, clear status overlay |
![]() Routing — physical outputs + USB capture |
![]() Presets — save / load full configurations |
![]() Device — hardware info, clock, event log |
- Grab
Scarlett.MixControl.app.zipfrom the latest release. - Unzip and drag
Scarlett MixControl.appto/Applications. - First launch only — macOS Gatekeeper will block the app (we use ad-hoc codesigning, not a paid Developer ID). One of these will get past it:
- Right-click the app → Open → confirm the warning dialog.
- Or in Terminal:
xattr -dr com.apple.quarantine "/Applications/Scarlett MixControl.app"
Requires the Xcode 15 / Swift 5.9+ toolchain.
git clone https://github.com/MarecekW/scarlett-mixcontrol-1stgen.git
cd scarlett-mixcontrol-1stgen
./scripts/make-app.sh
open "build/Scarlett MixControl.app"For dev iteration without packaging: swift run scarlett-app. There's also a scarlett-cli companion for low-level protocol poking — try swift run scarlett-cli --help.
| Device | Status |
|---|---|
| Scarlett 8i6 (1st gen) | ✅ Confirmed on hardware — tested on macOS 14+ |
| Scarlett 6i6 (1st gen) | 🟢 Beta — driven; awaiting hardware confirmation |
| Scarlett 18i6 (1st gen) | 🟢 Beta — driven; awaiting hardware confirmation |
| Scarlett 18i8 (1st gen) | ✅ Confirmed on hardware (thanks @Nas3nmann) |
| Scarlett 18i20 (1st gen) | 🟢 Beta — driven; awaiting hardware confirmation |
| Scarlett 16i8 (1st gen) | ⚪ Prototype SKU — no shipping USB ID to detect |
| Scarlett 2nd / 3rd / 4th gen | ❌ Different protocol — won't work |
| Saffire (FireWire) family | ❌ Different transport — won't work |
🟢 Every shipping 1st-gen USB Scarlett is driven with byte tables extracted from the original MixControl binary. The 8i6 and 18i8 are confirmed on real hardware; the rest are wired up but need an owner to verify. Grab a pre-release and open an issue if anything's off.
Tech tour (click to expand)
The 1st-gen Scarletts are USB Audio Class 2.0 devices. macOS's built-in usbaudiod claims the audio + MIDI streaming interfaces, but doesn't touch the audio control interface (endpoint 0). That's how this app coexists with normal audio playback — every mixer / routing / metering command is a IOUSBDeviceInterface.DeviceRequest to endpoint 0, sent through the same USB stack usbaudiod is using, without ever issuing USBDeviceOpen (which would fail with kIOReturnExclusiveAccess).
The protocol itself was reverse-engineered by extracting the per-product signal tables (_USB14Tracker_IpSigTab, _USB14Tracker_OpSigTab, default routing tables, etc.) directly from the original MixControl 1.10.6 binary, then disassembling key dispatch functions (MacHWDevice::routeChannel, setMonMono, etc.) to confirm wValue / wIndex semantics.
The three routing dimensions:
wIndex |
Purpose | UI surface |
|---|---|---|
0x3200 |
Matrix-mixer input source | Source picker on each matrix channel strip |
0x3300 |
Physical output routing | "Output assignments" panel in Routing tab |
0x3400 |
USB capture routing | "USB capture" panel in Routing tab |
Firmware quirks worth knowing:
- Routing GETs always return
00 00regardless of what was last set — UserDefaults persistence is the only way to remember routes across launches. - Matrix-source assignment silently fails if the source is already wired to another channel — the app does an explicit
.offdisconnect on the previous owner first. - The
setMonitorMonoUSB command crashes the firmware when sent from our process, even with byte-perfect parity to MixControl. Probably an undocumented authorization handshake at startup we haven't identified — the Mn button is hidden until we crack it.
For full deep-dive, read the commit history — d175367 (the matrix-mixer breakthrough) and 1294ff7 (feature parity additions) cover most of the protocol reasoning.
Every shipping 1st-gen USB Scarlett (8i6, 18i6, 18i8, 18i20, 6i6) now has a DeviceProfile with byte tables extracted from MixControl's binary, and the app will drive all of them. The remaining open item is hardware validation — only the 8i6 has been confirmed on a real unit. If you own one of the others:
- Grab a pre-release and connect your device.
- Check that inputs/outputs are labelled correctly, faders move the right channels, and meters track the right signals.
- Open an issue with anything that's wrong — that's exactly the feedback that promotes a device from 🟢 beta to ✅ confirmed.
(There's also a non-shipping "16i8" table in the MixControl binary, but it has no USB product ID in the firmware's device dispatch, so there's no hardware to detect.)
Standing on shoulders:
- @Nas3nmann — Scarlett 18i8 support, the device-profile–driven protocol layer, CI beta releases, and the packaged-build startup fix.
- @x42 (Robin Gareus) — original Python reverse-engineering of the Scarlett 18i6 protocol in
scarlettmixer. ManywValue/wIndexconstants were first documented in his code. - Linux kernel —
sound/usb/mixer_scarlett.cwas an essential cross-reference, even where its 8i6 byte tables turned out to be marked "untested..." (and indeed wrong about S/PDIF and Mix bus bytes). - @geoffreybennett (Geoffrey Bennett) — author of
alsa-scarlett-gui, the most thorough open-source Scarlett control panel for Linux. - Focusrite — for shipping a control panel binary on their support site that didn't strip its data tables.
Released under the MIT license.
This is an independent community project. It is not affiliated with, endorsed by, or supported by Focusrite Audio Engineering Ltd. "Scarlett", "MixControl", and "Focusrite" are trademarks of their respective owners.



