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 the System Audio Recording permission again on first launch of a new version because the grant is keyed to the signature.