Skip to content

v0.2.0: deep-dive voicing pass, M2 preset system, DE localisation, app icon#19

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

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

Conversation

@yves-vogl

Copy link
Copy Markdown
Contributor

Summary

This is the v0.2.0 release wave: a research-derived voicing revision, the suite's first implementation of the M2 preset system (Nave as pilot), a German frame-string localisation, and the app icon wired into the built binaries.

Deep-dive voicing pass (docs/design-brief.md, docs/research-notes.md)

  • Distance's low-shelf taper is now front-loaded, replacing the v0.1 plain-linear-in-dB scaling with an "ease-out" power curve (1 - (1 - normalisedDistance)^1.8), matching the documented "accelerates then saturates" shape of real proximity effect. The high-shelf deliberately keeps its linear taper (see docs/architecture.md's "v0.2.0 Distance taper" note for why that asymmetry is intentional, not an oversight). This is a parameter-behavior-breaking change pre-1.0 — same Distance range/default, different curve; no state migration needed (see CHANGELOG.md).
  • Manual/architecture/README copy replaces the "air-absorption darkening" framing with a directivity-first explanation.
  • LoCut/HiCut's wider-than-NadIR ranges (20-800 Hz / 2-20 kHz) are now documented as a deliberate keep, with a named regression test guarding the four range constants.
  • Manual now flags that Convolution::Normalise::yes is an energy normalisation, not a perceptual loudness match, and points at Level as the fix.

M2 preset system (.scaffold/specs/preset-system-m2.md, binding suite-wide spec)

  • src/presets/PresetManager — factory presets (embedded via BinaryData), user presets (disk), load/save/rename/delete, dirty-state tracking, prev/next navigation, single-file and zip-bank import/export, user-preset-wins-over-factory default resolution.
  • src/presets/PresetBar — the editor strip ([<] [Name*] [>] [Save] [Save As...] [Delete] [Import...] [Export...]), docked at the top of the existing v0.1/v0.2 layout.
  • 8 factory presets (presets/factory/*.json, documented one-line-each in docs/presets.md).
  • German localisation (resources/i18n/de.txt) for PresetBar's frame strings only — parameter/DSP terminology is never translated.
  • Written with no Nave-specific coupling beyond a small PresetManagerConfig/FactoryPresetAsset surface — docs/preset-system-notes.md is the replication recipe for the other 11 plugins.

App icon

ICON_BIG "docs/assets/icon.png" added to juce_add_plugin(...) — verified embedded in the built AU/VST3/Standalone locally (AppIcon.icns present in each bundle's Contents/Resources/).

Fix-wave commits folded in

Commits merged after the v0.1.0 tag that never got their own release are now honestly summarised in CHANGELOG.md's [0.2.0] section: PR #18's audio-thread-safety/robustness fixes (#12, #13), a signed-release CI workflow (#10), and branding/copy housekeeping (#9, #14, #15, #17).

Test plan

  • cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug (JUCE 8.0.14 + Catch2 v3.15.2 via CPM, CPM_SOURCE_CACHE shared cache)
  • cmake --build build --target Tests Nave_Standalone --parallel 4 — clean build, no warnings
  • ctest --test-dir build --output-on-failure73/73 tests green (up from 50: +2 from the already-merged PR fix: resolve review findings (audio-thread safety, robustness) #18, +3 Distance-taper/range-guard tests, +16 preset-system tests, +2 net from other coverage additions)
  • cmake --build build --target Nave_VST3 Nave_AU — both formats build and embed the app icon locally
  • Verified tests/PresetManagerTests.cpp never touches the real ~/Library/Audio/Presets/... directory on the dev machine (test-only directory override + post-test confirmation the real path was never created)
  • CI (macOS + Windows, pluginval strictness 10 + auval) — pending this PR

🤖 Generated with Claude Code

…n, app icon

Distance's low-shelf taper now uses a front-loaded "ease-out" curve instead
of plain-linear-in-dB, matching real proximity effect's documented
"accelerates then saturates" behaviour (see docs/design-brief.md). Manual/
architecture docs replace the "air-absorption" framing with a
directivity-first explanation, and LoCut/HiCut's wider-than-NadIR ranges are
now documented as a deliberate keep with a named regression test.

Implements the suite-wide M2 preset system (.scaffold/specs/preset-system-m2.md)
for the first time, with Nave as the pilot: src/presets/PresetManager (factory
presets embedded via BinaryData, user presets on disk, dirty tracking,
prev/next, single-file and zip-bank import/export, user-wins-over-factory
default resolution) and src/presets/PresetBar (the editor strip). Ships with
8 factory presets and a German frame-string localisation
(resources/i18n/de.txt, selected via SystemStats::getUserLanguage()).
docs/preset-system-notes.md documents the replication recipe for the other
11 plugins. The app icon is now wired into the built AU/VST3/Standalone via
ICON_BIG.

73 Catch2 tests green (up from 50): new Distance-taper shape/regression
tests, a LoCut/HiCut range guard, and 16 preset-system tests covering
round-trip, forward-tolerant import, wrong-plugin/format refusal, factory
integrity, default resolution, dirty-flag lifecycle, prev/next wrap-around,
and bank import/export.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@yves-vogl
yves-vogl merged commit 9fab086 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 03:13
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