-
Notifications
You must be signed in to change notification settings - Fork 0
Releases: FrankieMa77/qudelix
Release list
Qudelix for macOS 1.4.0
Qudelix for macOS 1.4.0
Equalizer
- Band inspector. Click a band's dot to select it; a panel under the graph
carries its filter type, gain and a logarithmic Q slider. Double-click a
band to clear it. A readout badge in the graph's corner follows the drag,
then the pointer, then the selection. - Flatten and Reset are two buttons. Flatten zeroes the gains and leaves
every centre, filter type and Q alone; Reset restores the factory layout
for the current mode. Each is one undo step. - Update writes the curve back into the slot it was loaded from, without a
trip through the Save menu. - The curve and its markers dim when the equalizer is switched off, as the
band table already did. - The gain controls stay on an empty or muted band row.
Presets and corrections
- A preset library on the Mac, beside the twenty slots on the device,
holding as many curves as you care to make. A preset is global or bound to
one output device, records which EQ bank it was made for, and applies
through the same gated, clamped, single-undo path as an import. It lives in
presets.json, read and written with the same care as the other state
files. - Headphones field. Name the pair on the end of the 5K. When the AutoEq
project has measured that model, a fitted correction is offered once, as a
banner and as a line under the field, with the alternative measurements in
a menu. A name is looked up once, and only when it changes. - AI preset studio. Design a preset for the named headphones with an AI
provider of your choosing, on your own key: fifteen kinds, from Correction
and the published targets to Clarity, Warmth and a V-shape. The draft can
be auditioned on the 5K, kept in the library or written into a slot. Silent
until you press Generate; the key lives in the Keychain and nowhere
else; Correction needs no provider at all when a measurement exists. The
Privacy section of the README lists exactly what leaves the machine. - Per-app EQ. Give a single app a second curve of its own from the
library, applied on the Mac before the audio reaches the 5K: a podcast
player on a speech-shaped preset while music keeps the curve on the device,
with no switching by hand. Up to eight apps, each on any library preset or
Default. The section lists what is playing right now, and it inserts the
Mac-side engine only while something is assigned. - Drop a preset file onto the menu bar icon to import it.
- The parser now reads files the way they are actually published:
tab-separated, lower case, pass filters without a gain, shelves without a
Q, a preamble without its colon. When a file carries more filters than the
device has bands, the ones doing the most work are kept rather than the
first twenty, and everything a file asked for and did not get is now said
rather than dropped in silence. - Fits are cached on the values the sliders actually take, so re-fitting a
shape tried a moment ago costs nothing, and the cache keeps the whole
result — the clipping warning and the predicted rating included.
Stage
- Crossfeed by band. Three trims scale the crossfeed amount below 800 Hz,
between 800 Hz and 4 kHz, and above 4 kHz. Trims at 100% are a genuine
no-op, sample for sample. - Balance. Level, ±3 dB split between the sides so the loudness holds, and
time, up to 0.5 ms, to correct a pair whose two sides have drifted. Applied
last, just before the clipper. - True-peak limiter. The stage now ends in a limiter that holds the output
under −1 dBTP by estimating the peaks between samples. Off by default. It
runs after the soft clipper, so the last thing to touch the audio is the
one stage that can state a ceiling and keep it. - Loudness compensation. An equal-loudness contour sized from how far the
estimated level at the ear sits below a reference, so quiet listening keeps
its bass. It follows a thirty-second average of the listening level, and
glides to each new setting rather than stepping. Off by default. - Dynamic bass. The 5K applies its curve after the Mac, so a bass boost is
a promise the driver has to keep. This stage measures what the device's own
curve will do to the low band and eases the loudest passages before they
get there; quiet passages keep the whole boost. Off by default. - Impulse response. Run a WAV, AIFF or CAF impulse response of your own
over the Mac's output, with a Mix slider, per output device. Up to two
seconds, with no added latency at any length; a response the output's
buffer size cannot afford is refused with the two ways out named. - The chain order is fixed: room, crossfeed and balance; convolution; loudness
shelves; dynamic bass; soft clipper; true-peak limiter. - Call awareness. When the 5K is on a call over Bluetooth, or a call app
is holding the headset microphone, the Mac-side engine steps out of the way
and comes back when the call ends. The automatic rate switcher never
renegotiates under a call, and the stream verdict measured before the call
is dropped rather than left voting. - Microphone guard. When an app makes the headset's microphone the Mac's
default input and the Bluetooth link collapses to the voice codec, the app
says so, or puts the default input back on the built-in microphone for you.
Off, Ask or Fix. Two reverts of the same device in two minutes and it backs
off; a Mac with no built-in microphone degrades to asking.
Level
- Estimated level at the ear. One number about the world rather than the
signal, built from the K-weighted loudness of what is playing, the
attenuation the 5K itself reports, and a population figure for the
headphone that a per-output calibration slider lets you shift. Always
marked as an estimate, never printed with a decimal, and the pane says what
it rests on. - The live row shows what the limiter, the loudness shelf and the bass guard
are doing this second, and the signal path names each stage only while it
is actually in the audio path.
Tune
- Shape. Bass, then presence, then tilt, one axis at a time, three rounds
each: twelve comparisons instead of twenty. What you hear is exactly the
curve Keep writes. When the pre-gain headroom cannot carry the full
ranges with matched levels, the ranges shrink until it can, and the intro
says by how much. - Blind check. Five trials of your curve against a flat one, sides
randomised and levels matched. It writes nothing whatever the answer. - Proper level matching. Pairs are matched on the mean magnitude response
from 100 Hz to 8 kHz rather than on the mean of the band gains, so a bass
shelf no longer reads as a large change and a treble tilt as a small one.
The louder side is trimmed down to the quieter, so matching never makes a
session louder than the pre-gain already judged safe. - A by-ear session earns a verdict before anything acts on it. Too many
presses on the silent checks, readings too far apart, or too few of them
refuse the result and show the counts the refusal turned on, on the Tones
side and the Compare side alike. - A Compare session survives closing the popover.
The app
- A new shell. The app owns its status item and popover, so clicking the
icon no longer leaves a view graph behind each time, and the per-second
meter values republish only while the popover is on screen. - A drawn menu bar icon: headphones in a circle, with EQ bypass, the
Soundstage, the stream verdict, battery and a call composed as marks on it. - Install with a double-click. The disk image carries an installer that
copies the app, clears the download flag and launches it, so Gatekeeper
asks once, for the installer, and never again for the app. - The footer shows the version and the source revision it was built from.
- The release build refuses to package a binary that is not universal.
Fixes
- The audio tap consumed the wrong input buffer when the output device had
inputs of its own, so a headset or dock microphone was mixed into what the
Soundstage wrote back out and metered as the listening level. The tap's
buffer is now taken from the end of the list. - A tone test could renegotiate the USB rate under itself. Detection sits the
session out while the pipeline is muted, and a frozen window is never
re-judged as new evidence. - Hi-res content was downsampled to 44.1 kHz on outputs that stop at 48 kHz.
Auto-rate now takes the highest rate at or above 88.2 kHz the output
offers, and holds where there is none. - Outputs that appear a few seconds after login are enumerated again three
seconds in, so their saved Soundstage settings no longer look lost. - Preset and device names are no longer parsed as Markdown in the profile
prompt, the microphone banner, or the footer. - A pane that outgrows its region is clipped at its edge instead of drawing
over the footer. - Imported files go through the hardened reader: no symlink is followed, no
FIFO can wedge the load, and a short read is a failed read rather than a
truncated document parked as recovered. - Two bands sitting on the same frequency can no longer be dragged through
each other. - The microphone guard's alerts, the battery alerts and every other
notification share one delivery path with fixed identifiers, so a battery dipping in and out of
"low" replaces its warning instead of stacking a column of them.
SHA-256 Qudelix-1.4.0.dmg
60524c470f93641992186920436093ebe4472bad5ae6b629ddd7074d26469851
Verify before opening:
shasum -a 256 ~/Downloads/Qudelix-1.4.0.dmg
Requires macOS 14 or later; per-app EQ and everything else that works on the Mac's own audio needs 14.2. Universal binary (Apple Silicon and Intel; only run on Apple Silicon so far). The disk image carries a double-click installer, so Gatekeeper's "Open Anyway" is asked once, for the installer, and never for the app. macOS asks for th...
Assets 4
Qudelix for macOS 1.3.0
Qudelix for macOS 1.3.0
Equalizer
- Drag the curve to shape it. Move a band's dot vertically for gain and
horizontally for frequency; hold Option for Q and Shift for fine steps.
Hovering shows which band a drag would take. Everything goes through the
same gated, clamped path as the sliders. - Undo and redo for EQ edits, with Cmd-Z and Cmd-Shift-Z and buttons beside
Flatten. A drag or an import is one step, not a hundred. - Auto pre-gain. The editor works out how much attenuation the summed curve
needs to avoid clipping in the 5K's own DSP and offers the number. It never
moves a value you set yourself. - Per-band mute for an instant A/B of one band. The gain is kept and
restored exactly, and a mute is never committed to the device's flash. - The requested curve, shown. When an import asks for more than the device
can hold, the requested shape is drawn as a dashed ghost behind the live
curve with the gap shaded and the worst point labelled. - Pre-gain is now written to both stored channels. Previously only the first
was written, which could leave a left/right level imbalance invisible from
the app.
Presets and corrections
- Name preset slots from the app. The name is stored on the 5K, so other
software sees it. Saving an imported correction into a slot names the slot
after it, unless the curve has since been edited. - Fit to a target of your choice when importing from AutoEq, with bass and
tilt adjustment on the same fit. Targets are grouped by form factor. The fit
is asked to stay within the device's limits, so nothing is clamped on
arrival; the published preset is still offered as-is. - Predicted preference rating for over-ear and on-ear corrections, from the
published AES model, scored on the error that survives the bands this device
can actually run. In-ear gets no score: those coefficients could not be
verified from a primary source. - Import from the clipboard. Paste a filter list as published sites print
it. - Bandwidth-aware fitting. When stream-quality detection has measured where
the source stops, an import can be told to stop correcting there. - Profiles. Pair an output device with a preset and be offered the switch
when that output becomes active. It always asks the first time; mark an
output automatic once you trust it. - The EQ snapshot used to repair a device is now kept per EQ group, tagged with
the device it came from, and never restored onto a different device. A
damaged snapshot is parked rather than overwritten.
The device itself
- Device settings drawer: channel trim, a volume ceiling, the DAC
reconstruction filter, power and battery-care state. Crossfeed is shown but
not settable. - The parser now reads the codec, output jack, gain, mute, charger and
low-battery fields it used to skip. The low-battery alert takes the device's
own flag as a trigger, and the header can say "plugged in, not charging"
when battery care is on rather than implying a fault.
Everything else
- Signal path inspector in the Level pane: five rows from source to output
saying what alters the audio and what passes it through. - About panel with the version and the exact source revision, and an
update check that runs only when you press it. - Accessibility names for every icon-only control.
- Copy and Reveal buttons on the diagnostics log.
- The README and privacy section now list every file the app writes and state
that a system-wide audio tap is created at launch by default, with the three
switches that govern it.
Fixes
- Bluetooth stopped retrying a switched-off device every 18 seconds for the
whole session. It backs off to once a minute and logs it once. - The by-ear tuner read headroom off the largest single band rather than the
summed response, so it under-read on exactly the curves with the least
headroom. Tune results derived on top of an import are worth re-running. - The by-ear macros and the tone-test correction were applied by band index,
so in 20-band mode they landed on the wrong frequencies. Both now map by
frequency. - A/B trials were being written to flash and pushed into undo one band at a
time. A trial now reaches neither. - Quitting with the 5K unplugged could save a flat curve as the last EQ and
write it over the real one on the next connect. Snapshots now require a
device that has been read. - Device reports stopped arriving during any slider drag and landed in a burst
afterwards, defeating the echo windows. The HID source now runs in common
run-loop modes. - Recording of the listening history now follows its switch alone. It used to
accumulate whenever the engine ran for stream detection. - Auto-rate refuses to renegotiate the 5K from audio that was going to a
different output device. - A tone test that measured nothing at a frequency says so instead of reporting
typical hearing and writing a "+0 dB" correction through the gap. - The Compare session's reliability check no longer flags a listener who
correctly answered "same" on identical pairs. - The Stage soft clipper is anti-aliased.
- Hardened runtime on the bundle. The audio-recording permission is asked once
more on first launch of this version because the grant is keyed to the
signature. - Two audit rounds of crash, resource and input-validation fixes: NaN and
non-finite sample rates, unbounded loops on hostile buffer descriptions,
throttled logs, bounded caches, state files that refuse anything but a
regular file.
SHA-256 Qudelix-1.3.0.dmg
90312ca69bbf9a395ff4cf5271b11eab55169e6ec3e365b8c2ec2f2aadf0fc78
Verify before opening:
shasum -a 256 ~/Downloads/Qudelix-1.3.0.dmg
Requires macOS 14 or later. Universal binary (Apple Silicon and Intel; only run on Apple Silicon so far). macOS asks for the System Audio Recording permission again on first launch of this version because the app now runs with the hardened runtime and the grant is keyed to the signature.
Assets 4
1.2.0 — Stage, Level and lossless detection
Stage — a soundstage for headphones: width, crossfeed, dialogue lift, room and night mode, with presets and geometry controls, remembered per output device. Applied on the Mac, so the 5K's own EQ is untouched.
Level — live output level and a 14-day listening history.
Is this actually lossless? The Level pane can now tell you. It doesn't ask the player — no music app exposes that — it measures the audio, so it works the same for Spotify, Apple Music, a local file or a browser tab. Lossy encoders discard the top of the spectrum and where they stop is characteristic; lossless carries energy to the edge of its sample rate. The verdict is worded as evidence rather than proof: a lossless file made from a lossy source is reported as lossy (correctly), and warm masters that roll off on their own are reported as unjudgeable rather than accused.
Sample rate — the reason playback stops being resampled. macOS runs a USB DAC at one fixed rate and resamples everything else to it, and unlike iOS it never switches to match what's playing. So a 5K parked at 96 kHz plays every 44.1 kHz album through a resampler. The popover now has a rate row:
- Pick 44.1 / 48 / 88.2 / 96 kHz directly, no trip to Audio MIDI Setup.
- Change which rates the 5K offers the host — the device can be pinned to a single rate, and if it is, macOS has nothing else to offer. The row shows the current setting and can change it (the device re-enumerates, so audio drops for a second).
- Or tick Auto rate and let it follow the music: lossless → 44.1 kHz, lossy → the rate you chose, genuinely hi-res content → 96 kHz. It waits for a verdict to hold for ten seconds, leaves 45 seconds between changes, and narrates every state in plain words. Nothing happens silently, and it can be switched off.
Battery — the 5K's charge, surfaced without opening anything. A bolt in the menu bar while charging; the level joins the icon once it drops to 20%; hovering shows charge, active preset and link. The popover header goes orange at 20% and red at 10%. Notifications fire at 20%, at 10%, and when charging starts — once per episode, so they don't nag, and they survive a brief Bluetooth dropout without repeating themselves.
10-band / 20-band — switch EQ modes from the app. 20-band has now been used on real hardware and reads back correctly.
Fixes — EQ settings persist across device restarts; the popover no longer resizes when switching tabs; file dialogs are usable on the first click.
Requires macOS 14. Stage, Level and stream-quality detection need macOS 14.2 and the System Audio Recording permission, which is asked for once on first use; with them off the app never touches your audio. Universal binary, Apple Silicon and Intel.
The app is signed ad-hoc, so the first launch needs System Settings → Privacy & Security → Open Anyway.
SHA-256 Qudelix-1.2.0.dmg
cbf3c2936523e751b65a13dc2d6107166187ec2f839611451e6692683b47dd5b
Verify before opening:
shasum -a 256 ~/Downloads/Qudelix-1.2.0.dmg
Assets 4
Qudelix for macOS 1.1.0
Two new features, and one fix that matters if you are on 1.0.1.
Bluetooth
The app now controls the 5K over Bluetooth as well as USB. Plug in and it uses
USB; unplug and it carries on over Bluetooth, and the header shows which link is
carrying the connection. Everything works the same either way — status, volume,
EQ, presets, import.
The first Bluetooth device it connects to is remembered, and nothing else is
adopted afterwards. If you need to point it at a different 5K there is a button in
the footer to forget the remembered one.
Tune — find your EQ by ear
A new tab with two ways to settle EQ by listening rather than by reading a graph.
Compare is a blind A/B. Play music you know, and it offers two settings; pick
whichever sounds better. It narrows down over about twenty comparisons and ends
with a curve you can keep or save to a preset. Both options are always matched for
loudness and never labelled, so you cannot simply prefer the louder one — which is
what usually goes wrong with casual A/B tests. "They sound the same" is a real
answer and is used rather than discarded.
Tones plays faint tones at ten frequencies, finds the quietest level you can
hear at each, and compares that against typical hearing. Some presentations are
silent on purpose, and it tells you if you responded to too many of them. Tones
stay quiet throughout, and the EQ is switched off while measuring.
Be clear on what Tones is not: without laboratory calibration it measures your
ears and your headphones together, so the result is specific to that pairing, and
it is not a hearing test in any medical sense. If you are concerned about your
hearing, see an audiologist. For most people with ordinary hearing the honest
answer is that there is nothing to correct, and the app says so plainly instead of
inventing a curve.
Your existing EQ is restored if you stop or discard either session.
Fixed: wrong EQ mode on connect
The handshake reply was parsed in a way that could select the 20-band EQ group on
a device in 10-band mode. The wrong number of bands was shown, and the wrong group
was used for writes, until the device next reported its configuration a few
seconds later. This affects 1.0.1 over USB, so it is worth updating even if you
never use Bluetooth.
Also
Preset names and the device name are sanitised before display, so an odd name
cannot distort the window. Bluetooth scanning never records the names of other
devices nearby — only a count of how many were ignored. The log now notes that it
contains your 5K's Bluetooth address and any preset names, since you are asked to
attach it to bug reports.
SHA-256 Qudelix-1.1.0.dmg
b2e60328404e8827a7f66a80160cdb4ce5086fcb430aee380ddd6fe286f19ff0
The app is signed ad-hoc, not with an Apple Developer ID, so macOS cannot tell you
who built it. Verify your download before opening it:
shasum -a 256 ~/Downloads/Qudelix-1.1.0.dmg
Or, with the .sha256 file downloaded alongside it:
cd ~/Downloads && shasum -a 256 -c Qudelix-1.1.0.dmg.sha256
That should print OK. If it does not, do not open the file.
Requires macOS 14 or later. Universal binary, Apple Silicon and Intel.
Assets 4
Qudelix for macOS 1.0.1
Security hardening release. No new features, and nothing changes about how the
app talks to the 5K.
A full review of the app found no memory-safety or injection issues — the
protocol parsers were already bounds-checked throughout — but several places
trusted device or network input further than they should have.
Device input
- A crafted preset segment could make the app display a fabricated EQ curve as
if the device had reported it. Reassembly now completes only when the preset
is genuinely covered. - Preset names are stripped of control and bidirectional-override characters,
which could previously reorder text in the popover. - Preset index, battery, and volume values are range-checked, and a decoded
preset is clamped to what the editor can express. - Rapid EQ-mode changes are rate-limited so they cannot starve your own volume
and EQ writes.
Logging
~/Library/Logs/QudelixBar.logis now created private to your user account
(mode 0600) and will not be written through a symlink planted at that path.- Text coming from the device is escaped, so it cannot forge log entries.
- The log rolls over to
.log.1instead of being wiped at the size limit.
Network
- The size limits on AutoEq downloads are enforced while the response streams,
rather than after the whole body has been read into memory. - Redirects are pinned to
raw.githubusercontent.com.
Bluetooth
Still unused by the app, but hardened ahead of being wired up: the peripheral
is pinned by identifier on first connection, since a BLE advertisement is
entirely controlled by whatever is advertising.
SHA-256 Qudelix-1.0.1.dmg
e56d57f3c9937042071ab3cd12db1f179895b1ac2cfbb4e6baa6e279fb0169f3
The app is signed ad-hoc, not with an Apple Developer ID, so macOS cannot tell
you who built it. Verify your download before opening it:
shasum -a 256 ~/Downloads/Qudelix-1.0.1.dmg
Or, with the .sha256 file downloaded alongside it:
cd ~/Downloads && shasum -a 256 -c Qudelix-1.0.1.dmg.sha256
That should print OK. If it does not, do not open the file.
Requires macOS 14 or later. Universal binary, Apple Silicon and Intel.
Assets 4
Qudelix for macOS 1.0.0
Native macOS menu bar app for configuring the Qudelix 5K over USB.
Install: download Qudelix-1.0.0.dmg, drag the app to Applications, launch it.
macOS will refuse to open it the first time — the app is signed ad-hoc, not with a
paid Apple Developer ID. Open System Settings → Privacy & Security, scroll to
Security, and click Open Anyway. (The old right-click → Open trick no longer
works on current macOS.) If you would rather not trust a binary, build from source —
see the README.
Requires macOS 14 or later. Universal binary: Apple Silicon and Intel.
What it does
- Live status: battery, charging, firmware, sample rate, input source
- Volume and mute
- Parametric EQ editor with a live response curve, 10- and 20-band modes
- 20 preset slots, load and save
- Preset import from a file or the AutoEq database (6,000+ headphones), and export
- Diagnostics panel logging every packet
Supported
Original Qudelix 5K on firmware 3.x. The app checks the device on connect and
refuses to write to a 5K Plus / T71 / Aura Vita, or to firmware 1.x/2.x, rather
than silently doing the wrong thing.
Unofficial. Not affiliated with or endorsed by Qudelix, Inc.