HQPTuner: an improved configuration interface for HQPlayer Embedded

Really? That’s interesting… I guess I was reading the spectrum wrong, I saw those spurs up high and thought “oh, 30kHz junk filter material!”

And yes, that is definitely genuine hi-res.

My fake hi-res file looks like below, pretty unambiguous.

If you have further reading on this stuff, I’d love to take a look at it! Thanks!

Yes, this is certainly a fake hires, 96k made out of 44.1k. Pre-upsampled content. Not a bad one though. You could still apply a 20k filter on it, since the source material seems to be quite bad (and seems to have gone through a half-band filter). Will give you a bit of improvement.

Jussi, your feedback is always invaluable, so thanks again.

HQPTuner still detects HF spurs, but will no longer assume bunk causes. The warning now reads something like:

Persistent tone at 40.0 kHz — recommend switching to a ‘hires’ resampling filter or engaging the 30k high-frequency filter.

It recommends a ‘hires’ filter before the 30k junk filter, but ultimately the user can decide. Or ignore it.

Will ship with the next version bump.

I might actually purchase HQplayer 6 embedded because of the work you are doing here :slight_smile:

I just need to make up my mind if I go for a holo RED as NAA or a LHY raspberry pi 4 pro :stuck_out_tongue:

But Is there a set it and forget configuration for HQplayer ? I don’t want to switch between filters and modulators when I go from Redbook to hires.

Also is multichannel downsampling to stereo automatically done ?

Thanks

2 Likes

Thank you!! Huge compliment. And you definitely should get HQPlayer, you won’t regret it :smiley: (until it comes time to buy a new GPU :rofl:).

I can speak for the Red being amazing, myself. Paired with a Cyan 2 over USB, it’s heavenly. Haven’t heard the LHY.

You can definitely set it and forget it. HQPlayer has different filters for 1x (44.1/48k) and Nx (>=88.2k). And honestly? The default filters are really damn good and I find myself using them as a baseline, you could probably just leave those on.

I’m the same way with tubes: I don’t want a huge collection with a set of tubes per genre/album. I just want one, maybe two really nice set(s) of tubes that cover my bases.

One of the default Matrix profiles is Multichannel-to-stereo mixdown, so yeah, basically just a couple of clicks and it loads live.

Let us know what you go with!

1 Like

I just sent v0.11.1 to main, so if you’re on :latest then you should update :slight_smile: no reason to be on beta for now.

Changes from v0.11.0:

  • Junk filter recommendations system and text improved
  • Various Live mode bug fixes, mostly errors firing because the daemon didn’t answer soon enough even though the setting was applied successfully
  • Switching output mode and other live settings in tab mode, then applying, would reset the daemon before (expected behavior; the daemon can’t change output mode and anything else simultaneously). Now it uses the Live mode workaround of applying the mode change, then other settings changes sequentially.

And if you’ve been on main rather than beta, you’re now gaining live mode, junk filter recommendations, and tons of minor fixes.

Here’s what I’ve got in mind for future releases:

  • The annoying offsets that @Govnah pointed out between the RATE and MODE cards.
  • I want to extend the apodization narrowing to Nx material as well, but I’m not sure how to do this cleanly in the UI. The 1x option already takes up tons of real estate thanks to the (necessary, imho) explanation, though.
  • I’m thinking of reworking the Filter Narrowing visually at the same time to be more than just a single flat card with a bunch of dropdowns in a row, but I’m having a hard time “seeing it”. Suggestions welcome.
  • Filter narrowing counts. How many filters are left for 1x/Nx each in the live chain, and how many you’d be left with if you selected a certain narrowing option.
  • Various visual enhancements (e.g. the Live mode’s output mode options should not get squashed so the UI can put “writing…” temporarily)
  • Device-aware grayouts. I noticed that, while plugged into my Pi2AES, which is limited to 24/192, I could still select, e.g., 32x output rates or DSD mode and hit apply. Pi2AES uses the hifiberry-digi-pro drivers, which even the daemon knows is limited to 4x PCM with no DSD. That knowledge should be integrated into the interface. Note: this only works for the current output mode, the daemon doesn’t expose things like rate limitations for the inactive chain.

v1.0.0 is close, I can feel it :smiley: keep the bug reports coming!

slight correction: hifiberry-digi-pro is capable of low DSD rates over DoP.

5 Likes

Suggest to avoid DSD files/sources on apodization filter

I am so so proud and excited to announce that HQPTuner has been promoted to stable :tada: :partying_face: I then promptly patched a minor visual issue, so v1.0.1 is now live on :latest!

I expect the bug reports, which have been weirdly quiet up until now (knock on wood), to start flooding in now… :stuck_out_tongue:

There are a lot of changes from the final beta version, v0.11.1, to v1.0.1:

  • Device-aware grayouts: you can no longer select output rates that your device can’t handle. Note that this only works for the current output mode and device, the daemon doesn’t expose rate limitations for the inactive chain.
    • HQPTuner needs to read the log file at daemon restart to determine the advertised rates, so this doesn’t work without logging.
    • Further to this, I fixed a bug where switching to SDM mode on a device that only supports it over DoP would simply return with PCM still selected and claim “success”. DoP is now unconditionally un-grayed and checking it unlocks SDM mode on certain devices.
  • Auto-save mode for those who like to pick up where they left off. With auto save mode on (checkbox at the bottom), every settings change is saved in the current preset’s file (on HQPTuner’s side), so reloading it will keep exactly the same settings you had last. It even tracks live mode! The preset changes will sync to HQPlayer on the next daemon reload.
    • Note: it’s the sync to HQPlayer that costs us a daemon reload on profile saves. It costs nothing to update the stored XML on HQPTuner’s side. I could even make saving the profiles to the daemon optional so there would be no reloading at all for profile saves… you could always re-enable to sync with the stock UI. Let me know!
  • Nx Apodizing filter narrowing
  • Hi-res filter narrowing:
    • 1x: hide hi-res filters (default ON) with note “Hi-res filters are optimal for lossy materials like MP3 and MQA at 1x.” poly-sinc-mp3/mqa* are excluded.
    • Nx: show only hi-res filters
  • Filter narrowing counts added, so now you can see how many filters are left by selecting a certain option.
  • Moved apodizing narrowing controls out of the chain cards and into the Filter Narrowing card where they belong. Both controls are now global (apply to both chains) and represented as three-way switches [All | Only | +1/2].
  • DSP tab renamed to Matrix (slightly more accurate; Resampling is also DSP).
  • Visual tweaks to Loudness. Shelf adjustments are now a triple knob/slider/textbox combo, akin to the Matrix Response plot. A switch above, [Bass|Treble], toggles between the two shelves. This buys back a little vertical space on the Volume tab, plus (imho) it looks cooler.
  • Boring ol’ “Enable” checkboxes have been converted to [ENGAGE|BYPASS] switches (Matrix, Crossfeed, Loudness, DAC Correction, etc.)
  • Saved profile names now accept non-ASCII characters (same as daemon)
  • Countless minor visual enhancements and fixes

I was also able to confirm that the “rising HF noise” 50kHz filter suggestion triggers with real material! Still on the lookout for a real world 40kHz trigger…

I also just caught a major “bug”… or what I consider to be one, anyway. I did two rounds of EQ tweaking and kept wondering why it sounded the same before realizing that the f’ing matrix engine was bypassed. HQPTuner was totally silent on this… so not a software bug, just major violation of the project’s founding principles. So I added notes at the top of the relevant cards when the matrix engine is off. You can still tweak and stage, nothing is grayed out, but it should at least be more obvious that your tweaks aren’t going anywhere. Report any similarly confusing situations you may find yourself in and I’ll see what I can do.

Enjoy the music y’all :smiley:

EDIT: I should really be doing other things… but I just had a f’ing awesome idea for a new feature: save matrix profiles to all presets. For example, I have home and office headphone rigs, and sometimes I take random headphones into the office (e.g., it’s mostly empty on Fridays so open-backs are fair game). It would be great to just be able to load the EQ from the matrix profile without having to build a new preset around it. It would also cut down on the number of presets I’d personally need: I’d go from one per headphone per location to “Office”, “Headphones”, and “Speakers”.

6 Likes

:+1:

1 Like

Haha, good catch!

I’m guessing your DAC doesn’t support 48kHz DSD rates… but both of mine do, and that’s what I developed against. So when HQPTuner sees the lack of those rates, it incorrectly declares the entire family unavailable. Oops.

Fix shipped to :beta under v1.0.2, switch over and see if it’s still declared unavailable.

Edit: 1.1.0 is up on beta and allows you to save a matrix profile to multiple presets via a dropdown box, rather than just saving to all of them.

Edit2: Auto-save is also broken, working on that too…

Well… the bug reports aren’t flowing in, but they don’t need to because I’m constantly tripping over them myself. Not surprising with my luck, given that I just declared the app stable :stuck_out_tongue:

  • I fixed auto-save, but the matrix profile loading has been broken all along. Loading a matrix profile resets your DAC correction, Bauer crossfeed, and Loudness settings.
  • It’s difficult to reproduce, but something left my Matrix pipelines mutated: disabling crossfeed should always restore in1>EQ>out1 and in2>EQ>out2, but in my case the latter was in2>EQ>out1.
  • As a side effect of the above, trying to restore structural crossfeed, HQPTuner got confused and wiped out the EQ profile and pipelines to install its own set. A simple Discard restores, but that’s still wildly unacceptable behavior. If the structural crossfeed can’t parse the current pipelines into what it needs, it should refuse with e.g. “current pipeline configuration unrecognized, crossfeed requires a stereo starting point”, not “ok sure let me just clear out everything you have so I can do that.”
  • Scrolling past active knobs/sliders will activate them and inadvertently change values (macOS/Safari).
  • Certain matrix profiles are getting inadvertently overwritten and I’m not sure where/why/how.

At this rate, I’ll find three more by the time those are patched… but I’m working on it.

Stay "tune"d. Get it? Yeah ok I’ll see myself out.

3 Likes

Yes, another new version, v1.1.2, is on :latest!

This one is mostly bug fixes:

  • Loading a matrix profile no longer overwrites dependent settings: DAC correction, loudness, and Bauer crossfeed are all stored in and load with the matrix profile.
  • DAC correction, loudness, and Bauer crossfeed are now correctly gated behind the matrix engine being engaged.
  • Scrolling past a knob/slider no longer triggers a value change. The only valid way to change those is a mouse click; scroll wheels are for moving up and down the page only. edit: not fixed >.<
  • Structural crossfeed/Bauer crossfeed compensation no longer forcibly removes your pipelines to install itself when it can’t parse whatever is installed; instead, it simply says that it requires a stereo starting point. (I’ll work on making it work with multi-channel-to-stereo mixdown).
  • Crossfeed no longer forcibly plots itself onto the matrix response plot; it can be turned on optionally with the “what you hear” button in the Crossfeed card.
  • Changing the volume range no longer incorrectly highlights the ‘Matrix’ tab label

…and a few other minor things.

EDIT: Apparently, two fixes didn’t take… the scroll wheel fix, and the Loudness chip is still showing up when the feature is engaged, even with the matrix engine disabled. Working on those now.

In addition, the new version will add filter description hover tips: hover over a filter in the dropdowns, and its manual description will appear as a tooltip. Really excited about that one.

2 Likes

ANOTHER new version is up, v1.2.0!

It’s mostly bug fixes, however, I added hover tip descriptions on dropdown menus (not easy, by the way) wherein each item has its own manual description (resampling filters, playback “high-frequency” filter, integrator, noise filter, etc.). Now you can see each setting’s description without having to select it. I’ve tested on both Safari and Firefox using macOS, but if anyone has issues on anything else please let me know!

I also wanted to say thanks to everyone for their enthusiasm about this project. This started out as me building myself the interface I wanted—really, the interface I feel HQPlayer deserves—and it means a lot to see so many other people using it.

For me personally, the project has already paid huge dividends way beyond finding better filters. For example, I’d never EQ’d my headphones before I built the Headphone Auto EQ library into HQPTuner. My philosophy was “just buy headphones you like the sound of already lmao”; I didn’t understand the difference between corrective EQing and tonal EQing. But other than that, I had nothing against the EQ crowd, and the feature was really simple to integrate, so what the hell. Then I had to test it out. I loaded up the correction profile for my Auteur Classics and the results blew my mind straight into outer space. I’d literally never heard corrected treble from a headphone until I had to test out my own f’ing feature. The clarity, space, and soundstage were beyond anything I realized my own headphones could do. Immediate convert.

I’ve also noticed that a lot of you have Loudness enabled in your screenshots. I’d never even considered using HQPlayer for volume control. Of course I tested the feature out, but then I promptly turned auto headroom/optimal ISO back to -3dB and forgot about it. But I tried it out in earnest earlier tonight and I’m once again a convert: volume adaptive loudness is actually really good once it’s dialed in! It makes low volume listening way better, and that’s good for my ears in the long run. (Also, no more analog pot mismatch nervosa!)

More good stuff to come, and please don’t be shy about suggestions :wink:

P.S. I haven’t forgotten about being able to “favorite” certain filters and narrow to only your favs. The dropdown lists are custom now, which was the hard part… favorites should be simple now.

5 Likes

Amazing update speed, Adam!

I previously suggested the “favorite” filters feature, but honestly, Live preset is already doing the job for me and I’m totally happy with it. If others still want it though, definitely go ahead and build it!

Seeing such a great UI just makes me want even more :rofl:

Is there any chance you could add a feature to reorder the items in LiveMode? I really only touch Live preset and Matrix profile, so being able to access those two without scrolling would be awesome! Of course, some people might prefer having Volume at the top, so being able to custom-order them as we like would be even better.

I previously suggested the “favorite” filters feature, but honestly, Live preset is already doing the job for me and I’m totally happy with it. If others still want it though, definitely go ahead and build it!

Too late :wink:

Is there any chance you could add a feature to reorder the items in LiveMode? I really only touch Live preset and Matrix profile, so being able to access those two without scrolling would be awesome! Of course, some people might prefer having Volume at the top, so being able to custom-order them as we like would be even better.

Yeah, that should be doable!

In the meantime, 1.3.1 is up!

What’s different:

  • Filter favorites!
  • The volume range slider got a long-overdue visual overhaul and some new features like loudness bounds and live volume as a tuner needle.
  • Debug logging, long overdue. Mostly so I can finally trace why my matrix profiles aren’t what I left them as from time to time. Defaults to off, set in compose.yaml, 128KB max retention.
  • Safari: Knobs are now protected from scroll wheels the same as sliders. Previously, you could just be moving up and down the page and accidentally stage a change.
  • Consolidated Live mode a little by moving adaptive volume, junk filter, and the master volume knob inside of the new Playback card.

I’ve also fixed a lot of text deviations from the manual/readme. I want to take this time to lay out the philosophy here that every feature should be accompanied by its manual description verbatim except in the following cases:

  • The manual is referencing a feature, e.g., a checkbox, that is exclusive to HQPlayer Desktop and doesn’t exist in HQPTuner.
  • An extension of the description to accommodate helpful knowledge. This should be from Jussi himself and as lightly paraphrased as possible. One example is the addition of the note “-1 selects the minimum buffer: never use it for normal playback — it can be attempted only for realtime inputs using the input backend.” to the buffer time. These are Jussi’s words (pers. comm.), just rearranged. The manual doesn’t state this, but it’s non-obvious enough that I felt it justified.
  • A list of items that bloats the interface (e.g., PCM gain compensation and DAC bits contain lists of specific DACs and their values that I’ve cut).
  • A feature exclusive to HQPTuner, for example, live mode/presets
  • Typos

As many of you will have noticed, I’ve also renamed two features: the “playback” filter is the “high-frequency” filter and “optimal ISO” is now “Auto headroom”. I felt that “high-frequency” was more descriptive; as for optimal ISO, I had no idea what ISO stood for or meant when I started using HQPlayer. I thought it had something to do wtih a style of FLAC rip. “Auto headroom” says what the feature does without expecting so much of the reader.

Deviations from the manual otherwise will be treated as bugs going forward, so please report any you stumble across.

4 Likes

Okay, ANOTHER version is up, v1.3.2.

This fixes a couple of really bad bugs.

  • I was trying to add volume adaptive loudness to my office listening rig and I literally couldn’t. I could load my matrix profile, engage loudness, restart the daemon the apply… then the daemon would come back with loudness but the wrong matrix profile, and applying the matrix profile would wipe out loudness. Loudness, DAC correction, and Bauer crossfeed are now properly saved as part of the matrix profile.
  • Under circumstances, if you went to live mode to select a rate, you couldn’t. HQPTuner would force you to the lowest rate and claim everything else was unavailable. This is because HQPTuner relies on the daemon to enumerate the available rates, which it doesn’t in certain cases without live playback. Now, when you select a rate from the dropdown, it accepts the click, then simply asks the daemon “is that a valid rate?”. If not, it’ll move you down to the highest rate available on your hardware with the note “That output rate isn’t available on your hardware.”

I also added a convenience feature: restarting the daemon always comes back with your previous matrix profile loaded (as the default profile, so loading that profile again would do nothing), not whatever happened to be saved to default. If that’s not how you use the default matrix profile and I just broke something from your perspective, let me know how you use it and I’ll figure something else out.

Internally, I added a lot more quality gates (better late than never, I guess) so the code went through some pretty heavy refactoring. Obviously nothing should have broken, 90% of it was just improving docstrings and typing (for you non-programmers, that means declaring variable types), but please don’t hesitate to say if you see any weirdness.

2 Likes

Omg thank you. This is the kind of usability stuff that drives one crazy with HQP UI. Or when you create and save a new matrix profile it doesn’t become the current active profile - or offer a choice to make it default etc

2 Likes

Sorry for the newb question, does this only work with HQPlayer Embedded 6? I am on 5.17. This could be enough for me to upgrade. Looks awesome, well done!