From 587032ffa47fd85900e0fd8d931353ab88955e78 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Tue, 28 Jul 2026 19:49:05 -0400 Subject: [PATCH] =?UTF-8?q?docs(TODO-1.0):=20fold=20second-batch=20answers?= =?UTF-8?q?=20=E2=80=94=20pitch=20AD=20becomes=20AHD,=20VELOCITY=20deck=20?= =?UTF-8?q?supersedes=20MASTER=20placement,=20full-height=20overlays=20wit?= =?UTF-8?q?h=20linked=20stereo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO-1.0.md | 164 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 124 insertions(+), 40 deletions(-) diff --git a/TODO-1.0.md b/TODO-1.0.md index d34ce8a..e33cd5a 100644 --- a/TODO-1.0.md +++ b/TODO-1.0.md @@ -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 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 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. @@ -43,7 +52,8 @@ Second-batch interactions: the three bugs (4–6) are independent of the 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; 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 Gate-unavailable-in-Spline rule. Item 13 (anti-aliasing audit) touches nearly 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" admits no other default. Daniel prompted the question; this is the only answer consistent with what he has already settled.)* -- **Segment curve values on all envelopes.** Amp AHDSR, Pitch AD, and Filter - AHDSR all gain an editable curve value per *sloped* segment. The curve is an +- **Segment curve values on all envelopes.** Amp AHDSR, Pitch AHD (AD in the + 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, range **0.1 to 10**. - **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. - *(Settled by follow-up.)* + an AHDSR that is Attack, Decay, and Release; for the Pitch AHD (A→H→D since + 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). *(Settled by follow-up — emphatically.)* - **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 > for unredundancy. +**Daniel's follow-up (verbatim, 2026-07-28).** + +> 7) One full height; stereo linked processing, one editor + **Behavior.** - In **stereo mode**, the waveform visual shows **both L and R channels, left on top** (two stacked lanes). - In **mono mode**, a single channel shows — no redundant duplicate lane. - 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.** -- How overlays that ride the waveform (the envelope overlay, markers, and - item 9's loop region if it lands) render across the stereo split — spanning - 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. +- None remaining — the overlay-layout question closed by the second-batch + follow-up round. **Acceptance criteria.** @@ -524,10 +545,15 @@ FX-button path remains unregressed. differs between lanes). - Mono mode shows exactly one lane. Switching modes updates the display 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).** @@ -538,9 +564,18 @@ FX-button path remains unregressed. > to sustain segment) instead of the bottom corner, which will now be anchored. > 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 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.** @@ -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 — instead of the bottom corner. The bottom corner (the envelope's end point) becomes **fixed/anchored**, not draggable. -- The policy applies to **all staged envelope overlays** — amp AHDSR today, - Pitch AD, and the filter AHDSR when item 2 lands. +- **The policy applies to the envelopes that have a release** — the amp AHDSR + 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 switch, mid-segment curve knots, recolor) — this item is cheapest folded - into or immediately after that work. Item 3's Spline overlays are unaffected - by construction: a spline always spans the full sample width already. + 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. **Open questions.** -- How the policy maps onto the two-stage Pitch AD, which has no sustain or - release: presumably its final (decay) segment's endpoint anchors right and - drags from its top node, but Daniel stated the policy in AHDSR terms — - confirm the AD reading at implementation. +- **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. **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. - Dragging the sustain→release top node adjusts release; the bottom-right corner is fixed and not draggable. -- Every staged envelope overlay (amp, pitch, and filter once present) follows - the same anchoring policy. +- 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 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. --- @@ -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).** @@ -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 > 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.** - **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 embedded bitmap or equivalent that plays nicely with the existing drawing path is fine. -- **Velocity-curve button placement.** Amp velocity curve button → **MASTER** - section; pitch velocity curve → **PITCH** section; filter velocity curve → - **Filter** section (the deck item 2 creates). +- **Velocity-curve button placement — the VELOCITY deck.** All three + velocity-curve popup buttons (amp, pitch, filter) live **together in a new + 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 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 user draws a curve**. **Amp stays unipolar at [0, 1]**, and its existing flat default (every velocity → unity) is unchanged. -- **Cross-references.** Item 2 introduces the filter's velocity modulation and - the Filter deck — this item specifies that curve's domain, default, and - button placement. Item 3's shared spline editor serves these curves, so it - must render and edit a **bipolar y-domain** for pitch and filter alongside - the amp curve's unipolar one. +- **Cross-references.** Item 2 introduces the filter's velocity modulation — + this item specifies that curve's domain and default, and homes its button + in the VELOCITY deck. Item 3's shared spline editor serves these curves, so + it must render and edit a **bipolar y-domain** for pitch and filter + alongside the amp curve's unipolar one. **Open questions.** - Whether a user-facing pitch velocity transfer curve already exists or is introduced by this item — unverifiable here under the no-code-reads - constraint; if absent, this item introduces it. -- The amp velocity curve's *button* moves to MASTER, but MASTER is settled as - a per-instance group while the velocity curve is a playback parameter. Does - 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. + constraint; if absent, this item introduces it. (The former second question + — amp-curve storage under the MASTER placement — dissolved with the + placement's supersession; storage is settled per-zone above.) **Acceptance criteria.** - The preview button shows the glyph (no text) and stays legible in all interaction states; no new build or runtime dependency is introduced. -- The three velocity-curve buttons sit in their named sections: amp in MASTER, - pitch in PITCH, filter in Filter. +- The three velocity-curve buttons sit together in a deck group labelled + **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 flat at y = 0; played velocities produce no pitch/filter modulation until a curve is drawn, then audibly follow it.