5.3 KiB
COMPLETED.md — ReaSampler landed milestones
Completed milestone entries removed from PLAN.md. Each entry preserves its
original Goal, Verify, and checklist points with boxes marked done.
This file holds the current (1.x) cycle's landed milestones only. For all
pre-1.0 (version-0) history, see docs/ARCHIVE.md.
Comment-reduction pass (tree-wide, twelve parallel tracks)
Cut source comment volume tree-wide: 209 files changed, net −6,493 lines.
Comment-only lines went from 15,073 to ~8,671, a ~42% cut — before the
pass, 37% of all source lines were comment-only. Zero code drift, verified
across all 209 files by comparing comment-stripped hashes; the sole
intentional exception (Daniel-approved) is two user-facing error strings in
src/shell/capture/capture.cpp that lost internal milestone IDs (M8, M3,
M7+). Build clean, 61/61 ctest pass. Code review surfaced 2 Major + 8 Minor
findings — all content cut that should have survived — and all ten were
remediated and re-gated before merge. Driver: Daniel's instruction — "Brief
concise engineering comments. A little why, and maybe context, never WHAT."
Θ-W1-T1 — zone-retirement
ReaSampler 9000's zone-mapping system is retired: one loaded capture, one parameter
set, playing across the full keyboard repitched from root with key-tracking — no zones,
no per-zone divergence, no keymap of captures. The dedicated zone-editing face and its
authoring affordances (add/delete zone, per-zone parameter panel, Low/High/Root zone
legend) are gone; the root note survives as a first-class parameter. sampler_core
split along the note-routing/per-voice-render responsibility seam (no virtual tick()
on the per-voice path), and the Sample face split into chrome/waveform/decks bands with
a shared band-stack allocator, discharging the wave's two structural deliverables.
Migration adopts a saved multi-zone instance's first zone; single-zone instances lift
losslessly.
Deviations from spec:
- The key-range open question ([propose]) is answered outright rather than left
open: no key-range concept survives at all —
KeyZone/lowNote/highNoteare gone from the engine, the write format, and the strip. A low/high pair remains re-addable later as two ordinary parameters. Θ-W2-T3 consumes this decision. - "Which zone is first" ([verify]) confirmed:
PerformanceMap::zoneswas an ordered vector andKeymap::resolvewas first-match-in-order, so index 0 was the audible zone. Migration adopts index 0, and that zone'ssampleIdsupersedes the envelope's storedselectionId. - The control row (root strip, preview, velocity knob, curve button, Mono|Stereo) moved into the chrome band, directly under the title rather than above the deck — user-visible and deliberate; it's what makes Θ-W2's band-disjointness real.
- Loading a capture now clears the three capture-anchored overrides (root, loop span, start frame) while keeping the shaping parameters — strictly less destructive than the previous whole-zone drop.
- The embed strip became a read-only readout; it lost its click handler since with no zones there is nothing to select.
- Migration side-effect: a previously-zoned instance with implicit channel mode and a stereo capture persisted as Mono will reopen as Stereo. It converges on the documented rule and is reachable only for old blobs, but "sounds identical" was an acceptance bar, so it's a real deviation.
sampler_core.{h,cpp}'s 956-line documented hot-path exception is retired, not relocated — the tree now carries no over-ceiling exception at all.note_entrywas deleted as dead code (its only consumer was the removed zone editor).- Still unverified: a real pre-change project reopening through REAPER's
setStatehas not been exercised in the DAW; migration is proven only in the pure domain against hand-laid legacy bytes.
Θ-W1-T2 — capture-handoff-bugs
Fixed both extension-side capture-handoff defects: drag-out now delivers the capture's audio at the drop target every time (previously intermittent, retry-fixable); dropping a capture onto an FX container now loads the instrument with the capture, matching the FX-button drop path.
Deviations from spec:
- Item 5's root cause was three defects, not one: non-atomic COM refcounts racing a drop
target's background copy; an unverified assumption that REAPER had already called
OleInitializeon the calling thread; and a teardown-before-payload-check ordering bug that let an unresolvable payload consume the gesture. - Item 6's fix rests on an unconfirmed hypothesis — that a bare
instantiate = -1left placement to REAPER's ambient FX-chain insert point, which a container-focused chain window moves. It is now pinned to an explicit top-level position; nobody could confirm the mechanism without the DAW. - The opportunistic rider was partly taken:
src/ingest.{h,cpp}re-homed tosrc/shell/actions/.ext_keys.hwas declined (most consumers sit in another track's exclusive surface);resource.hwas declined (it's a build input paired withsrc/resource.rcand the SWELL resgen step). - Neither acceptance criterion has actually been met yet. Item 5's gate is explicitly a soak ("a single pass is not a gate") and item 6 needs a live container drop; both require REAPER and are outstanding. The code is merged; the acceptance gates are not closed.