Hello everyone!
I’m very very pleased announce that I’ve improved the entire HQPlayer Embedded configuration interface! I call my project HQPTuner:
I’ve always been frustrated by HQPlayer Embedded’s stock web UI: it’s so full of awesome UX potential that remains entirely untapped. One of the most powerful hifi programs ever made and its configuration interface is ugly, flat, boring, scattered, and frustrating (sorry Jussi!).
HQPTuner is an alternative, attractive, informative, and (for a genuine nerd like me) honestly kind of fun interface. I wanted something that even newbies could use without needing to cross-reference the manual, and I wanted to bring more of HQPlayer’s awesome power within easy reach for power users.
For those interested in the nitty-gritty, it’s a small Python backend with a JavaScript/CSS frontend.
Features I’ve shipped so far:
-
Filter narrowing: this is the flagship right here.
-
Only show filters matching a certain quality, genre, focus, and/or phase
-
Optionally show only apodizing (and/or half apodizing) filters for the 1x dropdowns
-
Note this has already paid dividends and helped me discover new filters that I really like.
-
-
Full matrix pipeline support with REW-style click-and-drag adjustments on the response plot.
-
Flagship #2: full Headphone Auto EQ profile integration. Over 8,800 headphone EQ profiles. Type in your headphones (+ pads), hit apply, restart the daemon, done. Or, load your own profile from REW.
-
Flagship #3: Automated crossfeed compensation. To my knowledge, this is the first time this feature has shipped outside of a full-on DSP solution (e.g. Jan Meier’s work, CanOpener; in both cases they own the full DSP chain)… that is, the first time it’s being applied to someone else’s DSP chain.
-
Surface all manual knowledge where it belongs: every single feature and filter comes with its manual description printed right below it. This can be turned off entirely (well, converted to hover tips anyway) or left on only for filters/shapers.
-
Idiot proofing: Irrelevant features are hidden or grayed out. PCM output mode? SDM features collapse, or gray out with stated reasons. Running DSD512? Modulators that only work at DSD1024 are unselectable and tell you why so you don’t have to guess why there’s no output.
-
No more ‘applying settings reverts to [default]’. I’ve re-written the entire preset feature to work around the daemon’s desire to revert to default, so the settings you send are the settings you get back every time. My presets sync with the daemon so that they’re available on the stock UI too.
-
Friendly output rates. No more breaking out the calculator to remember what Hz to set for DSD256. Just choose, e.g., “8x” for PCM or “DSD256” for SDM.
-
A live log tail allows you to keep tabs on the process and helps debugging efforts.
-
Crossfeed, Loudness, and Matrix EQ contain live plots that show effects as you adjust them. Matrix EQ plot peaks contain REW-style click-and-drag functionality.
-
Live volume control.
-
Adjustable accent color between amber, phosphor green, and every-web-UI-ever blue. Or, input your own hex code.
-
Ships in Docker.
Features I’m not including:
-
Media playback or library management (that’s what Roon is for)
-
Convolution engine
-
Desktop support (sorry! if you want to see this, let Jussi know)
Furthermore, to enable “friendly output rates”, I’ve forced the Auto-rate family setting on (can’t be toggled with HQPTuner) and taken away the ability to select uncommon output rates. “8x” for PCM is the equivalent of setting 48k x 8 = 384000 Hz; DSD256 is the equivalent of setting 48k x 256 = 12288000 Hz (you can disable the 48k DSD option if your DAC doesn’t support those rates). This should cover the vast majority of use cases, however, if you’re one of those weirdos who listens at random rates or caps your output at 32kHz multiples, HQPTuner may not be for you.
And now, the money shots ![]()
Caveat Emptor
This is fresh off the presses and still in beta. I’ve rooted out as many bugs and as much weirdness as I can find, but my actual use case only touches so much of the program. For example, I don’t use any ALSA backends, I’m network only. Expect issues. Bug reports, suggestions, and general feedback welcome.
Last but not least, I’ll make a dedicated thread if this gets enough traction and/or makes it out of beta lol
EDIT: major bug! Depending on your system’s startup sequence, the HQPTuner container may try to mount the default /tmp log location before it ever exists. This results in /tmp/hqplayerd.log being created as a folder… then the HQPTuner container fails to start. Big ol’ footgun.
The fix, for now, is:
rmdir /tmp/hqplayerd.log
sudo systemctl restart hqplayerd
sudo docker restart hqptuner
Working on a real fix.











