docs: record Phase Gamma Wave 3's two landed tracks in COMPLETED
This commit is contained in:
@@ -1172,3 +1172,79 @@ judging it visually in the DAW and has not yet ruled.**
|
||||
**Neither track has been verified in a running DAW; both are asserted in CTest only.**
|
||||
The full test suite passes on the merged result — **99/99, Debug config, on one
|
||||
machine** — not a general cross-platform or Release-config claim.
|
||||
|
||||
### Γ-W3-T1 — deck-reflow
|
||||
|
||||
The knob deck's row law stops being a wrap outcome and becomes a property of the group
|
||||
descriptor, by construction: two categorical rows — Sound (PITCH/RATE, FILTER, VELOCITY,
|
||||
VOICE) and Contour (PITCH ENV, FILTER ENV, AMP ENVELOPE) — plus a double-height,
|
||||
right-anchored MASTER bus deck outside both, carrying the limiter enable toggle, one
|
||||
reserved cell, the output meter column, and a passive gain-reduction lamp. `DeckRow {
|
||||
Sound, Contour, Spanning }` and `deckRowFor` (`ui/deck_groups`) are an exhaustive switch
|
||||
over every `DeckGroupId`, so a group added later without a row assignment is a compile
|
||||
error; the greedy whole-group wrap this replaces is gone entirely, not merely unreached at
|
||||
this width.
|
||||
|
||||
FILTER's `Band|Notch` toggle moves from the knob row into its own caption's previously
|
||||
unused second toggle slot, taking the group from 524 to 432 px (−92) — the reduction that
|
||||
lets row 1 (980 px natural) fit inside the row block. VOICE deliberately keeps its
|
||||
`Retrig|Legato` row toggle rather than following suit: moving it to the caption would make
|
||||
VOICE *wider* (226 px vs. 164), since its caption row is already the binding side.
|
||||
|
||||
**The row block widened 1020 → 1028 px and the editor floor moved 1190 → 1198 px
|
||||
(Daniel's ruling, 2026-08-02).** The originally specified 1020 could not simultaneously
|
||||
deliver the filter tie-line (both rows' FILTER/FILTER ENV right edges landing at the same
|
||||
x) and equal, no-narrower-than-12px gutters on both rows — the three properties were never
|
||||
jointly satisfiable at that width. At 1028 all hold: row 1's three gutters land at
|
||||
16/16/16, row 2's two at 76/76, and both FILTER and FILTER ENV land their right edge at x
|
||||
= 640. Ceiling headroom against the 1280 px cap is now 82 px.
|
||||
|
||||
The MASTER meter's per-block state moved from a plain overwriting store to an accumulated
|
||||
one: at 48 kHz/512-frame blocks, roughly 47 blocks elapse between two 500 ms UI ticks, so
|
||||
the overwriting store had displayed one block in ~47 and dropped the rest. The processor
|
||||
now folds a per-channel peak max and a limiter min-gain across the whole interval, and the
|
||||
consuming `masterBusMeter()` read clears the accumulators as it drains them.
|
||||
|
||||
**The instrument reload was decoupled from VST3 activation as part of this track** —
|
||||
`setActive(false)` now parks the decoded `SampleData` and destroys only the voice state,
|
||||
`setActive(true)` rebuilds the voices around the parked sample, so a host-driven
|
||||
activation cycle costs no disk read and no WAV decode. This discharges the `docs/TODO.md`
|
||||
follow-up already recorded in full detail at the top of this file ("Decouple the
|
||||
instrument reload from VST3 activation") — not restated here.
|
||||
|
||||
The limiter toggle's commit is split so that cheaper cycle stays off the mouse handler:
|
||||
the audible state — the parameter, the audio-thread mirror, the latency reader — commits
|
||||
inline on the click; only the host's `restartComponent(kLatencyChanged)` notification is
|
||||
deferred, drained by the editor's existing 500 ms sync tick.
|
||||
|
||||
**Not verified in a running DAW — CTest-asserted only:** the meter at its 500 ms UI
|
||||
cadence, the GR lamp under real limiter action, the limiter toggle's latency
|
||||
renegotiation, the clip cap's click-to-clear, and the recapture-while-editor-closed path
|
||||
(the bank fold and its predicate are unit-covered; the activation that drives them is
|
||||
not).
|
||||
|
||||
### Γ-W3-T2 — bake-reset-amendment
|
||||
|
||||
The correction Phase Γ owed Phase Ξ: Ξ-W2-T1's bake shipped ahead of the sequencing this
|
||||
plan asserted, so its reset list predated rate, pitch offset, the limiter enable, and the
|
||||
loop enable. The finding, on reading what actually shipped: **`resetAfterBake` needed no
|
||||
code change.** All four already reset by construction — none was ever added to the
|
||||
survivor copy-back list, and the function's shape is "default everything, copy back only
|
||||
survivors," so anything never named a survivor already resets. The track shipped
|
||||
field-by-field assertions over two independently-dialled fixtures (never struct equality,
|
||||
which would pass while silently letting a survivor slip through undetected) plus a
|
||||
spot-check sweep confirming both fixtures actually moved every asserted field off its
|
||||
default, so the coverage is mutation-verified rather than merely present.
|
||||
|
||||
**One invariant correction:** `bake/CLAUDE.md` had claimed the whole signal chain prints,
|
||||
master gain included. It doesn't — the render's gain multiply is the only master-stage
|
||||
value it prints; the limiter runs in the processor's block, off the bake path entirely.
|
||||
The claim is now scoped to gain alone, with an explicit note that "the bake prints the
|
||||
gain" does not generalize to the rest of the master stage.
|
||||
|
||||
**Outstanding, not closed by this track.** The limiter's exclusion from the printed master
|
||||
stage is a real audible gap — a capture baked with the limiter engaged comes back
|
||||
unlimited — and Daniel has ruled that a future track will change the bake to print the
|
||||
limiter. Until that lands this is a recorded, known limitation, not an oversight.
|
||||
|
||||
**Neither track has been verified in a running DAW; both are asserted in CTest only.**
|
||||
|
||||
Reference in New Issue
Block a user