Skip to content

feat: v0.2.0 deep-dive voicing pass, M2 preset system, DE localisation#22

Merged
yves-vogl merged 1 commit into
mainfrom
feat/v0.2.0-deep-dive-and-presets
Jul 16, 2026
Merged

feat: v0.2.0 deep-dive voicing pass, M2 preset system, DE localisation#22
yves-vogl merged 1 commit into
mainfrom
feat/v0.2.0-deep-dive-and-presets

Conversation

@yves-vogl

Copy link
Copy Markdown
Contributor

Summary

Two things land together for v0.2.0, per the milestone plan (M2 = presets/state):

Research-derived deep-dive voicing pass (docs/design-brief.md, sourced/reasoned against docs/research-notes.md), retuning all four DSP stages without touching the topology or the zero-latency/bit-exact-bypass invariants:

  • De-Ess: new DeEssWidth parameter (0-100%, default 40%) exposes the detector's bandpass Q as a user-facing control for the first time (0% → Q 3.0 narrow, 100% → Q 0.7 wide), replacing v1's hidden fixed Q = 1.2.
  • Air: range narrowed and re-centered from ±12 dB to -6/+9 dB (default +2 dB), and the shelf's explicit Q lowered (~0.707 → 0.5) for a wider, gentler transition band.
  • Gentle Compressor: fixed 150 ms release replaced by a program-dependent ("auto") release - a smoothed blend between a fast (~150 ms) and slow (~1.0 s) envelope path, transparent on isolated transients, glued on sustained program material.
  • Doubler: base delays re-centered from 13/17/23/29 ms to 9/13/19/24 ms; DoubleDetune default lowered 15 → 10 cents with a reshaped power-law knob taper (cents = 50 * p^2.2, range unchanged) giving the tight-double register more knob travel. Not a breaking change to saved state (stored value stays cents; verified against JUCE 8.0.14's AudioProcessorValueTreeState source).

Every default/range change is either sourced with a citation in docs/research-notes.md or explicitly flagged "reasoned, not sourced" in docs/design-brief.md ss5. No brand/product names appear anywhere outside those two research documents (verified via repo-wide grep).

M2 preset system (.scaffold/specs/preset-system-m2.md), ported from the suite's pilot implementation in sibling plugin nave:

  • src/presets/ - PresetManager (factory/user preset discovery, load/save/rename/delete, dirty tracking, default resolution, single-file and zip-bank import/export) and PresetBar (editor strip), copied verbatim per nave's replication recipe.
  • Nine factory presets (presets/factory/*.json, documented in docs/presets.md): Default plus the brief's eight (Lead - Cut Through, Lead - Intimate/Close-Mic, Choir - Wide Spread, Choir - Tight Blend, Spoken/Growled Interlude, Glue Only, De-Ess Only (Surgical), Wide Double (No Dynamics)).
  • German frame-string localisation (resources/i18n/de.txt), auto-selected from system language. Parameter names/units/DSP terminology are never translated.
  • ICON_BIG was already wired by the preceding patch-release PR; verified still present.

Test plan

  • cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug configures clean (JUCE 8.0.14 + Catch2 v3.15.2 via CPM cache).
  • cmake --build build --target Tests Seraph_Standalone --parallel 4 builds clean.
  • ctest --test-dir build --output-on-failure - 60/60 tests green (28 pre-existing + 32 new: 17 PresetManagerTests.cpp, 11 DeepDiveTests.cpp DSP-guarantee coverage, 1 StateTests.cpp tolerant-migration test, plus DeEssWidth/new-range coverage folded into existing Coverage/Robustness/Latency/Allocation tests).
  • New DSP guarantees per docs/design-brief.md ss4: DeEssWidth bandwidth-curve monotonicity + Q-extremes (±10%, verified against JUCE's own analytic getMagnitudeForFrequency() to avoid digital pre-warping bias), DeEssWidth null-bypass sweep, Air magnitude-response shape (1/6/12/20 kHz) + null test, Comp auto-release ballistics (transient-vs-sustained recovery) + blend-boundary continuity + null test, Doubler delay-time bounds + null test + sample-rate sweep.
  • Tolerant state migration: hand-built v0.1.0-shaped XML (no DeEssWidth) loads without failing or perturbing other parameters, DeEssWidth lands on its documented default.
  • CI (macOS + Windows, pluginval strictness 10 + auval) - pending this PR's checks.

Known org-level issue (unrelated to this PR)

macOS release signing has a broken secret (tracked separately) - not exercised by this PR's CI (build/test only, no release job).

Research-derived retuning of all four DSP stages (docs/design-brief.md,
docs/research-notes.md): a new DeEssWidth detection-bandwidth control, a
narrower/gentler Air shelf, a program-dependent auto-release for the Gentle
Compressor, and re-centered Doubler base delays/detune taper - all sourced
or explicitly flagged as reasoned, with no reference brand/product names
outside the two research documents.

Also ports the suite-wide M2 preset system (PresetManager/PresetBar, pilot:
sibling plugin nave) with nine factory presets, a German frame-string
localisation, and 32 new Catch2 tests (60 total, up from 28).
@yves-vogl
yves-vogl merged commit e57191c into main Jul 16, 2026
2 checks passed
@yves-vogl
yves-vogl deleted the feat/v0.2.0-deep-dive-and-presets branch July 16, 2026 05:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant