docs(TODO-1.0): item 14 — Trigger-mode amp fades replaced by AHD with curves; amp envelope shape follows playback mode

This commit is contained in:
2026-07-28 20:04:59 -04:00
parent b2013f2056
commit 32785606d4
+125 -6
View File
@@ -2,7 +2,8 @@
Post-1.0 queue for ReaSampler — chiefly the 9000 instrument, plus two
extension-side bugs. Items 13 are the first batch, in Daniel's ordering
(2026-07-28); items 413 are a second batch (2026-07-28, later the same day).
(2026-07-28); items 413 are a second batch (2026-07-28, later the same day);
item 14 is a third, single-item batch (2026-07-28, later again).
Deliberately specified at the level of product
intent, user-visible behavior, and acceptance criteria — **no implementation
design, no file/module references**. These were authored while Phase Q was
@@ -47,13 +48,25 @@ written.
A **second-batch second follow-up round** (2026-07-28, same day) closed item
8's last two questions — Hold's 0100% 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
1:1-overlay/combined-bound policy. **With that, no open question then in the
doc awaited a Daniel decision.** Everything still marked open in items 113 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.
check. Nothing in items 113 is blocked on Daniel.
A **third batch** (2026-07-28, later again) appends item 14 — a single
consolidation enhancement: in Trigger mode the amp envelope's
fade-in-length/fade-out-length pair is replaced by item 8's AHD (with item 1's
curves), so the amp envelope's staged shape follows the playback mode —
Gate → AHDSR, Trigger → AHD. Item 8's sustain-stage scope rule then covers the
amp envelope literally, not just by analogy (a one-line cross-reference is
added there). Item 14 carries **one question awaiting a Daniel decision**
whether item 2's filter AHDSR follows the same mode-driven shape — so the doc
is no longer decision-clean. Its other open question (stage-value state across
the Gate/Trigger switch) is propose-at-implementation-review, not
Daniel-blocking.
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
@@ -68,7 +81,10 @@ loop-sustain is a Gate-mode (Staged) feature and composes with item 3's
Gate-unavailable-in-Spline rule. Item 13 (anti-aliasing audit) touches nearly
every surface the other items repaint — sequencing it after the layout/knob
work (1, 8, 10, 11, 12) likely avoids doing the polish twice; that is an
observation, not a decision.
observation, not a decision. Item 14 (third batch) rides directly on item 8's
AHD definition and item 1's curve treatment — cheapest folded into or
immediately after that combined work — and repaints amp-deck/overlay surface
that items 10 and 13 later polish.
---
@@ -638,7 +654,9 @@ change that turns the pitch envelope from AD into AHD**.
into or immediately after that work; item 1's sloped-segment rule reads
Attack and Decay for the pitch AHD (Hold is flat, no curve dial). Item 3's
Spline overlays are unaffected by construction: a spline always spans the
full sample width already.
full sample width already. Item 14 extends the AHD to the amp envelope's
Trigger mode, so this scope rule selects by the envelope's current shape
under the active playback mode — see item 14.
**Open questions.**
@@ -904,3 +922,104 @@ high-DPI, high-resolution displays. Daniel named the visibly pixely surfaces:
- The audit produces a short disposition list: surfaces checked, which needed
work, which were already clean.
- Daniel signs off by eye on the named surfaces.
---
## 14 — Enhancement: Trigger-mode amp envelope — fade-in/fade-out replaced by the AHD (with curves)
**Daniel's ask (verbatim, 2026-07-28).**
> the amp env trigger mode fade in length fade out changes to the AHD envelope
> (with curves of course), to reduce code for the same thing, and consolidate
> under the new design.
**Intent.** Consolidation. In Trigger mode the amp envelope's fade-in-length /
fade-out-length pair is retired and replaced by the same three-stage
Attack → Hold → Decay envelope item 8 specifies for the pitch envelope — with
item 1's per-segment curves. Daniel's stated motive is reducing code for the
same job: one staged-envelope design covering what is currently two separate
mechanisms doing the same thing. The product consequence: **the amp envelope's
staged shape follows the playback mode** — Gate → AHDSR (sustain,
right-anchored release, per item 8); Trigger → AHD (sustain-less).
**Behavior.**
- **Trigger mode: fades out, AHD in.** In Trigger mode the amp envelope is an
AHD per item 8's definition: Hold spans 0100% of the time remaining after
Attack and Decay, so A + H + D ≤ sample length holds by construction and the
overlay is 1:1 with the waveform's time axis. The fade-in-length and
fade-out-length controls go away in Trigger mode; Attack and Decay carry
those roles under the new design.
- **With curves.** The Trigger AHD's sloped segments — Attack and Decay; Hold
is flat, as everywhere — get item 1's full curve treatment: exponent 0.110,
inner dials, mid-segment overlay knots, tertiary-purple rendering.
- **Gate mode unchanged.** In Gate mode the amp envelope remains the AHDSR
with item 8's right-anchored release. Item 9's loop-sustain spec (a
Gate-mode feature) is untouched.
- **Item 8's scope rule now covers the amp envelope literally.** Item 8
settled that the 1:1-overlay property and the by-construction combined-time
bound apply to envelopes **without a sustain stage**, and the
right-anchored-release policy to those **with** one — Daniel's rationale:
"the 1:1 mapping only makes sense for trigger, not gated envelopes." With
this item the amp envelope in Trigger mode *is* sustain-less, so it takes
the 1:1 time-mapped overlay automatically; in Gate mode it keeps the
right-anchored release. The rationale now describes the amp envelope
directly, not just by analogy: the rule selects by the envelope's **current
shape under the active playback mode**, not by which processor the envelope
modulates. No new rule is needed — item 8's rule already decides both cases.
- **Pre-existing instances reopen sounding identical.** The doc's standing
migration framing (items 1, 2, 11) applies: a project saved before this
change reopens with unchanged audible behavior — in particular, a Trigger
instance's prior fade-in/fade-out contour is reproduced by the loaded AHD.
The evident mapping (Attack ← fade-in, Decay ← fade-out, Hold ← the full
remainder, curve exponents at whatever value reproduces the prior fade
shape) is a verify-at-implementation detail, not a Daniel call; the gate
below states the requirement. A prior zero fade-out is Decay = 0 — the
abrupt end stays representable, so nothing the old controls could express
is lost.
- **Cross-references.** Item 8 supplies the AHD definition and the scope rule
(this item is that rule's second consumer); item 1 supplies the curves —
sequencing: cheapest folded into or immediately after that combined work.
Item 3 is unaffected in Spline mode (a spline already plays as a
full-sample-length time function — the trigger model); its "save but
inactive" dual-state precedent bears on the second open question below.
Item 4's Trigger × Preserve end-of-sample click sits in the region the
fade-out currently governs — whichever of the two lands first, item 4's
gate must be re-verified under the surviving mechanism.
**Open questions.**
- **Does the filter AHDSR follow the same mode-driven shape?** Item 2's
filter envelope is the same staged machinery, so Gate → AHDSR /
Trigger → AHD would extend naturally — but Daniel said this only for the
amp envelope, and it is not asserted here. **Awaits a Daniel decision**
currently the doc's only Daniel-pending question.
- **Stage-value state across the Gate/Trigger switch — shared or per-mode?**
The Gate AHDSR and Trigger AHD share stage names (A, H, D); whether they
share *values* (one envelope whose S and R fall away in Trigger) or keep
per-mode state (item 3's "save but inactive" dual-state precedent) is
unspecified. Migration leans per-mode: an old instance carries both its
AHDSR values and its Trigger fade values, and a shared-value model cannot
preserve both modes' prior sound at once. Resolve at implementation review
with a proposal — not Daniel-blocking, but the sound-identical gate must
hold for whichever mode a saved instance plays in.
**Acceptance criteria.**
- In Trigger mode the amp deck shows Attack / Hold / Decay — no fade-in or
fade-out control anywhere in Trigger mode — with curve inner dials on
Attack and Decay and none on Hold; when the amp envelope is overlay-active
(item 1's radio), its overlay is 1:1 with the waveform time axis, and no
combination of A, H, D settings exceeds the sample length (Hold = 100%
exactly fills it — by construction, no clamp).
- In Gate mode the amp envelope is the unchanged AHDSR: sustain stage,
right-anchored release per item 8.
- Switching between Gate and Trigger playback switches the amp envelope
surface (deck and overlay) between AHDSR and AHD accordingly.
- A project saved before this change reopens sounding identical: a Trigger
instance's prior fade-in/fade-out contour — including a zero fade-out's
abrupt end — is audibly reproduced by the loaded AHD.
- The Trigger amp AHD behaves stage-for-stage like item 8's pitch AHD — Hold
semantics, curve treatment, and overlay mapping match. (This is the
observable proxy for the consolidation motive: one staged-envelope design,
two consumers.)