feat: v0.2.0 deep-dive rework, M2 preset system, i18n frame#22
Merged
Conversation
Research-derived voicing rework (docs/design-brief.md, sourced in
docs/research-notes.md): replaces juce::dsp::Compressor's hard-knee-only
gain formula with a from-scratch, threshold-relative soft-knee gain
computer (src/dsp/KneeGainComputer.{h,cpp}, driven by
juce::dsp::BallisticsFilter) and a new per-band Knee parameter (0-100%,
default 50%, bit-for-bit identical to v0.1 at 0%). Per-band
Threshold/Ratio/Attack/Release defaults now diverge (Low/Mid/High) instead
of sharing one uniform default, encoding the documented peak-control vs.
density mastering philosophies and per-band ballistics as standing
invariants rather than one-time values.
Adds the suite-wide M2 preset system (src/presets/, copied from the
basilica-audio/nave pilot implementation): factory/user presets, default
resolution, import/export (single files and zip banks), dirty-state
tracking, and a PresetBar editor strip. Ships eight factory presets
(docs/presets.md) and a German localisation of the preset bar's frame
strings (resources/i18n/de.txt).
State migration is tolerant: sessions saved before v0.2.0 (missing the new
Knee parameter IDs) load cleanly with Knee at its declared default.
Test suite grows from 42 to 73 Catch2 cases: Knee null test and curve-shape
guarantees, per-band-default-divergence and attack/release-ordering
regression guarantees, the full M2 preset system suite, a state
migration-tolerance test, and i18n coverage.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Research-derived deep-dive rework of Triptych's per-band compressor voicing, plus the suite-wide M2 preset system and a German i18n frame. Ships as v0.2.0.
Deep-dive voicing rework (
docs/design-brief.md, sourced indocs/research-notes.md)juce::dsp::Compressordirectly, whose gain formula (gain = (env < threshold) ? 1.0 : pow(env * thresholdInverse, ratioInverse - 1.0)) is a hard knee with zero transition width - confirmed by reading the JUCE 8.0.14 source, and no knee parameter existed anywhere in v0.1'sParameterLayout.cpp.BandCompressornow drivesjuce::dsp::BallisticsFilterdirectly (the same envelope-follower classCompressorused internally) through a from-scratch gain computer,src/dsp/KneeGainComputer.{h,cpp}, implementing the standard quadratic soft-knee interpolation (Giannoulis/Massberg/Reiss, JAES 2012) with a new per-bandKneeparameter (0-100%, default 50%). Knee's extent is threshold-relative: at 100% it spans[2 * thresholdDb, 0], matching the Weiss DS1-MK3 manual's documented "0 to twice the threshold value" convention. At 0%,KneeGainComputer::computeGainLinear()takes a dedicated linear-domain fast path that reproduces v0.1's exact hard-knee formula bit-for-bit - a tested regression guarantee (tests/KneeGainComputerTests.cpp,tests/BandCompressorTests.cpp).lowAttack > midAttack > highAttack,lowRelease > midRelease > highRelease), not just a one-time value, intests/VoicingGuaranteesTests.cpp.docs/architecture.md's "Deferred from v0.2.0" section anddocs/design-brief.md's honesty section.M2 preset system (
.scaffold/specs/preset-system-m2.md)src/presets/(PresetManager/PresetBar/Localisation) copied verbatim from thebasilica-audio/navepilot implementation - seedocs/preset-system-notes.mdin that repo for the replication recipe.presets/factory/*.json,docs/presets.md): Default, Density Glue, Peak Control, Low-End Tighten, De-Harsh Highs, Mastering Safety Ceiling, Parallel-Style Density, Hard Limiter Ceiling.resources/i18n/de.txt), selected automatically forde*system languages; parameter names/units are never translated.AudioProcessorValueTreeState::replaceState()'s own existing "missing ID keeps current value" behaviour, no special-case code needed (tests/StateTests.cpp's migration-tolerance test).Housekeeping
ICON_BIG "docs/assets/icon.png"was already present inCMakeLists.txt(added by the concurrent patch-release PR) - verified, not re-added..github/workflows/release.yml's create-release fix was already merged tomainbefore this branch was cut - verified present.docs/manual.mdupdated for the new Knee parameter, per-band defaults, presets, and i18n.Test plan
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug(CPM_SOURCE_CACHE, native arm64) configures cleanly.cmake --build build --target Tests Triptych_Standalone --parallel 4builds cleanly (no new warnings beyond JUCE's own pre-existing splash-screen pragma note).ctest --test-dir build --output-on-failure- 73/73 tests green (up from 42; all v0.1 test intent preserved, two tests pinned toKnee 0%to keep their exact v0.1 regression assertions, adjusted defaults elsewhere perParameterTests.cpp).Co-Authored-By: Claude Fable 5 noreply@anthropic.com