From b2013f205636c1fce33b272ca61efadb3bfa40c4 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Tue, 28 Jul 2026 20:00:26 -0400 Subject: [PATCH] =?UTF-8?q?docs(TODO-1.0):=20close=20item=208=20=E2=80=94?= =?UTF-8?q?=20Hold=20is=20a=20share=20of=20the=20post-A+D=20remainder,=20s?= =?UTF-8?q?o=20the=20length=20bound=20holds=20by=20construction;=201:1=20o?= =?UTF-8?q?verlay=20scoped=20to=20sustain-less=20envelopes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO-1.0.md | 78 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 24 deletions(-) diff --git a/TODO-1.0.md b/TODO-1.0.md index e33cd5a..4c8556a 100644 --- a/TODO-1.0.md +++ b/TODO-1.0.md @@ -45,6 +45,16 @@ becomes an **AHD** (a Hold stage is added), and the doc's own prose (items 1 and 8) is updated to match — Daniel's verbatim asks stay exactly as originally written. +A **second-batch second follow-up round** (2026-07-28, same day) closed item +8's last two questions — Hold's 0–100% reference, and the scope of the +1:1-overlay/combined-bound policy. **With that, no open question anywhere in +this doc awaits a Daniel decision.** Everything still marked open is +verify-or-propose-at-implementation, not a blocker: item 9's loop-point +regression verification and its spec details (crossfade units, storage +confirmation, editing surface — each carries its own resolve-at-review path in +the item), and item 11's does-a-user-facing-pitch-velocity-curve-already-exist +check. Nothing is blocked on Daniel. + Ordering note: item 1's curve/overlay treatment explicitly anticipates item 2's filter envelope ("filter to be added"), and item 3 layers on both. They can land in sequence or together, but 1 and 2 are prerequisites for 3's full surface. @@ -571,6 +581,12 @@ FX-button path remains unregressed. > to 100%, and the visual overlay for the envelope is then 1:1 scale with the > waveform time. D is not release, so it is not right anchored. +**Daniel's second follow-up (verbatim, 2026-07-28).** + +> 1) 100% of the sample length - attack+decay times +> 2) for all envelopes that DON'T have a sustain stage. The 1:1 mapping only +> makes sense for trigger, not gated envelopes + **Intent.** A layout-policy change to the staged envelope overlay so it uses the full panel width: today, with little or no release, the sustain portion occupies only a small stretch and the whole figure reads off-center. The @@ -594,13 +610,29 @@ change that turns the pitch envelope from AD into AHD**. change, not a clarification. The doc's own prose — here and item 1's sloped-segment reading — is updated to match; Daniel's verbatim asks stay as written.)* - - **Hold ranges 0 to 100%.** Of *what* is unstated — see Open questions. - - **A + H + D combined cannot exceed the sample length:** the three segment - lengths' total time displacement is hard-bounded by the full sample - length. - - **Because of that bound, the pitch-envelope overlay is 1:1 scale with the - waveform time axis** — the drawn envelope maps directly onto the - displayed sample's time. + - **Hold ranges 0 to 100% of the time remaining after Attack and Decay** — + i.e. 100% of (sample length − (attack time + decay time)). At 100%, Hold + fills all the remaining time; at 0% it takes none. *(Settled by second + follow-up.)* + - **The A + H + D ≤ sample-length bound holds by construction**, not by a + separate clamp: Hold is expressed as a fraction of what is left after + Attack and Decay, so the sum cannot overflow. Daniel's stated bound + ("the combined A H and D segment lengths cannot exceed the full sample + length") is a *property* of the Hold definition, not a constraint to + enforce on top of it. + - **The overlay is therefore 1:1 scale with the waveform time axis** — the + drawn envelope maps directly onto the displayed sample's time. +- **Scope rule — split on the sustain stage.** The 1:1-overlay property and + the combined-time bound apply to **all envelopes that do NOT have a sustain + stage**; envelopes **with** a sustain stage (the amp and filter AHDSRs) get + the right-anchored-release policy instead. Daniel's rationale: the 1:1 + mapping only makes sense for trigger, not gated envelopes — that is the + reasoning behind the stage-list rule, not a second competing rule. Today + the pitch AHD is the only sustain-less envelope, but the rule is general: + it governs any future sustain-less envelope too. The two policies + **coexist rather than merge**, split cleanly on whether the envelope has a + sustain stage — the prior revision's open reading, now confirmed. *(Settled + by second follow-up.)* - **Cross-references.** Item 1 reworks this same overlay surface (radio switch, mid-segment curve knots, recolor) — this item is cheapest folded into or immediately after that work; item 1's sloped-segment rule reads @@ -610,16 +642,11 @@ change that turns the pitch envelope from AD into AHD**. **Open questions.** -- **Hold's 0–100% — percent of what?** Daniel did not say: the full sample - length, the time remaining after Attack, or something else. A narrow Daniel - call — do not assume at implementation. -- **Are the 1:1-overlay property and the A+H+D ≤ sample-length bound - pitch-specific, or intended for all staged envelopes?** Daniel stated both - in the pitch-AHD context. An AHDSR with a right-anchored release cannot be - strictly 1:1 across an indefinite sustain, so the two policies appear to - coexist (right-anchoring for envelopes with a release; the 1:1 time-bounded - overlay for the pitch AHD) rather than merge — but that is an open reading - to confirm, not a settled conclusion. +- None remaining — both prior questions (Hold's 0–100% reference; the scope + of the 1:1/combined-bound policy) closed by the second-batch second + follow-up round. The coexist-vs-merge reading the prior revision flagged is + confirmed: the two policies coexist, split cleanly on whether the envelope + has a sustain stage. **Acceptance criteria.** @@ -627,14 +654,17 @@ change that turns the pitch envelope from AD into AHD**. right edge — the overlay reads full-width, not bunched left. - Dragging the sustain→release top node adjusts release; the bottom-right corner is fixed and not draggable. -- The envelopes with a release (amp, and filter once present) follow the same - anchoring policy; the pitch envelope's Decay is **not** right-anchored. +- The envelopes with a sustain stage (amp, and filter once present) follow + the same anchoring policy; the pitch envelope's Decay is **not** + right-anchored. - The pitch envelope plays and displays three stages — Attack, Hold, Decay — - with Hold spanning 0–100% of its (to-be-confirmed) reference; no - combination of A, H, and D settings yields a combined time displacement - exceeding the sample length. -- The pitch-envelope overlay is 1:1 with the waveform's time axis: a stage - boundary at N seconds sits over the waveform at N seconds. + with Hold spanning 0–100% of the time remaining after Attack and Decay. By + construction, no combination of A, H, and D settings yields a combined time + displacement exceeding the sample length (at Hold = 100% the three stages + exactly fill it) — no separate clamp fires, because none is needed. +- The overlay of any sustain-less envelope (today: the pitch AHD) is 1:1 with + the waveform's time axis: a stage boundary at N seconds sits over the + waveform at N seconds. ---