A custom STM32F411 hardware mixer paired with IDEI Control — a Tauri desktop app on Windows. Physical sliders send deej-compatible values over USB serial; the app maps each channel to system volume, microphone, per-app sessions, or a games group via Core Audio — no MIDI, no virtual audio devices, no tabbing out.
"Tabbing out to adjust a single app's audio level is a friction point that compounds every hour."
Windows provides per-application volume control through its Volume Mixer,
but accessing it requires breaking focus — tabbing out of a game, a DAW,
or a video call. For someone who switches audio contexts constantly
(game audio, Discord, browser), this is a recurring and unacceptable
interruption.
The target: a physical controller that sits on the desk and adjusts
specific application volumes instantly, with no OS-level pop-ups,
no virtual audio devices, and no generic MIDI mapping hacks.
A custom 2-sided PCB around an STM32F411. Sliders on ADC inputs (PA0–PA4), buttons on GPIOC, one WS2812B per channel — USB Full-Speed presents as a virtual COM port (CDC), not a HID or audio-class device.
| Component | Specification |
|---|---|
| MCU | STM32F411RET6 — USB FS CDC, 12-bit ADC, GPIO (STM32Cube / HAL) |
| PCB | 2-sided, custom layout — JLCPCB fabrication |
| Inputs | Linear potentiometer sliders (analog ADC), tactile push-buttons (GPIO) |
| Feedback | NeoPixel (WS2812B) RGB LEDs — driven by firmware |
| Connectivity | USB CDC virtual serial (115200 8N1) — no MIDI, no HID, no audio driver |
| Firmware | v1.0.8 · protocol v3 · build-time variant (3 or 5 channels) |
| Enclosure | Parametric design — Fusion 360, FDM printed |
| Variants | ideiMx (3 ch.) & ideiMx-max (5 ch.) |
Two SKUs share one codebase: set IDEIMX_HW_VARIANT
in hardware_profile.h, rebuild, and flash.
Firmware filters each slider in software (20-sample moving average, dead zones at
0% / 100%), scales 12-bit ADC to 0–1023 (deej format), and streams
v0|v1|…\n lines when values change (~15 ms min interval).
NeoPixels are bit-banged from the MCU — no separate LED driver IC.
The STM32 enumerates as a USB CDC virtual COM port
(115200 8N1). On connect it sends a JSON ready line; sliders stream as
deej-style ASCII 512|256|1023\n
(0–1023); button presses send JSON {"type":"btn",…}.
IDEI Control (Tauri 2, Rust backend) opens the port,
maps channels to Windows audio sessions, and applies volume — no MIDI, no HID, no virtual cable.
MIDI would force CC mapping and extra software. HID binary reports were never used: the
device speaks text lines on a standard COM port (like the open-source
deej mixer), plus JSON for identify, buttons, and host commands
(IDENTIFY,
SET_HW_MUTE_BTN_MAP, etc.).
IDEI Control scans ports with IDENTIFY\n,
then sets volume through
IAudioSessionManager2 and
ISimpleAudioVolume::SetMasterVolume
on the matched session — Windows only, no custom driver beyond the built-in USB serial driver.
{"type":"btn","i":n,"seq":k} for the PC to handle (media keys / shortcuts).IAudioSessionManager2 to enumerate running audio sessions by process name. Volume is set via ISimpleAudioVolume on the matched session.IDENTIFY (models ideiMx / ideiMx-max). Read thread parses slider lines and JSON button events; supports multiple devices on different ports.config.json for last port and autostart. Conflict rules prevent duplicate targets across sliders/devices.SendInput shortcuts; syncs SET_HW_MUTE_BTN_MAP / SET_SHORTCUT_MUTE_LED_MAP to firmware when configured.