Releases: antoinecellerier/speaker-tuning-to-easyeffects
Releases · antoinecellerier/speaker-tuning-to-easyeffects
Release list
v2026.07
Fixed
- [AUDIBLE] Auto-detection no longer picks another codec's tuning when two tunings share one codec-subsystem id (Lenovo reuses them across Realtek codecs), which made affected devices sound clearly wrong; the codec device id now disambiguates. Re-run the script to regenerate if yours matched wrongly (#33).
--speaker-info(and XML matching on PCI-keyed filenames) now reports the analog audio controller's PCI subsystem instead of the GPU HDMI function's, which hid the machine SKU id on dual-controller AMD laptops (#33).--speaker-infono longer doubles the SoundWire amplifier count in the speaker-layout estimate; each enumerated amp is counted once, with its channel count probed from the hardware (#27).- Auto-detection now finds the Dolby tuning on Cirrus cs35l56 SoundWire laptops (e.g. Samsung Galaxy Book6), which the old part-id match missed. No change for already-matched devices; re-run with
--autoload(#26; why indocs/cross-device-findings.md).
Changed
- [AUDIBLE] SoundWire presets are quieter and less mid-forward: two legacy hardcoded boosts are removed, as both compensated an IEQ over-application bug fixed in v2026.05. Re-run the script to regenerate; not yet heard on-device (SoundWire hardware pending, #29; full why in docs/design-notes.md, unvalidated-scaling entries 1/3).
Added
- The generation report now warns when the tuning's regulator never engages yet carries the volmax loudness boost, since the boost then hits the final limiter untamed and can squash loud content; the warning points at
--disable volmax(#27). - Old-kernel hint: when the running kernel series is more than 18 months old, the end of a run,
--doctor, and--speaker-infonow say so and suggest a newer kernel (distro backports / HWE) — speaker-amp fixes land kernel-side, and one report's bad sound was fixed entirely by a kernel upgrade (#33). --speaker-infonow reports an amplifier-status section — per-amp driver bind, a probed channel count, and firmware / kernel-log evidence for both HDA and SoundWire smart amps — to help diagnose silent or degraded speakers. Known firmware-missing log signatures are flagged; otherwise it points you at the log to read yourself (#27).--best-guess: when auto-detection finds no exact hardware match, fall back to the only internal-speaker tuning whose manufacturer is present (or list the candidates to pass one as the XML path), so a laptop on an unmapped filename convention can still generate a preset instead of erroring (#26).- Mark additional tested devices: ThinkPad E14 Gen 2 AMD (#25), Lenovo Yoga Pro 7 14APH8 (#30), ASUS TUF Gaming A15 (#34), Lenovo IdeaPad Pro 5 14IMH9 (#36), Lenovo IdeaPad Pro 5 14APH8 (#33).
Docs
- Field outcome: on the Samsung Galaxy Book6 Ultra, installing the machine's Cirrus speaker firmware (extracted from the Windows driver by the reporter) fixed the speakers outright, and the generated preset then added no audible benefit — that device's voicing lives in the amplifier firmware, not in the Dolby host tuning. README now routes the thin-and-quiet-speakers symptom to
--speaker-infoand the reporter's extraction write-up (#27; full analysis indocs/cross-device-findings.md). - Research: the loud-bass dynamics gap vs Dolby (generated presets compressing loud bass less than DAX) is re-attributed to gain staging, not regulator timing. The v2026.06
--volmax-slot input-gaindefault narrows but does not close the gap on re-measurement, leaving the band-limiter realization as the open lever (#23; evidence indocs/design-notes.md).
v2026.06
Changed
- [AUDIBLE] Cleaner low end on loud, bass-heavy content with
volmax. Thevolmax-boostloudness gain now runs through the per-band regulator by default, so it tames the boosted bass before the final limiter instead of distorting it.--volmax-slot output-gainrestores the old placement. Re-run to regenerate (#23; measurements and why indocs/design-notes.md). - [AUDIBLE] Stereo image is no longer artificially widened. On
dynamic/movieprofiles the converter used to push the sides wider (a widener mapped from Dolby'ssurround-boost), sometimes hollowing the image; a Windows DAX capture showed Dolby does no widening on 2-channel content, so the mapping and the defunct--disable stereoflag were removed. Re-run to regenerate (detail indocs/design-notes.md). - A failed hardware auto-detection now prints a plain
Error: …pointing at--help, instead of dumping argparse's full usage banner — which made an environment problem (no tuning found) look like a mistyped command. Genuine flag mistakes still show usage.
Added
- Volume leveler now reproduced in the PipeWire
filter-chain. A non-bypassed SoundWireautogain, previously dropped with a "no LV2 equivalent" warning, is now emitted as an LSP loudness AGC, soee_to_pipewire.pycovers every stage of the EE chain. Zero added latency, validated EE-vs-PW on-device (details indocs/design-notes.md). --doctor(alias--diagnose) — self-diagnostic for "it loads but sounds like nothing" reports: checks the EasyEffects version, install, impulse-file integrity, the selected preset, and background-service setup, then prints a pasteable PASS/WARN/FAIL report. Normal runs also warn when the detected EE install can't use the presets (e.g. EE 7 bypasses the v8 convolver). (#22)- Simplified-schema DAX3 XMLs are now supported (some Lenovo drivers, e.g. the ThinkPad X1 Carbon Gen 8, were previously rejected). The converter maps their single speaker correction to the left/right channels and emits a convolver + regulator preset, warning that MBC and PEQ are absent in this variant. (#22)
- Warns when a smart-amp firmware gate is muting the woofers. Some laptops (e.g. the Lenovo Yoga Pro 9i) keep the woofers muted until the ALSA control
Speaker Force Firmware Loadis enabled, so--speaker-infoand the end-of-run summary now detect the gate and print copy-paste fixes. (#17) - Auto-discovery now matches Apple Boot Camp tuning XMLs (Intel-Mac DAX3 tunings key on a device-first PCI subsystem, the opposite byte order from an HDA codec). Tentative — unverified on real T2-Mac Linux hardware. (#21)
--autoload-sink NODE_NAME(repeatable) — bind autoload to an explicit PipeWire sink, bypassing speaker detection. Mirrorsee_to_pipewire.py's--target-sink.- Mark additional tested devices: ASUS Zenbook 14 UX3405CA (#19), Lenovo IdeaPad Pro 5 14AHP9 (#18), and ThinkPad X13 Gen 6 Intel (#23).
- Measurement tooling for the unvalidated-scaling capture campaign (no change to generated presets): new loud/speech stimuli, a stereo widening readout, and an absolute-level comparison mode (
compare_ee_vs_dax.py --absolute). - A "Which should I use?" guide in the README weighing EasyEffects against the PipeWire
filter-chain(richer live control vs lower CPU/RAM, both zero-added-latency), plustools/measure_perf/to reproduce the figures on your own hardware. Numbers + method:tools/measure_perf/README.md. - Colored terminal output for
ee_to_pipewire.py, matching the main script (--no-colorto disable);--dry-runnow also reports where the conf and IRS would be written.
Fixed
- Autoload now works on cards whose output route differs from their profile. EasyEffects keys entries on the route but the script wrote the profile, so on such cards the Dolby correction was silently never applied; the filename now uses the route, and sinks with an unresolvable route are skipped with an explanation. (#18)
- Autoload now finds internal speakers PipeWire doesn't tag
audio-speakers(some laptops use a generic UCM2 profile, so the old strict filter matched nothing). It falls back to a relaxed tier of internal analog sinks, prompting when several match;ee_to_pipewire.py's smart-filter target gets the same fallback. (#18) - A newer SoundWire device (Lenovo IdeaPad 5x 2-in-1) now gets its per-band regulator limiting; its thresholds lived in a sub-schema the parser didn't read, so the small speakers silently ran without their excursion guard. No other device's output changes; XML-derived but not yet verified on the hardware — if you have this device, re-run the script. (Detail in
docs/cross-device-findings.md.) - Hardened the SoundWire convolver's pre-chain gain: now capped at +12 dB with a warning if a correction curve would exceed it. No real device reaches the cap (presets are unchanged) — the failure mode is now a loud warning instead of silent clipping.
Docs
- README restructured into a user-first guide (quick-start-led, collapsible reference sections, a pipeline diagram, EasyEffects screenshots). The deep DSP/XML internals moved to a new
docs/reference.md, anddocs/design-notes.mdis now explicitly the research log. No change to generated output.
v2026.05
Changed
- [AUDIBLE] Brought back the treble. The speaker voicing was being applied about 10× too strongly, rolling the highs off far harder than Dolby intends — up to ~28 dB too quiet at the very top of the band — so presets sounded dull and dark, missing high-frequency detail and "air." Reading
ieq-amountas a percentage (its true meaning) restores the bright, detailed top end, now within ~1.5 dB of the Dolby reference. Validated by on-device measurement on a ThinkPad X1 Yoga Gen 7 and corroborated on a second laptop. Re-run the script to regenerate your preset. (#13)
Added
CHANGELOG.mdand a GitHub Releases workflow so notable (especially audible) changes are easy to follow; Watch → Releases to subscribe.--versionflag on both scripts, and a provenance stamp on every generated file (a_generatorfield in the preset JSON, a# version:line in the PipeWire conf) recording thegit describeversion that produced it.ee_to_pipewire.pycompanion converter: turns a generated EasyEffects preset into a PipeWirefilter-chain.conf(LSP + Calf backed) for users who'd rather not run EasyEffects. Attaches as a WirePlumber 0.5+ smart filter, self-contained conf layout, with atools/measure_pw/equivalence harness.- Recognise Lenovo IdeaPad text-vendor
SUBSYSvalues (e.g.IDEA4002) during device discovery. - Mark the Lenovo Yoga Pro 9 14IRP8 (83BU, Realtek ALC287 17AA:38BE) as a supported device. (#17)
Fixed
- Fix HDA codec unpacking in the autodetection error path.
Docs
v2026.04.3
Changed
- [AUDIBLE] Corrected the steepness of high-pass / low-pass filters, which were being built twice as steep as the Dolby tuning specifies. Affects only devices whose tuning includes HP/LP filters; this is a numerical correctness fix — the change in roll-off was not separately listening-tested, so regenerate and trust your ears.
- Round multiband-compressor and regulator band parameters to 4 decimals (negligible numerically).
Added
tools/measure_dax/(capture DAX3's response on Windows) andtools/measure_ee/(capture the live EasyEffects response on Linux), plus an EE-on-Linux vs DAX-on-Windows comparison harness.- pytest suite covering the converter with no proprietary inputs, run in GitHub Actions CI.
- Warn when the XML carries unmodeled DSP blocks (DSO, advanced virtualizer) or watching-only fields.
- Record the ThinkPad T14s Gen 6 AMD subsystem ID in the tested-devices table.
Docs
v2026.04.2
Changed
- [AUDIBLE] Louder, closer to Windows. Applies Dolby's loudness makeup (
volmax-boost, typically +6 dB) so the preset no longer sounds quieter than the same laptop under Dolby on Windows. If it ends up too loud, or the limiter pumps on already-loud tracks, rebuild with--disable volmax. - [AUDIBLE] Devices whose Dolby tuning uses 1, 3, or 4 dynamics bands now get the right number of compression bands instead of being forced to 2. Most laptops ship 2-band tunings and are unaffected; this changes the output only on devices with a different band count (not separately listening-tested).
- [AUDIBLE] Support high-shelf (type 3) and low-pass (type 6/8) PEQ filters for the few devices whose tuning includes them (some Lenovo AIO / ALC274 SKUs) — high-shelf affecting high-frequency brightness/sibilance, low-pass how rolled-off the highs are. Experimental: reproduced numerically from the Dolby tuning but not yet audibly validated — feedback welcome.
Added
- Coloured script and
--helpoutput via optionalrich/rich-argparse, richer per-profile headers, and per-profile--disablehints. --dry-runto skip writing presets, IRs, and autoload configs.- Autoprobe a Dolby source when both
--windowsand the XML path are omitted; detect extracted drivers by XML content; accept aC:drive mount in--windows. - Configure EasyEffects' global fallback preset alongside
--autoload; detect Flatpak EasyEffects even before its first launch.
Fixed
- Reject simplified-schema XMLs with a clear error instead of crashing, filter out Fusion mic-AEC XMLs, and improve endpoint error messages.
- Sanitise the XML profile type before using it in output paths.
Docs
- Expand the cross-device findings to a 1050-XML cohort.
v2026.04.1
Added
- [AUDIBLE] Better presets for SoundWire laptop speakers (small full-range drivers on newer Intel platforms), plus auto-detection of those codecs. Aims to restore the brightness these speakers lose after the FIR is normalised, add a psychoacoustic bass enhancer so small drivers produce more perceived bass, and lift presence/clarity for dialog. Designed from the speaker characteristics rather than listening-validated on a specific device — feedback from SoundWire laptop owners welcome.
--speaker-infoto report detected audio hardware and speaker layout.- Auto-detect Flatpak EasyEffects and write presets to the correct paths.
Docs
v2026.02
Initial release.
Added
- Convert a Dolby DAX3 tuning XML into EasyEffects 8.x output presets: minimum-phase FIR convolver (IEQ target + audio-optimizer speaker correction), speaker PEQ (bell, shelf, and high-pass filters), dialog enhancer, stereo widening, autogain (volume leveler), multiband compressor, per-band regulator, and a brickwall safety limiter.
- Endpoint/profile selection,
--all-profiles,--autoload,--windowsauto-discovery, and positional XML path. MIT licensed; DAX3 conversion findings documented.
Notable behaviour baked into this first release
- Autogain is bypassed by default — without Dolby's Media Intelligence steering it distorts on quiet→loud transitions.
- The convolver's internal autogain is disabled (it would otherwise add a ~+50 dB boost), the dynamics processors are downward-only, and limiter enum parameters are emitted as string labels (not integer indices).