# TODO-1.0 Post-1.0 enhancement queue for the ReaSampler 9000 instrument. Three items, in Daniel's ordering (2026-07-28). 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 restructuring the tree; the implementing engineer maps each spec onto the post-Q layout at execution time. Each item preserves Daniel's raw ask verbatim as the source of truth, then breaks it into behavior, open questions, and an observable acceptance gate. A follow-up answer round from Daniel (2026-07-28) settled most of the open questions. Each item now carries his follow-up verbatim alongside the original ask; settled answers are folded into **Behavior** (marked *settled by follow-up*), and only the genuinely unresolved remainder stays under **Open questions**. A **second follow-up round** (2026-07-28, same day) settled nearly all of the remainder. Each item carries that round's verbatim as a third provenance block; answers are folded the same way (marked *settled by second follow-up*). A **third follow-up round** (2026-07-28, same day) settled item 3's last two questions (point-count ceiling; delete gesture — reversing the second round's alt-click answer back to right-click). **All three items now have no open questions; the document is fully settled at the product level.** 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. --- ## 1 — Envelope editor: per-deck radio switch, segment curve dials, overlay recolor **Daniel's ask (verbatim, 2026-07-28).** > The VST envelope editor visual is a great start but we need to add some > features. The Amp AHDSR is currently always displayed. We need to add a radio > switch to the corner of each env knob deck which makes THAT envelope editable > via the graphic waveform overlay. This is currently the amp and pitch > envelopes, with filter to be added (see below). All envelopes (amp AHDSR, > Pitch AD, Filter AHDSR) should be enhanced to have editable segment curve > values. This should be an exponential function with the exponent scalar > parameter for each sloped segment having possible values from 0.1 to 10. The > knob deck radial knobs for the sloped curvable segments will have an INNER > dial, with its own inner arc, hover accent (tertiary purple), needle, and > numerical label which controls the curve for that sloped segment. Also the > graphical envelope editor draws its segments in secondary blue, which > contrasts poorly against the primary green waveform display. Change those to > tertiary purple. **Daniel's follow-up (verbatim, 2026-07-28).** > yes, one overlay (or none). Everything besides Hold and Sustain, right? "is > 1.0 the linear neutral" CLAUDE, y=x^1.0 is linear!! of course! yes dragging > on the segment (add a round knot midsegment) adjusts the curve. **Daniel's second follow-up (verbatim, 2026-07-28).** > default overlay none > what about the curves? ("what about the curves?" is Daniel turning the pre-existing-instances question back — the answer recorded below is derived from this doc's own acceptance criterion, not a Daniel quote.) **Intent.** Grow the envelope-overlay editor from an amp-only fixture into the shared graphical surface for every envelope in the instrument, and give every envelope shapeable (non-linear) segments — while fixing the blue-on-green contrast failure. **Behavior.** - **Radio switch per envelope deck.** Each envelope knob-deck group (currently AMP ENVELOPE and PITCH ENV; the filter envelope joins when item 2 lands) gains a radio switch in the corner of its deck. Selecting a deck's radio makes *that* envelope the one displayed and editable in the graphic waveform overlay — replacing today's behavior where the Amp AHDSR is always the displayed envelope. The switch is exclusive: **one overlay-active envelope at a time, or none** — no-envelope-shown is a valid state, not an error. *(Settled by follow-up.)* - **Default overlay: none.** The editor opens with **no envelope selected** — the none-state is the default, replacing today's always-on Amp AHDSR. *(Settled by second follow-up.)* - **Pre-existing instances load at exponent 1.0.** Saved instances from before this change load **every curve at exponent 1.0** — the linear neutral — so their audible envelope behavior is unchanged. *(Derived, not a Daniel quote: 1.0 is the settled linear neutral, and the acceptance criterion "a project 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 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.)* - **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 **adds a round mid-segment knot** whose drag adjusts that segment's curve — the overlay is a curve-edit surface in its own right, alongside (not instead of) the inner dial. *(Settled by follow-up.)* - **Inner dial on curvable-segment knobs.** Every knob-deck radial knob that controls a sloped, curvable segment gains an **inner dial**: its own inner arc, its own hover accent (tertiary purple), its own needle, and its own numerical label. The inner dial controls the curve exponent for that segment; the outer knob keeps controlling the segment's time/level value as today. - **Overlay recolor.** The graphical envelope editor's segments change from secondary blue to **tertiary purple** (secondary blue contrasts poorly against the primary green waveform behind it). **Open questions.** - None remaining — both prior questions (default overlay selection, pre-existing-instance curve loading) closed by the second follow-up round. **Acceptance criteria.** - Each envelope deck shows a corner radio switch; activating one puts that envelope in the overlay, editable there, and the overlay tracks the switch immediately. At most one envelope is overlay-active; with none active, the overlay draws no envelope. - The editor opens with no envelope overlay-active (default is none, not the Amp AHDSR). - Every curvable-segment knob shows the inner dial (inner arc, tertiary-purple hover accent, needle, numeric label); sweeping it through 0.1 → 10 visibly reshapes the overlay segment and audibly reshapes the envelope on played notes. Hold and Sustain knobs carry no inner dial. - Dragging on an overlay segment adds a round mid-segment knot; dragging the knot adjusts that segment's curve, and the segment's inner dial reflects the same value. - Overlay envelope segments render in tertiary purple and are clearly legible against the primary green waveform. - A project saved before this change reopens with unchanged audible envelope behavior: every curve loads at exponent 1.0. --- ## 2 — MM preamp Filter: resonant HP/LP stage in the voice pipeline **Daniel's ask (verbatim, 2026-07-28).** > MM preamp Filter: We must implement a new processing point in the sampler > audio pipeline, after pitch env, before amp, for filtering. The processor for > this will be based on code I wrote for the cortex M4 for resonant high and > lowpass filtering. The filter will have parameters for mode, cutoff, Q, and > mod amt, then the AHDSR controls as described above. The knob deck row will > then be relaid out in signal flow order: pitch -> filter -> amp **Daniel's follow-up (verbatim, 2026-07-28).** > modes beyond the pass filters will be added later. cutoff range full audio > spectrum, log scaled, fully open to fully closed, Q should go from 0.1 to 10 > again, scaled around root 2 at the center. mod amt targets cutoff, -100% - > +100% to cover full range from either end. per-voice. label it "Filter" **Daniel's second follow-up (verbatim, 2026-07-28).** > oh, zone. > yes, filter is off by default > velocity and keytracking with the rest, not deffered. Same idea as the amp > velocity transfer curve and pitch key tracking **Intent.** Add the instrument's first filter stage — resonant high-pass and low-pass — as a new fixed point in the per-voice signal path, with its own AHDSR envelope, and make the knob-deck row read in signal-flow order. **Behavior.** - **Pipeline position.** A new processing point in the sampler audio pipeline: **after the pitch envelope, before the amp stage.** - **DSP source.** The filter processor is based on Daniel's own Cortex-M4 resonant high/lowpass filter code. **That code is an input Daniel supplies at implementation time** — it is not in this repo and this spec does not characterize it beyond "resonant high and lowpass." - **Parameters.** Mode, cutoff, Q, and mod amt — then the AHDSR controls, treated exactly as item 1 specifies (curvable sloped segments with inner dials, overlay editability via the filter deck's radio switch). *(Ranges settled by follow-up:)* - **Mode:** high-pass and low-pass now; **modes beyond the pass filters are explicitly deferred to later.** - **Cutoff:** the **full audio spectrum, log scaled**, from fully open to fully closed. - **Q:** **0.1 to 10** (the curve-exponent range again), scaled so **√2 sits at the center** of the control. - **Mod amt:** **bipolar, −100% to +100%**, targeting **cutoff** — covering the full range from either end. - **Per-voice.** The filter processes **per voice** — each sounding voice runs its own filter with its own envelope state. *(Settled by follow-up.)* - **Per-zone storage.** The filter's parameters are **stored per-zone**, alongside the other playback parameters — Sample/Zone panel parity applies, same as the existing per-zone controls (VOICE and MASTER remain the per-instance exceptions). *(Settled by second follow-up.)* - **Off by default.** The filter **defaults to off** — pre-existing saved instances and freshly loaded captures sound unchanged until the user engages it. *(Settled by second follow-up.)* - **Velocity and key-tracking modulation — in this item, not deferred.** The filter gains **velocity** and **key-tracking** modulation now, alongside the mod-amt/envelope path: the same idea as the amp's velocity transfer curve and the pitch key-tracking, respectively, applied to the filter. The follow-up establishes the parallel, not new ranges or control layout — those follow the cited precedents. *(Settled by second follow-up.)* - **Label.** The user-facing deck-group label is **"Filter"**. "MM preamp" is working shorthand for the DSP lineage, not UI text. *(Settled by follow-up.)* - **Deck reorder.** The knob deck row is relaid out in signal-flow order: **pitch → filter → amp**. **Open questions.** - None remaining — all three prior questions (other mod sources, parameter storage side, neutral default) closed by the second follow-up round. **Acceptance criteria.** - With the filter engaged, played notes are audibly filtered at the specified pipeline point: the filter acts on pitched (post-pitch-envelope) signal, and the amp envelope still shapes the filtered result (audible ordering: pitch → filter → amp). - Mode, cutoff, Q, and mod-amt controls appear in a deck group labeled **"Filter"**; the filter AHDSR gets the full item-1 treatment (curve inner dials, corner radio switch, tertiary-purple overlay editing). - Cutoff sweeps the full audio spectrum on a log scale, from fully open to fully closed; Q spans 0.1 → 10 with √2 at the control's center; mod amt at −100% and at +100% each drive cutoff across the full range, from opposite ends. - High Q audibly emphasizes the cutoff region (resonance) in both HP and LP modes. - Two simultaneously sounding voices at different envelope phases are filtered independently (per-voice processing is audible, not a shared instance-wide filter). - Filter parameters follow Sample/Zone panel parity: they appear and edit on both surfaces, and each zone carries its own filter settings (two zones with different filter settings audibly differ). - Velocity and key-tracking modulation of the filter ship with this item and are audible — velocity following the amp-velocity-transfer-curve pattern, key-tracking following the pitch-key-tracking pattern. - The deck row reads pitch → filter → amp left-to-right. - The filter is off by default: a project saved before this change reopens sounding identical, and a freshly loaded capture sounds unchanged until the filter is engaged. --- ## 3 — Alternative Spline EGs: hard/smooth multi-segment monotonic splines **Daniel's ask (verbatim, 2026-07-28).** > Alternative Spline EGs: Every processor which has an envelope will have the > ability to change the Staged EG to a Spline EG, based on the monotonic > splines for the velocity curve. HOWEVER, we will need to enhance the (singly > implemented, multi referenced) spline algorithm to support multiple segments > that DON'T minimally smooth the spline, so that hard points are possible. In > other words, the contour of the EG will be defined by 1 or more monotonic > spline functions which together form the full time function for that > processor, such that the first three points could make a curved segment, > which connects at a sharp angle to the next three points, finishing out the > contour over the full sample length. Control-clicking a point makes it a > "hard" or "smooth" point (toggled, smooth by default) which when hard does no > curve smoothing on either side segment, forming the natural sharp angle > instead of a continuous derivative. This enhanced spline drawing will be used > for the velocity-amp transfer curve as well as the pitch, filter, and amp EGs > (if they are in spline mode). **Daniel's follow-up (verbatim, 2026-07-28).** > dual state, save but inactive. Default Curve Spline is a smooth y=1-x. Gate > mode is not available when the Spline is used, spline always covers the full > sample length. The spline curves don't have to rise AND fall, they also > aren't globally monotone, the default curve is a smooth downward slope over > the length. all the soft points between any hard points will be > smooth/monotone. **Daniel's second follow-up (verbatim, 2026-07-28).** > normalize the spline eg length to the full width, it should represent the > time axis of the actual sample visually 1:1 > left click add, alt-click delete, cntrl-click toggles point hard or soft. > spline active -> stage knobs disabled. **Daniel's third follow-up (verbatim, 2026-07-28).** > oh, maybe 64? is that way too much? I don't want to limit from long rhythmic > phrases, which require a high resolution to be interesting > > oh, do right click delete instead for the spline > 128 then **Intent.** Offer a free-drawn alternative to every staged envelope: the user switches any EG from Staged to Spline mode and draws the contour directly, with the monotonic-spline machinery already proven by the velocity curve — enhanced so sharp corners are possible, not everything smoothed. **Behavior.** - **Mode toggle per EG.** Every processor that has an envelope (pitch, filter, amp) can switch its Staged EG to a **Spline EG**. - **Dual state — save but inactive.** Both the Staged and the Spline state are persisted; switching modes keeps the inactive one **saved but inactive**. No conversion, no discard — round-tripping Staged↔Spline restores the other mode's shape untouched. *(Settled by follow-up.)* - **Gate unavailable in Spline mode.** Gate mode is **not available while a Spline EG is active**; the spline **always covers the full sample length** — a pure time function over the sample, i.e. the Trigger/one-shot playback model. *(Settled by follow-up.)* - **Time axis: normalized, visually 1:1.** The spline contour is **normalized to the full sample length**, and the overlay represents **the time axis of the actual sample visually 1:1** — the contour's full width maps directly onto the displayed sample. Consequently a different-length capture rescales the stored contour to its own length. *(Settled by second follow-up.)* - **Point-editing grammar.** **Left-click adds a point; right-click deletes a point; control-click toggles a point hard/smooth.** *(Settled by third follow-up; control-click hard/smooth confirms the original ask.)* Note for readers of the prior revision: the second follow-up answered alt-click delete; the third follow-up **supersedes that** with right-click delete — which matches the velocity-curve popup's already-shipped right-click node delete, giving one point-editing grammar across both spline consumers. - **Point-count ceiling: 128.** A spline contour holds at most **128 points** (floor: the two endpoints implied by full-length coverage). Daniel floated 64 and raised it to 128 explicitly so the cap does not limit **long rhythmic phrases, which require high resolution to be interesting** — at roughly two points per articulation event, 64 points is about two bars of 16ths and 128 about four. The ceiling is a musical bound, not a performance one (segment lookup is logarithmic; on-screen the editor's 8 px minimum node separation is the practical density limit anyway). **An engineer tempted to lower this number should read that motivation first.** *(Settled by third follow-up.)* - **Staged controls disabled while Spline is active.** While a Spline EG is active, that envelope's **staged segment knobs are disabled** — inert, not merely inaudible — including their item-1 inner curve dials (the dial is part of the knob). The dormant staged state is edited only by switching back to Staged mode. *(Settled by second follow-up.)* - **Not globally monotone.** Spline contours **don't have to rise and fall and are not globally monotone**; the monotone guarantee is per-segment — **all soft points between any hard points are smooth/monotone** (no overshoot between adjacent points). *(Settled by follow-up.)* - **Default contour.** A new Spline EG defaults to a **smooth y = 1 − x** — a smooth downward slope over the full sample length. (Read as the Spline-EG default contour; not a change to the velocity→amp transfer curve's existing default.) *(Settled by follow-up.)* - **Spline foundation.** The Spline EG is based on the monotonic splines used for the velocity curve. The spline algorithm is singly implemented and multi-referenced; the enhancement below applies to that one implementation and flows to every consumer. - **Hard points.** The algorithm is enhanced to support **multiple segments that don't minimally smooth the spline**, so hard points are possible: the EG contour is defined by **one or more monotonic spline functions** which together form the full time function for that processor — e.g. the first three points form a curved segment that connects **at a sharp angle** to the next three points, finishing the contour over the **full sample length**. - **Hard/smooth gesture.** **Control-clicking a point toggles it hard/smooth (smooth by default).** A hard point does no curve smoothing on either adjacent segment — the natural sharp angle stands instead of a continuous derivative. - **Shared across consumers.** The enhanced spline drawing serves the **velocity→amp transfer curve** as well as the pitch, filter, and amp EGs (when those are in spline mode). The velocity curve gains hard-point support by the same enhancement. **Open questions.** - None remaining — both prior questions closed by the third follow-up round. Point-count bounds: ceiling 128, floor two endpoints. Gesture convergence: resolved by the delete-gesture reversal itself — the Spline EG's right-click delete now matches the velocity-curve popup's shipped right-click node delete, so **no migration is needed on either side**; one grammar serves both consumers. **Acceptance criteria.** - Each of the pitch, filter, and amp EGs offers a Staged/Spline mode switch; in Spline mode the overlay (via the item-1 radio switch) shows and edits the drawn contour, and played notes audibly follow it. - Left-click on the contour adds a point at that position; right-click on a point deletes it; control-click toggles it hard/smooth. Points are smooth by default; a hard point renders a visible sharp angle with no smoothing on either adjacent segment, and the discontinuous slope is audible where the modulation target makes it so (e.g. a pitch EG corner). - A contour accepts points up to the **128-point ceiling**; attempting to add beyond it is refused without disturbing the existing contour. The two endpoints cannot be deleted (full-length coverage always holds). - A contour of several segments joined at hard points plays back over the full sample length exactly as drawn — including contours that rise and fall freely (no globally-monotone restriction), with no overshoot between any adjacent pair of points. - A freshly created Spline EG shows the smooth y = 1 − x default contour. - While a Spline EG is active, Gate mode is not selectable; the spline plays as a pure time function over the full sample length. - The overlay contour spans the full displayed sample width, 1:1 with the sample's time axis; loading a different-length capture rescales the contour to the new sample length (normalized storage), with the drawn shape preserved proportionally. - While a Spline EG is active, that envelope's staged segment knobs and their inner curve dials render disabled and reject edits; switching back to Staged re-enables them with values exactly as left. - Staged↔Spline round-trip preserves both states: switch to Spline, draw, switch back — the staged values are exactly as left; switch forward again — the spline contour is exactly as drawn. Both survive save/reload. - The velocity→amp transfer-curve editor supports the same control-click hard/smooth toggle with identical rendering behavior, and its existing right-click node delete matches the Spline EG's delete gesture unchanged — one point-editing grammar across both consumers.