

I reverse-engineered my DUSK-SP cable and built my own EQ app for it... turns out the "1 dB steps" limit isn't real, and I got a working preamp out of pure filter maths
I was asked to not tell u/crinacle about the preamp... So here I am.
TL;DR: these little Moondrop DSP USB-C cables (DUSK / MAY / FreeDSP) are WAY more capable than the stock app lets on. I built my own app that talks to the cable directly, does proper fractional-dB EQ, and adds a preamp the hardware doesn't officially have.
It's now open source. Code and Windows download here: https://github.com/EffectiveEquivalent/FreeDSP-Studio (grab the exe from Releases). MIT licensed, built via GitHub Actions. Windows will moan about an unknown publisher because the exe isn't code-signed yet.... signed builds are coming. More info, Run anyway.
A few things I found that I reckon are genuinely cool:
The EQ profiles live on the cable, not the app
The DSP chip inside the cable has its own memory. It holds a writable custom EQ bank plus the firmware preset voicings (the DUSK ships with Crinacle's tunings, the MAY has Moondrop's own Standard / Bass Head / Reference etc). Whatever profile is active gets applied by the cable itself, so your EQ follows the cable onto any phone or laptop with ZERO software running. My app just reads and writes that on-cable memory over USB HID.
The "integer dB only" thing is a UI illusion
Read a band back and the gain comes out as a whole number, so you ask for 2.3 dB and the stock app shows 2. I assumed that meant the hardware was locked to 1 dB steps. Nope. Each band actually stores two totally separate things:
- a little metadata record (frequency, Q, filter type, and a gain value stored as a 24-bit integer in whole dB), and
- the actual biquad filter coefficients that do the real DSP.
The metadata gain is basically just a label for the app's display. The sound is determined ENTIRELY by the coefficients.
How I proved it: I sent a deliberately mismatched write, metadata gain = 0 dB but coefficients calculated for a -12 dB low shelf. If the cable trusted the integer, nothing should happen. Instead the bass completely vanished. So the coefficients are what actually matter and the integer is just cosmetic. Which means fractional gain works perfectly.... I compute the biquad from the true value (RBJ cookbook), send those coefficients, and the cable plays exactly 2.3 dB. It always could, the app just never let you.
(Nerdy bit: it stores a separate coefficient set per sample rate, 44.1 / 48 / 96 / 192 / 384 kHz, so that's 5 biquads per band, as fixed-point numbers scaled by 2^22.)
The preamp is the bit I'm most chuffed with
The cable has no master volume or preamp control at all. But a preamp is really just a flat level shift at every frequency, and here's the trick:
A biquad's response is basically numerator over denominator. If you multiply the numerator (b0, b1, b2) by some constant k, you scale that filter's output by k at every frequency, which is a perfectly flat gain of 20*log10(k) dB. And because the 9 bands are cascaded (their responses multiply together), applying that flat k to just ONE band shifts the entire combined EQ curve up or down by that many dB without changing its shape at all.
So I set k = 10^(preamp/20) and bake it into band 1's coefficients. Free preamp. No extra band used, no firmware feature needed, just maths riding on a filter that's already there. I use it to pull the whole curve down for headroom so big boosts don't clip.
What it turned into
A desktop app with a live frequency response graph, EQ points you drag straight on the curve, squig.link / AutoEQ import, on-cable profile switching, save/recall, and clip protection that won't let you write a distorting EQ without sorting the headroom first.
Reverse-engineered by watching the USB traffic and reimplementing the wire protocol myself, for my own hardware. Honestly the coolest project I've done in ages and it works INCREDIBLY.
And yeah, I built the whole thing with Claude (Claude Code). Took a good few hours.... haha