Skip to content

Releases: Mzaxd/EqualLoud

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 30 Aug 08:23

EqualLoud 2.1

🇬🇧 English

A refinement release focused on making the loudness target trustworthy
a sane, enforced target range and a fix for mono content measurement.

Changed

  • Target-LUFS slider narrowed to [−36, −6] — The old [−60, 0] axis allowed
    nonsense targets: −60 demands a ~+54 dB boost the protection limiter would
    clamp into pumping mush, and 0 LUFS forces maximum compression. The popup
    meter and knob are retargeted to the practical axis, and the Options slider
    uses the same bounds.

Added

  • Target range enforced end-to-end — The bounds are a shared config
    constant checked in every layer: the service worker clamps incoming
    SET_TARGET_LUFS messages, and a settings migration clamps any stored
    target into range, dropping corrupt non-numeric values instead of passing
    them through. Existing stored targets migrate automatically.

Fixed

  • Mono loudness over-read (2.0.1 regression) — Mono media was up-mixed to
    identical stereo before measurement, biasing mono LUFS ~+3 dB high, so quiet
    mono podcasts/clips were under-boosted. Mono now stays native 1-channel;
    5.1 input still down-mixes to stereo correctly.
  • Re-attach on SPA pages — Elements managed via the volume fallback
    (CORS-tainted or takeover-failed) stayed permanently claimed after teardown,
    so an SPA re-inserting the same node never got re-managed. Handles now
    un-claim on every dispose path.

Verification

  • Full release gate: type-check, lint, unit tests, and the LUFS accuracy
    (golden-reference) suite
  • Target-range behavior covered by new unit tests across config, service
    worker, and storage migration

🇨🇳 中文

一次聚焦让响度目标值得信赖的打磨版本——收紧并全链路强制目标范围,
修复单声道内容的测量偏差。

改进

  • 目标响度滑杆收窄到 [−36, −6] — 旧的 [−60, 0] 轴允许明显不合理的
    目标:−60 需要约 +54 dB 的提升,会被保护限幅器压成忽大忽小的糊状声;
    0 LUFS 则意味着极限压缩。弹出面板的刻度盘和旋钮已重定向到实用区间,
    选项页滑杆同步使用相同边界。

新增

  • 目标范围全链路强制 — 边界值是共享的配置常量,在每一层都被校验:
    Service Worker 对 SET_TARGET_LUFS 消息做钳制;设置迁移会把已存储的
    超范围目标值收敛进区间,并丢弃损坏的非数值而不是透传。现有已存储的
    目标会自动完成迁移。

修复

  • 单声道响度偏高(2.0.1 回归) — 单声道媒体在测量前被上混成相同的
    左右声道,导致单声道 LUFS 读数偏高约 +3 dB,安静的单声道播客/片段
    提升不足。现在单声道保持原生 1 声道;5.1 输入仍正确下混为立体声。
  • SPA 页面重新挂载 — 走音量回退路径管理的元素(CORS 污染或接管
    失败)在销毁后仍被永久占用,SPA 重新插入同一节点时再也无法被管理。
    现在每条销毁路径都会解除占用标记。

验证

  • 完整发布门禁:类型检查、lint、单元测试、LUFS 精度(黄金参考)套件
  • 目标范围行为在 config、Service Worker、存储迁移三层均有新增单元测试覆盖

Full Changelog: v2.0.1...v2.1.0

v2.0.1

Choose a tag to compare

@github-actions github-actions released this 27 Aug 15:02

Full Changelog: v2.0.0...v2.0.1

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 04 Jul 07:37

EqualLoud 2.0

🇬🇧 English

A major upgrade focused on professional loudness measurement. EqualLoud now
not only balances loudness — it shows you exactly what's happening to the audio.

New

  • True Peak metering (dBTP) — Measures inter-sample peaks via BS.1770 §5.2
    4× oversampling, the same standard broadcast engineers use. Sample-peak meters
    miss the peaks that happen between digital samples; true-peak catches them.
  • Integrated loudness — The whole-programme gated LUFS (the figure EBU R128
    delivery specifies), now surfaced in the Pro panel. The worklet always
    computed it; 1.0 just never showed it.
  • Loudness Range (LRA) — EBU Tech 3342's measure of dynamic range, shown as
    both a number and a thermometer bar. Tells you whether content is dynamic
    (classical, cinema) or compressed (ads, loudness-war pop).
  • Loudness presets — One tap to set a correct, industry-standard target:
    Streaming (−14, Spotify/YouTube), Podcast (−16, Apple Podcasts/AES), or
    Broadcast (−23, EBU R128). Each preset shows its cited source on hover.
  • Pro mode — Toggle a loudness-analysis panel (dBTP / integrated / LRA).
    Off by default for a clean, minimal interface.

Changed

  • Boost ceiling raised 12 → 24 dB — Quiet content (ASMR, low-volume
    podcasts, old recordings) can now actually reach the target loudness. The
    true-peak Protection limiter (−1 dBTP) is the safety net.
  • Output Protection: always on — The old 5-knob Limiter is gone. Protection
    runs silently at −1 dBTP (EBU R128 spec) in the background — no toggle, no
    knobs, because clipping protection should never be something you can turn off.
  • Tooltip overflow fixed — InfoTip bubbles are now teleported to the page
    body and positioned with position: fixed, structurally eliminating the
    recurring "tooltip clipped by the popup border" bug.
  • "Analyzing" indicator — Moved inline into the tab row (no extra height).
  • Auto language detection — Follows the browser/system language
    automatically on install and whenever the OS language changes. Manual toggle
    still available but no longer required.

Removed

  • Limiter panel (5 sliders → silent background protection)
  • "Loud" preset (−10 LUFS had no standard basis)

Verification

  • 246 unit tests + 38 LUFS accuracy (golden-reference) tests pass
  • True peak verified against pure tones (+1.6 dBTP overshoot at Nyquist) and
    the +1/−1 worst-case signal
  • LRA algorithm verified against EBU Tech 3342 v2.0 specification

🇨🇳 中文

一次聚焦专业响度测量的大版本升级。EqualLoud 现在不仅平衡响度——
还能让你清楚地看到音频到底发生了什么。

新增

  • 真峰值测量(dBTP) — 基于 BS.1770 §5.2 的 4× 过采样算法,测量采样
    点之间的真实峰值。普通峰值表会漏掉数字采样点之间的失真峰值,真峰值能
    抓住它们——这正是广播工程师使用的标准。
  • 整体响度(Integrated LUFS) — 整段节目的 gated LUFS(EBU R128 交付
    标准规定的那个数值),现在在专业面板中展示。worklet 一直在算,1.0 只是
    没显示出来。
  • 动态范围(LRA) — EBU Tech 3342 定义的动态范围指标,同时以数字和
    温度计条展示。告诉你内容是动态丰富(古典、电影)还是被压缩过(广告、
    响度战争后的流行乐)。
  • 响度预设 — 一键设置正确的行业标准目标:流媒体(−14,Spotify/
    YouTube)、播客(−16,Apple Podcasts/AES)、广播(−23,EBU R128)。
    每个预设 hover 时显示依据来源。
  • 专业模式 — 切换响度分析面板(真峰值 / 整体响度 / 动态范围)。默认
    关闭,保持界面简洁。

改进

  • 提升上限从 12 提高到 24 dB — 安静的内容(ASMR、低音量播客、老录音)
    现在能真正达到目标响度。真峰值保护限幅器(−1 dBTP)是安全网。
  • 输出保护:永远开启 — 旧的 5 旋钮限幅器已移除。保护以 −1 dBTP
    (EBU R128 标准)在后台静默运行——没有开关、没有旋钮,因为削波保护
    不应该是你能关掉的东西。
  • 修复提示气泡遮挡 — InfoTip 气泡现在 teleport 到页面 body 层并用
    position: fixed 定位,从结构上彻底解决了反复出现的"问号提示被弹窗
    边框裁切"的问题。
  • "分析中"标识 — 内联进标签行,不再额外占用纵向空间。
  • 自动语言检测 — 安装时以及系统语言变更时,自动跟随浏览器/系统
    语言。手动切换仍可用,但不再必须。

移除

  • 限幅器面板(5 个滑块 → 后台静默保护)
  • "响亮"预设(−10 LUFS 没有标准依据)

验证

  • 246 个单元测试 + 38 个 LUFS 精度(黄金参考)测试全部通过
  • 真峰值算法经纯音验证(Nyquist 频率处 +1.6 dBTP 过冲)和 +1/−1
    最坏情况信号验证
  • LRA 算法经 EBU Tech 3342 v2.0 规范核对

What's Changed

  • feat: 2.0 — True Peak / LRA / Presets / Pro Mode by @Mzaxd in #5

Full Changelog: v1.1.0...v2.0.0

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 03 Jul 13:18

EqualLoud v1.1.0

EqualLoud

🔊 Automatically balance loudness across every video/audio tab — install and forget.

Open as many YouTube videos, podcasts, and music tabs as you like; EqualLoud
keeps their loudness consistent. No clicking, no per-site setup — it just
works in the background.


📦 Download & Install

Option A — Load the unpacked build (recommended)

  1. Download release.zip from the assets below.
  2. Unzip it — you get a dist/ folder.
  3. Open chrome://extensions/ in Chrome or Edge.
  4. Turn on Developer mode (top-right toggle).
  5. Click Load unpacked → select the dist/ folder.
  6. Done. Open any video/podcast tab and the loudness evens out within seconds.

Requires Chrome / Edge 120+.

Option B — Build from source

git clone https://github.com/mzaxd/EqualLoud.git
cd EqualLoud
pnpm install
pnpm build      # produces dist/ and release/release.zip

Then load dist/ as an unpacked extension (same as step 3–5 above).


✨ What it does

  • 100% automatic — the moment audio starts playing in any tab, EqualLoud
    takes over. No icon clicks, no setup.
  • Cross-tab balancing — every playing tab converges to one loudness target
    (default −14 LUFS). Loud ads, quiet podcasts, and normal videos all sit at
    the same level.
  • Boost and cut — quiet content is lifted up toward the target, not just
    loud content pushed down. No more "I can't hear this podcast."
  • Accurate loudness measurement — ITU-R BS.1770-4 K-weighted loudness via
    an AudioWorklet, with sample-rate-aware filter coefficients (correct on both
    44.1 kHz and 48 kHz contexts).
  • Survives restarts — settings are remembered; balancing resumes after a
    browser restart.
  • Per-tab A/B toggle — one click to hear any tab with vs. without
    balancing.
  • Output limiter — on by default, so a loud boost never distorts or clips.
  • 100% on-device — audio is processed locally. No data is collected,
    uploaded, or tracked. See PRIVACY.md.

Click the toolbar icon to

  • Toggle balancing on/off.
  • Drag the target-loudness slider (left = quieter overall, right = louder).
  • See the live gain applied to each tab (+5.2 dB, −3.0 dB, …).
  • Toggle per-tab balance to A/B the effect.
  • Open Settings for the output limiter.

🔧 What's in this release (since 1.0.0)

  • Sample-rate-aware K-weighting — the ITU-R BS.1770 filter coefficients are
    now designed for the runtime AudioContext.sampleRate via bilinear-transform
    pre-warping, instead of fixed 48 kHz constants. Corrects a 0.3–0.7 LU drift
    on 44.1 kHz contexts (the macOS default). At 48 kHz the output is numerically
    identical to before.
  • Popup long-lived Port — the popup now streams state from the service
    worker over chrome.runtime.connect instead of polling, so the live gain
    readout is smoother and the SW isn't woken by poll traffic.
  • Storage schema versioning — settings and limiter records now carry a
    __v tag and run through an idempotent migration chain on load.
  • AudioContext lifecycle backstop — the shared context is closed when the
    extension is invalidated and all media elements have detached, preventing
    leaks across extension reloads.
  • Favicon privacy — tab favicons are served from Chrome's local
    _favicon/ cache. Zero network egress.
  • Mono-source fix — mono audio is no longer duplicated into both channels
    before K-weighting, fixing a +3 dB bias on podcasts and single-channel clips.

See CHANGELOG.md for the full list.


⚠️ Known limitations

  • DRM content (Netflix HD, Disney+, etc.): Chrome forces protected media
    silent when an extension takes over the audio. EqualLoud detects this and
    falls back to a simpler volume-only control (attenuate, no boost).
  • <all_urls> permission: required so balancing works on every site
    automatically. EqualLoud processes audio locally and uploads no data.
  • Pages that synthesise audio without a media element (rare) aren't covered.

📄 License

MIT — see LICENSE.


🇨🇳 中文简介

EqualLoud 会自动把你打开的每一个音视频标签拉到同一个目标响度,全程后台运行,零操作。

安装: 下载下面的 release.zip → 解压 → 在 chrome://extensions/ 开启开发者模式 → "加载已解压的扩展程序" → 选择解压出来的 dist/ 文件夹。(需要 Chrome / Edge 120+)

功能亮点:跨标签自动均衡、既能放大也能衰减、基于 ITU-R BS.1770-4 的 K 加权响度测量(适配 44.1/48 kHz)、重启不丢设置、单标签 A/B 对比、输出限幅器、100% 本地处理不上传任何数据。

What's Changed

  • fix(ui): InfoTip 被遮挡 + 挤出横向滚动条 by @Mzaxd in #1
  • EqualLoud 顶尖化升级 by @Mzaxd in #2
  • polish: code review pass toward top-tier extension quality by @Mzaxd in #3
  • fix(sw): 实时音量条经常空白——LUFS_REPORT 被 throttle 时不 push by @Mzaxd in #4

New Contributors

  • @Mzaxd made their first contribution in #1

Full Changelog: https://github.com/Mzaxd/EqualLoud/commits/v1.1.0