docs(TODO-1.0): fold second-batch answers — pitch AD becomes AHD, VELOCITY deck supersedes MASTER placement, full-height overlays with linked stereo

This commit is contained in:
2026-07-28 19:49:05 -04:00
parent 113d268553
commit 587032ffa4
+124 -40
View File
@@ -36,6 +36,15 @@ item 9 is explicitly both — a suspected regression plus a feature spec. Bugs
are recorded compactly (symptom, expected behavior, acceptance gate) with **no are recorded compactly (symptom, expected behavior, acceptance gate) with **no
root-cause analysis** — same no-code-reads constraint as the first batch. root-cause analysis** — same no-code-reads constraint as the first batch.
A **second-batch follow-up round** (2026-07-28, same day) answered items 7, 8,
and 11. Item 7 closes clean. Item 11's answer **supersedes the original ask's
button placement** — a new VELOCITY deck group replaces the per-section
placement, MASTER being reserved for later post-voice-mixer concerns. Item 8's
answer is a **spec change, not a clarification**: the pitch envelope's AD
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.
Ordering note: item 1's curve/overlay treatment explicitly anticipates item 2's 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 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. in sequence or together, but 1 and 2 are prerequisites for 3's full surface.
@@ -43,7 +52,8 @@ Second-batch interactions: the three bugs (46) are independent of the
enhancement chain and can land at any time. Item 8 edits the same overlay enhancement chain and can land at any time. Item 8 edits the same overlay
surface as item 1 and is cheapest folded into or immediately after that work; surface as item 1 and is cheapest folded into or immediately after that work;
item 10's per-ring reset presupposes item 1's inner dials; item 11's filter item 10's per-ring reset presupposes item 1's inner dials; item 11's filter
velocity-curve placement presupposes item 2's Filter deck; item 9's velocity curve presupposes item 2's filter (though its button now homes in
item 11's own VELOCITY deck, not the Filter deck); item 9's
loop-sustain is a Gate-mode (Staged) feature and composes with item 3's 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 Gate-unavailable-in-Spline rule. Item 13 (anti-aliasing audit) touches nearly
every surface the other items repaint — sequencing it after the layout/knob every surface the other items repaint — sequencing it after the layout/knob
@@ -111,13 +121,16 @@ contrast failure.
saved before this change reopens with unchanged audible envelope behavior" saved before this change reopens with unchanged audible envelope behavior"
admits no other default. Daniel prompted the question; this is the only admits no other default. Daniel prompted the question; this is the only
answer consistent with what he has already settled.)* answer consistent with what he has already settled.)*
- **Segment curve values on all envelopes.** Amp AHDSR, Pitch AD, and Filter - **Segment curve values on all envelopes.** Amp AHDSR, Pitch AHD (AD in the
AHDSR all gain an editable curve value per *sloped* segment. The curve is an original ask; item 8's follow-up adds the Hold stage), and Filter AHDSR all
gain an editable curve value per *sloped* segment. The curve is an
exponential function; the per-segment parameter is the exponent scalar, exponential function; the per-segment parameter is the exponent scalar,
range **0.1 to 10**. range **0.1 to 10**.
- **Which segments are sloped.** **Every stage except Hold and Sustain** — for - **Which segments are sloped.** **Every stage except Hold and Sustain** — for
an AHDSR that is Attack, Decay, and Release; for the Pitch AD, both stages. an AHDSR that is Attack, Decay, and Release; for the Pitch AHD (A→H→D since
*(Settled by follow-up.)* item 8's spec change), Attack and Decay — its Hold, like every Hold, is flat
and carries no curve dial. *(Settled by follow-up; the pitch reading updated
for item 8's AD→AHD change.)*
- **Linear neutral.** Exponent **1.0 is the linear neutral** (y = x^1.0 is - **Linear neutral.** Exponent **1.0 is the linear neutral** (y = x^1.0 is
linear). *(Settled by follow-up — emphatically.)* linear). *(Settled by follow-up — emphatically.)*
- **Curve editing in the overlay.** Dragging on a segment in the overlay - **Curve editing in the overlay.** Dragging on a segment in the overlay
@@ -502,20 +515,28 @@ FX-button path remains unregressed.
> in the waveform visual. left on top. mono mode still shows just one channel > in the waveform visual. left on top. mono mode still shows just one channel
> for unredundancy. > for unredundancy.
**Daniel's follow-up (verbatim, 2026-07-28).**
> 7) One full height; stereo linked processing, one editor
**Behavior.** **Behavior.**
- In **stereo mode**, the waveform visual shows **both L and R channels, left - In **stereo mode**, the waveform visual shows **both L and R channels, left
on top** (two stacked lanes). on top** (two stacked lanes).
- In **mono mode**, a single channel shows — no redundant duplicate lane. - In **mono mode**, a single channel shows — no redundant duplicate lane.
- The display keys off the active channel mode, per Daniel's phrasing. - The display keys off the active channel mode, per Daniel's phrasing.
- **Overlays draw once, at full height.** Overlays that ride the waveform
(the envelope overlay, markers, and item 9's loop region if it lands) draw
**once at full height across both stacked lanes** — not per lane.
*(Settled by follow-up.)*
- **Stereo processing is linked.** One editor, one set of controls governing
both channels — no per-channel parameter divergence, no per-channel editing
surface. *(Settled by follow-up.)*
**Open questions.** **Open questions.**
- How overlays that ride the waveform (the envelope overlay, markers, and - None remaining — the overlay-layout question closed by the second-batch
item 9's loop region if it lands) render across the stereo split — spanning follow-up round.
the full stacked height once, or drawn per lane. A layout call to make at
implementation with Daniel's eye; the product intent is only that overlays
stay legible and unambiguous in both modes.
**Acceptance criteria.** **Acceptance criteria.**
@@ -524,10 +545,15 @@ FX-button path remains unregressed.
differs between lanes). differs between lanes).
- Mono mode shows exactly one lane. Switching modes updates the display - Mono mode shows exactly one lane. Switching modes updates the display
accordingly. accordingly.
- In stereo mode, waveform-riding overlays (envelope, markers, loop region if
present) render once at full stacked height — no duplicated per-lane copies
— and stay legible across both lanes.
- No per-channel controls appear; every edit applies identically to both
channels (linked stereo processing, one editor).
--- ---
## 8 — Enhancement: staged-envelope overlay release anchored right, dragged from its top node *(his 3, second)* ## 8 — Enhancement: staged-overlay release anchoring; the Pitch AD becomes AHD *(his 3, second)*
**Daniel's ask (verbatim, 2026-07-28).** **Daniel's ask (verbatim, 2026-07-28).**
@@ -538,9 +564,18 @@ FX-button path remains unregressed.
> to sustain segment) instead of the bottom corner, which will now be anchored. > to sustain segment) instead of the bottom corner, which will now be anchored.
> All staged envelope overlays should follow this policy. > All staged envelope overlays should follow this policy.
**Daniel's follow-up (verbatim, 2026-07-28).**
> 8) For the AD... make it AHD, and the combined A H and D segment lengths
> (time displacement) cannot exceed the full sample length. Hold goes from 0
> 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.
**Intent.** A layout-policy change to the staged envelope overlay so it uses **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 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. occupies only a small stretch and the whole figure reads off-center. The
follow-up round grew this item beyond layout: it now also carries **the spec
change that turns the pitch envelope from AD into AHD**.
**Behavior.** **Behavior.**
@@ -548,19 +583,43 @@ occupies only a small stretch and the whole figure reads off-center.
- Release is dragged from its **top node** — the node joining sustain to - Release is dragged from its **top node** — the node joining sustain to
release — instead of the bottom corner. The bottom corner (the envelope's release — instead of the bottom corner. The bottom corner (the envelope's
end point) becomes **fixed/anchored**, not draggable. end point) becomes **fixed/anchored**, not draggable.
- The policy applies to **all staged envelope overlays** — amp AHDSR today, - **The policy applies to the envelopes that have a release** — the amp AHDSR
Pitch AD, and the filter AHDSR when item 2 lands. today and the filter AHDSR when item 2 lands. **It does not apply to the
pitch envelope: D is not a release stage, so it is not right-anchored.**
*(Settled by follow-up — this closes the prior open question about mapping
the policy onto the pitch envelope: the answer is that the policy does not
apply there; the envelope gains a Hold stage instead.)*
- **Spec change: the pitch envelope becomes AHD.** The Pitch AD gains a
**Hold** stage: **Attack → Hold → Decay**. *(Settled by follow-up — a spec
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.
- **Cross-references.** Item 1 reworks this same overlay surface (radio - **Cross-references.** Item 1 reworks this same overlay surface (radio
switch, mid-segment curve knots, recolor) — this item is cheapest folded switch, mid-segment curve knots, recolor) — this item is cheapest folded
into or immediately after that work. Item 3's Spline overlays are unaffected into or immediately after that work; item 1's sloped-segment rule reads
by construction: a spline always spans the full sample width already. 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.
**Open questions.** **Open questions.**
- How the policy maps onto the two-stage Pitch AD, which has no sustain or - **Hold's 0100% — percent of what?** Daniel did not say: the full sample
release: presumably its final (decay) segment's endpoint anchors right and length, the time remaining after Attack, or something else. A narrow Daniel
drags from its top node, but Daniel stated the policy in AHDSR terms — call — do not assume at implementation.
confirm the AD reading 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.
**Acceptance criteria.** **Acceptance criteria.**
@@ -568,8 +627,14 @@ occupies only a small stretch and the whole figure reads off-center.
right edge — the overlay reads full-width, not bunched left. right edge — the overlay reads full-width, not bunched left.
- Dragging the sustain→release top node adjusts release; the bottom-right - Dragging the sustain→release top node adjusts release; the bottom-right
corner is fixed and not draggable. corner is fixed and not draggable.
- Every staged envelope overlay (amp, pitch, and filter once present) follows - The envelopes with a release (amp, and filter once present) follow the same
the same anchoring policy. 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 0100% 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.
--- ---
@@ -660,7 +725,7 @@ playback cycling the loop until note-off, then release.
--- ---
## 11 — Enhancement: preview glyph; velocity-curve buttons per section; bipolar pitch/filter curves *(his 6)* ## 11 — Enhancement: preview glyph; VELOCITY deck for velocity-curve buttons; bipolar pitch/filter curves *(his 6)*
**Daniel's ask (verbatim, 2026-07-28).** **Daniel's ask (verbatim, 2026-07-28).**
@@ -672,6 +737,13 @@ playback cycling the loop until note-off, then release.
> velocity transfer functions default to y=0 and y range is [-1,1] (where as > velocity transfer functions default to y=0 and y range is [-1,1] (where as
> amp stays unipolar at [0,1]). > amp stays unipolar at [0,1]).
**Daniel's follow-up (verbatim, 2026-07-28).**
> 11) actually, that is a real contention point... MASTER is for other things,
> post voice mixer (I will add to this later). The velocity popup buttons
> should all go together in a new control deck group labelled VELOCITY, to the
> left of VOICE
**Behavior.** **Behavior.**
- **Preview glyph.** The preview button's inner text is replaced with a glyph. - **Preview glyph.** The preview button's inner text is replaced with a glyph.
@@ -679,38 +751,50 @@ playback cycling the loop until note-off, then release.
"audition" read. Daniel's constraint: **no new dependencies** — a statically "audition" read. Daniel's constraint: **no new dependencies** — a statically
embedded bitmap or equivalent that plays nicely with the existing drawing embedded bitmap or equivalent that plays nicely with the existing drawing
path is fine. path is fine.
- **Velocity-curve button placement.** Amp velocity curve button → **MASTER** - **Velocity-curve button placement — the VELOCITY deck.** All three
section; pitch velocity curve **PITCH** section; filter velocity curve → velocity-curve popup buttons (amp, pitch, filter) live **together in a new
**Filter** section (the deck item 2 creates). control deck group labelled "VELOCITY", placed to the left of the VOICE
group**. *(Settled by follow-up.)* Note for readers of the prior revision:
this **supersedes the original ask's per-section placement** (amp → MASTER,
pitch → PITCH, filter → Filter). Daniel confirmed the MASTER placement was
a real contention point — **MASTER is reserved for other, post-voice-mixer
concerns** (he will add to it later), so the velocity curves do not belong
there.
- **Storage stays per-zone.** The velocity transfer curves are stored
**per-zone**, with the other playback parameters — Sample/Zone panel parity
applies. *(Derived, not a Daniel quote: the storage doubt existed only
because the proposed MASTER placement implied per-instance storage; with
the buttons in their own VELOCITY group that doubt is gone, and the
project's settled convention — playback parameters are per-zone, VOICE and
MASTER the per-instance exceptions — decides it.)*
- **Bipolar pitch/filter transfer functions.** Pitch and filter velocity - **Bipolar pitch/filter transfer functions.** Pitch and filter velocity
transfer functions are **bipolar: y range [1, 1], default y = 0** — flat at transfer functions are **bipolar: y range [1, 1], default y = 0** — flat at
zero, meaning velocity modulation of pitch and filter is **off until the zero, meaning velocity modulation of pitch and filter is **off until the
user draws a curve**. **Amp stays unipolar at [0, 1]**, and its existing user draws a curve**. **Amp stays unipolar at [0, 1]**, and its existing
flat default (every velocity → unity) is unchanged. flat default (every velocity → unity) is unchanged.
- **Cross-references.** Item 2 introduces the filter's velocity modulation and - **Cross-references.** Item 2 introduces the filter's velocity modulation
the Filter deck — this item specifies that curve's domain, default, and this item specifies that curve's domain and default, and homes its button
button placement. Item 3's shared spline editor serves these curves, so it in the VELOCITY deck. Item 3's shared spline editor serves these curves, so
must render and edit a **bipolar y-domain** for pitch and filter alongside it must render and edit a **bipolar y-domain** for pitch and filter
the amp curve's unipolar one. alongside the amp curve's unipolar one.
**Open questions.** **Open questions.**
- Whether a user-facing pitch velocity transfer curve already exists or is - Whether a user-facing pitch velocity transfer curve already exists or is
introduced by this item — unverifiable here under the no-code-reads introduced by this item — unverifiable here under the no-code-reads
constraint; if absent, this item introduces it. constraint; if absent, this item introduces it. (The former second question
- The amp velocity curve's *button* moves to MASTER, but MASTER is settled as — amp-curve storage under the MASTER placement — dissolved with the
a per-instance group while the velocity curve is a playback parameter. Does placement's supersession; storage is settled per-zone above.)
the move imply the amp velocity curve becomes per-instance, or is it a
purely spatial relocation with storage unchanged? This also touches
Sample/Zone panel parity (which surfaces show the button). Needs a Daniel
call before implementation.
**Acceptance criteria.** **Acceptance criteria.**
- The preview button shows the glyph (no text) and stays legible in all - The preview button shows the glyph (no text) and stays legible in all
interaction states; no new build or runtime dependency is introduced. interaction states; no new build or runtime dependency is introduced.
- The three velocity-curve buttons sit in their named sections: amp in MASTER, - The three velocity-curve buttons sit together in a deck group labelled
pitch in PITCH, filter in Filter. **VELOCITY**, immediately to the left of the VOICE group; no velocity-curve
button appears in MASTER, PITCH, or Filter.
- The velocity curves follow Sample/Zone panel parity and persist per-zone
(two zones with different curves audibly differ).
- Opening the pitch or filter curve shows a bipolar editor ([1, 1]) defaulted - Opening the pitch or filter curve shows a bipolar editor ([1, 1]) defaulted
flat at y = 0; played velocities produce no pitch/filter modulation until a flat at y = 0; played velocities produce no pitch/filter modulation until a
curve is drawn, then audibly follow it. curve is drawn, then audibly follow it.