Back to Works
U01  ·  NET-MIX Hardware & Audio 2026

ideiMx &
ideiMx Max

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.

MCU STM32F411RET6
PCB 2-sided, custom layout
Protocol USB CDC serial — not MIDI / HID
Desktop App IDEI Control · Tauri 2
Enclosure Parametric, Fusion 360
01 /

The Problem

"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.

Design Constraints
No MIDI dependency
MIDI needs loopback or DAW-style remapping. The device uses a custom newline-delimited serial protocol over USB CDC (virtual COM at 115200 baud) — same family as deej, extended with JSON.
Per-application audio targeting
Each physical channel must map to a specific running process (e.g. game.exe, Discord, browser) via the Windows Core Audio API — not the master volume.
Visual feedback on hardware
One WS2812B per channel shows mute state on the device (off normally, dim red when muted). LEDs turn off when USB disconnects — no screen required.
Configurable button actions
Each button can trigger media keys, a recorded keyboard shortcut, or hardware slider mute — all configured in IDEI Control. Slider-to-app assignments live on the PC (presets), not in device flash.
02 /

Hardware Architecture

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.)
STM32 2-Layer PCB WS2812B USB CDC deej-style Fusion 360 FDM ADC

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.

ideiMx — assembled 3D printed device
ideiMx — device detail
ideiMx — device detail
03 /

Software & Ecosystem

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.

Not MIDI

Serial protocol over USB CDC — not MIDI or HID

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.

Firmware — STM32
L1
USB CDC — Virtual COM
USB device class: Communications Device Class (serial). Outbound: pipe-delimited slider values and JSON lines (ready, identify, button events). Inbound: newline-terminated text commands from the host.
L2
ADC — Slider sampling
Polled 12-bit ADC per channel (PA0–PA4 on Max). 20-sample moving average, dead zones near 0% / 100%, scaled to 0–1023 before transmit. Sends on change (~15 ms min interval, threshold filtering).
L3
GPIO — Buttons
Pull-up buttons (PC0–PC4), 50 ms debounce. Optional per-channel hardware mute on slider; otherwise emits {"type":"btn","i":n,"seq":k} for the PC to handle (media keys / shortcuts).
L4
WS2812B — NeoPixel driver
GPIO bit-bang, one LED per channel. Off when unmuted; dim red (50,0,0) when hardware or shortcut-mute LED is active. All LEDs off on USB disconnect / host timeout.
L5
Host-driven maps (RAM)
Mute-button map and shortcut-LED map updated via serial commands from IDEI Control — not stored in MCU flash. Slider-to-app assignments and presets live entirely on the PC.
Desktop App — Tauri
L1
Windows Core Audio API hook
Rust backend calls IAudioSessionManager2 to enumerate running audio sessions by process name. Volume is set via ISimpleAudioVolume on the matched session.
L2
Serial port session
Opens COM port at 115200 baud, handshake via IDENTIFY (models ideiMx / ideiMx-max). Read thread parses slider lines and JSON button events; supports multiple devices on different ports.
L3
Channel assignment & presets
Each slider targets system, mic, one or more apps (by PID/name), or a Games category. Presets keyed per model in localStorage; optional config.json for last port and autostart. Conflict rules prevent duplicate targets across sliders/devices.
L4
Volume apply loop
Background thread (~80 ms) maps latest slider values (0–1023 → 0.0–1.0) to assigned targets. Button dispatcher: media keys or SendInput shortcuts; syncs SET_HW_MUTE_BTN_MAP / SET_SHORTCUT_MUTE_LED_MAP to firmware when configured.
L5
React UI — IDEI Control
Live slider %, session picker, per-slider button binding, presets, tray icon, autostart. Polish/English UI; telemetry optional via Rust proxy (Umami).
Physical slider moved
Potentiometer → 12-bit ADC → moving average
USB CDC · 512|256|1023\n
IDEI Control parses line
Serial read thread · UI smoothing
Process lookup · Core Audio
Windows Audio session updated
ISimpleAudioVolume::SetMasterVolume
Button · JSON btn event
Media key or shortcut (PC)
Optional Neo dim red via serial command
IDEI Control — UI
04 /

Variants

Model A — Standard
ideiMx
Protocol model ideiMx
Channels 3 × linear slider (PA0–PA2)
Buttons 3 × tactile (PC0–PC2)
LEDs 3 × WS2812B NeoPixel
Firmware IDEIMX_HW_IDEIMX build
PCB 2-sided
Model B — Extended
ideiMx Max
Protocol model ideiMx-max
Channels 5 × linear slider (PA0–PA4)
Buttons 5 × tactile (PC0–PC4)
LEDs 5 × WS2812B NeoPixel
Firmware IDEIMX_HW_IDEIMX_MAX build
PCB 2-sided — extended board