From b09f3754904cc34950882145c96e992b14bdec27 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Mon, 27 Jul 2026 21:32:22 -0400 Subject: [PATCH] docs: fix swell_resgen.php path and repair citations broken by the CONTEXT split mac_resgen.php does not exist. 34 CONTEXT.md citations retargeted to CONTEXT-ARCHIVE.md; 6 self-inverted refs in the archive corrected. --- CLAUDE.md | 2 +- COMPLETED.md | 70 +++++++++++++++++++++++----------------------- CONTEXT-ARCHIVE.md | 15 ++++------ PLAN.md | 2 +- README.md | 2 +- 5 files changed, 44 insertions(+), 47 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 0697bea..c9e6460 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -43,7 +43,7 @@ The VST3 target forks identically: `REASAMPLER_CHANNEL=beta` produces `reasample `src/resource.rc` must be pre-processed by SWELL's resgen once per platform: - php vendor/WDL/WDL/swell/mac_resgen.php src/resource.rc # macOS; Linux reuses the output + php vendor/WDL/WDL/swell/swell_resgen.php src/resource.rc # macOS; Linux reuses the output Add the generated file to the appropriate `APPLE` / Linux `target_sources` block in CMakeLists.txt. The SWS extension build is the canonical reference for this step. diff --git a/COMPLETED.md b/COMPLETED.md index 58b5a09..cc9d507 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -36,7 +36,7 @@ build` is green with the new `bank_model` + `peaks` suites present. ## Milestone 1 — bank_model + JSON round-trip (pure) **Goal:** The `Sample` metadata struct and `BankIndex` (add / remove / query / tier moves / dedup-by-hash) with JSON serialize/deserialize to `std::string`. -CONTEXT.md §Data model, §Module architecture. +CONTEXT-ARCHIVE.md §Data model, §Module architecture. **Verify:** CTest green. Round-trip is lossless (deserialize(serialize(x)) == x) across all fields; dedup-by-hash and tier filtering asserted; **relative paths only** invariant enforced at the model boundary (no absolute path accepted/stored). @@ -44,7 +44,7 @@ only** invariant enforced at the model boundary (no absolute path accepted/store - [x] Define `Sample` with the full field set (id, display name, relative path, source mode, source range in project time + PPQ, track GUID(s), wet/dry, channels, SR, length sec + beats, capture tempo, optional key, peak/RMS/LUFS, - clip flag, tier, content hash, provenance, created ts). CONTEXT.md §Data model. + clip flag, tier, content hash, provenance, created ts). CONTEXT-ARCHIVE.md §Data model. - [x] `BankIndex`: ordered collection keyed by id; add / remove / query. - [x] Hash lookup for dedup-by-content-hash. - [x] Tier model (scratch | archive) + tier-move + tier filtering; scratch marked @@ -58,7 +58,7 @@ only** invariant enforced at the model boundary (no absolute path accepted/store ## Milestone 2 — peaks (pure) **Goal:** Compute waveform min/max bins from raw PCM, dependency-free (not -REAPER's peak API). CONTEXT.md §Module architecture, §Non-goals. +REAPER's peak API). CONTEXT-ARCHIVE.md §Module architecture, CONTEXT.md §Non-goals. **Verify:** CTest green. Fed a known signal (full-scale sine, ramp), asserted min/max envelope per bin matches expected within tolerance; channel count preserved; bin count honored for arbitrary sample lengths (incl. remainder bin). @@ -72,7 +72,7 @@ preserved; bin count honored for arbitrary sample lengths (incl. remainder bin). ## Milestone 3 — Offline capture spike (REAPER shell) **Goal:** Offline-render the time-selection master mix to a wav in the project -bank folder, add a `Sample`, log it. The render-driving spike. CONTEXT.md +bank folder, add a `Sample`, log it. The render-driving spike. CONTEXT-ARCHIVE.md §REAPER API surface (offline render), Build order 3. **Verify (in DAW):** Render runs via `Main_OnCommand(42230)` ("Render using most recent settings") — REAPER always shows its offline-render progress window; no @@ -87,7 +87,7 @@ fallback). added silence without an explicit tail). - [x] `ICaptureBackend` interface + `CaptureRequest` (source mode, time range, - wet/dry, tail, SR/bit-depth/channels, output path). CONTEXT.md §capture. + wet/dry, tail, SR/bit-depth/channels, output path). CONTEXT-ARCHIVE.md §capture. - [x] `OfflineRenderBackend`: drive `GetSetProjectInfo` render settings + `GetSetProjectInfo_String` file/pattern/format; **verify every flag against `vendor/reaper-sdk/sdk/reaper_plugin_functions.h`.** @@ -100,7 +100,7 @@ added silence without an explicit tail). ## Milestone 4 — persist (index ↔ project ext state) **Goal:** Write the `BankIndex` JSON to project ext state, reload on project open; -project-relative path resolution. CONTEXT.md §persist, §Persistence & paths. +project-relative path resolution. CONTEXT-ARCHIVE.md §persist, §Persistence & paths. **Verify (in DAW):** Index survives Save / Save As / close+reopen; **bank travels with the .rpp**; **relative paths only** in the persisted index (Save As to a new folder still resolves the bank). @@ -121,7 +121,7 @@ folder still resolves the bank). ## Milestone 5 — bank_panel (docked grid) **Goal:** Docked LICE-drawn grid: thumbnails (from `peaks`), audition, multi-select, keyboard navigation. Reuses the docking setup from the retired -`mpe_view.cpp`. CONTEXT.md §bank_panel. +`mpe_view.cpp`. CONTEXT-ARCHIVE.md §bank_panel. **Verify (in DAW):** Grid docks; thumbnails render from computed peaks; audition plays selected sample; multi-select + keyboard nav work. @@ -137,7 +137,7 @@ plays selected sample; multi-select + keyboard nav work. --- ## Milestone 6 — insert (placement) -**Goal:** "Insert selected sample at edit cursor" via `InsertMedia`. CONTEXT.md +**Goal:** "Insert selected sample at edit cursor" via `InsertMedia`. CONTEXT-ARCHIVE.md §insert, Build order 6. **Verify (in DAW):** Selected sample inserts at the edit cursor wrapped in `Undo_BeginBlock2` / `Undo_EndBlock2`; conform-to-tempo is an explicit flag — @@ -157,7 +157,7 @@ plays selected sample; multi-select + keyboard nav work. ## D1 — view_mode_model (pure) **Goal:** REAPER-free mode registry + membership index + folder-tree-aware visibility derivation + parking/restore planner + JSON round-trip. The heart of the -phase; mirror of `bank_model`. CONTEXT.md §Design View (Module architecture — pure). +phase; mirror of `bank_model`. CONTEXT-ARCHIVE.md §Design View (Module architecture — pure). **Verify:** CTest green. N-mode model (not a boolean); Arrange + Design seeded. Restore-planner round-trip (snapshot → park → restore) returns every driven flag to its captured value. Parent-derivation correct against a supplied folder tree. @@ -182,7 +182,7 @@ mode. ## D2 — view shell (apply flags in the DAW) **Goal:** Read the folder tree and drive REAPER flags per the planner. -CONTEXT.md §Design View (view shell, REAPER API surface). +CONTEXT-ARCHIVE.md §Design View (view shell, REAPER API surface). **Verify (in DAW):** Toggling active mode hides + parks inactive leaves (`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline) and restores active ones from snapshot. **Master untouched. `B_MUTE`/`I_SOLO` untouched.** @@ -200,7 +200,7 @@ Untagged tracks untouched. Parents follow their tagged descendants. ## D3 — persist slice (view state ↔ project ext state) **Goal:** Serialize the view section into the `"reasampler"` namespace alongside the -bank; reapply the active mode on project open. CONTEXT.md §Design View (persist). +bank; reapply the active mode on project open. CONTEXT-ARCHIVE.md §Design View (persist). **Verify (in DAW):** Membership + active mode + snapshots survive Save / Save As / close+reopen; on open, the active mode's visibility + processing is reapplied. Saved-while-parked project restores parked tracks from persisted snapshots (not to a @@ -215,7 +215,7 @@ guessed "on"). --- ## D4 — actions -**Goal:** Bindable action set for the mode workflow. CONTEXT.md §Design View +**Goal:** Bindable action set for the mode workflow. CONTEXT-ARCHIVE.md §Design View (actions). **Verify (in DAW):** Each action registered (bindable in Actions list); toggle + mode-jumps MIDI-bindable; tag/untag acts on the current track selection. @@ -331,7 +331,7 @@ mass-tag on the first poll after open). ## Milestone 7 — capture action family **Goal:** Bindable capture actions for master / selected tracks / selected items / -razor area, each with wet-dry + tail options. CONTEXT.md §actions, Build order 7. +razor area, each with wet-dry + tail options. CONTEXT-ARCHIVE.md §actions, Build order 7. **Verify (in DAW):** Each action registered (bindable in Actions list), routes to the offline backend, and honors wet/dry + tail. **Load-bearing principle:** none auto-inserts into the arrange. @@ -357,7 +357,7 @@ auto-inserts into the arrange. ## Milestone 8 — RealtimeRecordBackend **Goal:** Realtime record behind the same `ICaptureBackend`, producing identical -bank entries. CONTEXT.md §capture (realtime), §Precision invariants. +bank entries. CONTEXT-ARCHIVE.md §capture (realtime), CONTEXT.md §Precision invariants. **Verify (in DAW):** Hidden temp track taps each selected track's own post-fader output via a `CreateTrackSend`; recorded file moves into the bank; **non-destructive** — temp track (and its sends) removed cleanly, every snapshotted track arm, time @@ -623,7 +623,7 @@ View tag family (bindable in the Actions list), plus the three code-review polis items carried from D2-W3-A. The persist slice and lane-ownership index round-trip were completed in D2-W3-A; this wave closes the remaining action surface and cleans up the implementation. -See CONTEXT.md §Two-canvas sub-phase (Module architecture — persistence). +See CONTEXT-ARCHIVE.md §Two-canvas sub-phase (Module architecture — persistence). **Verify (in DAW):** Item mode actions registered and MIDI-bindable in the Actions list; re-drive mint/apply so each item lands on its mode's managed lane; manual-lane items exempt; one undo block per action. ctest 14/14 green. @@ -763,7 +763,7 @@ collision path between channels. privileged, create/rename/reorder/delete named banks, active-bank id, move/copy a sample between banks, JSON round-trip + legacy-migration. The heart of the phase; mirror of `bank_model` / `view_mode_model`; **`BankIndex` untouched (additive)**. -CONTEXT.md §Multi-bank (Module architecture — pure). +CONTEXT-ARCHIVE.md §Multi-bank (Module architecture — pure). **Verify:** CTest green. Pool always present, un-deletable, un-renamable, un-evacuable (rules rejected in-model). Active-bank defaults to pool. Move is index-only (source loses entry, destination gains it) and observes destination @@ -847,7 +847,7 @@ As / reopen); relative-paths-only preserved. Prune's consumption of it is Phase **Goal:** Serialize the book under the `banks` key in `"reasampler"` alongside the existing sections, with the pool folded in as bank-zero; migrate a legacy `bank_index` key into the pool on first load and retire the legacy key; reload-on-open -and Save-As survival via the existing M4 machinery. CONTEXT.md §Multi-bank (persist). +and Save-As survival via the existing M4 machinery. CONTEXT-ARCHIVE.md §Multi-bank (persist). **Verify (in DAW):** Banks + named banks + active bank + all per-bank samples survive Save / Save As / close+reopen; **relative paths only**; bank travels with the `.rpp`; a project saved before this phase (legacy `bank_index` only) loads as pool + zero @@ -868,7 +868,7 @@ written. --- ## B3 — actions -**Goal:** Bindable action set for the multi-bank workflow. CONTEXT.md §Multi-bank +**Goal:** Bindable action set for the multi-bank workflow. CONTEXT-ARCHIVE.md §Multi-bank (actions). **Verify (in DAW):** Each action registered (bindable in Actions list); bank-activate + move/copy + evacuate MIDI-bindable; create/rename/delete/evacuate drive the B1 model via the B2-persisted session. @@ -887,7 +887,7 @@ drive the B1 model via the B2-persisted session. ## B4 — bank_panel vertical split (UI) **Goal:** The vertical-split bank window — pool on top, named-banks tab-page region -below, full-height toggles — extending the M5 docked grid. CONTEXT.md §Multi-bank +below, full-height toggles — extending the M5 docked grid. CONTEXT-ARCHIVE.md §Multi-bank (bank_panel). **Verify (in DAW):** Pool grid renders on top; named-banks tab strip below (empty when no named banks, one tab per named bank); active-bank **unmistakably** indicated; both full-height toggles collapse the split correctly; sample move/copy @@ -968,7 +968,7 @@ timeline item). **Goal:** Populate `Sample.provenance` (parent sample id + a capture-recipe fingerprint) on resample-from-sample, and ship a **"re-capture from source"** action that regenerates a sample from its recorded source. Reconciled with the -dual-canvas (Phase D2) model. CONTEXT.md §Data model, §capture; product framing + +dual-canvas (Phase D2) model. CONTEXT-ARCHIVE.md §Data model, §capture; product framing + the settled reconciliation in `docs/product/provenance.md`. **Verify (in DAW):** A sample resampled from a bank sample carries its parent id + recipe fingerprint; "re-capture from source" regenerates the file into the bank @@ -1065,7 +1065,7 @@ bank folder, the files referenced by the book (unioned across all banks, pool included), and the **owned-file manifest** (fork R-D, written from capture onward by B-cap), compute the orphan set `(owned ∩ present) − referenced`. The mirror of `ViewModeModel::reconcile(liveGuids)`, one level down (files instead of GUIDs). -CONTEXT.md §Prune (Module architecture — pure). +CONTEXT-ARCHIVE.md §Prune (Module architecture — pure). **Verify:** CTest green. **Prune null test:** a folder whose every file is referenced deletes nothing; prune returns exactly `(owned ∩ present) − referenced` and nothing else. Referenced-set unioned across every bank (a file referenced by any @@ -1095,7 +1095,7 @@ hand-dropped file) is never an orphan. **Goal:** Enumerate the current project bank folder (M4 project-relative resolution), supply the referenced-set and the **owned-file manifest** (from B-cap) from the session, feed the pure core, and produce a dry-run manifest. No deletion in this -wave — the report path only. CONTEXT.md §Prune (persist / prune shell). +wave — the report path only. CONTEXT-ARCHIVE.md §Prune (persist / prune shell). **Verify (in DAW):** Dry-run reports the orphan count + reclaimed size (+ file list for a small set) against the resolved current bank folder; resolves paths the same way the index does (survives a Save-As relocation); deletes nothing. @@ -1123,7 +1123,7 @@ way the index does (survives a Save-As relocation); deletes nothing. **Goal:** The confirmed deletion step, the bindable "Prune bank folder" action, and a `bank_panel` prune button: dry-run-first, confirm-with-manifest, then reclaim the orphan set — via OS trash where portably available (fork R-C), else unlink. -CONTEXT.md §Prune (guardrails, API). +CONTEXT.md §Prune (guardrails) + CONTEXT-ARCHIVE.md §Prune (API). **Verify (in DAW):** "Prune bank folder" (action or panel button) reports first, deletes only on explicit confirm, and reclaims exactly the orphan set — never a referenced file, never a hand-dropped non-bank file; the referenced/owned-set safety @@ -1168,7 +1168,7 @@ untouched. ## Milestone 11 — polish (wave 1) **Goal:** Batch capture (per selected item / per razor area), action trigger buttons -+ keybinding help labels, conform-on-insert. CONTEXT.md Build order 11. ++ keybinding help labels, conform-on-insert. CONTEXT-ARCHIVE.md Build order 11. **Verify (gates 23/23 both configs):** CTest green on new pure targets; each in-panel action fires through the command-id contract without regressing precision invariants. @@ -1197,7 +1197,7 @@ invariants. architecture. Mirror of the null-test cut precedent ("Cut (fixed by Daniel)"). ## Milestone 11 — polish (wave 2 / completion) -**Goal:** Native OS drag-out — the final M11 polish item. CONTEXT.md Build order 11, +**Goal:** Native OS drag-out — the final M11 polish item. CONTEXT-ARCHIVE.md Build order 11, §Non-goals (drag-out deferred to last). **Verify (gates 24/24 both configs):** Drag-out places a valid file in the OS target without regressing the precision invariants; copy-only semantics throughout (no source @@ -1253,7 +1253,7 @@ CONTEXT.md §Prune (Settled forks). **Goal:** Stand up the shared LICE-based drawing kit that every Phase L surface (L2 dock panel, L3 VST editor) consumes — palette/theme module, pure component geometry/hit-test helpers, LICE draw shell, and retirement of the GDI `DrawText` path in `bank_panel`. -CONTEXT.md §Phase L (Kit architecture). DS-1 (LICE + WDL, no external frameworks) and +CONTEXT-ARCHIVE.md §Phase L (Kit architecture). DS-1 (LICE + WDL, no external frameworks) and DS-2 (Direction B Neon Console + Direction C spectral) are the governing settled decisions. **Verify:** CTest green (`theme_tests`, `component_geometry_tests`). Each text-on-surface pair in the palette clears its WCAG floor (tested). `bank_panel` text routes through @@ -1286,7 +1286,7 @@ cached-font `text()` — GDI `DrawText` path retired. Double-buffer discipline p ## L2 — dock-panel layout redesign **Goal:** Full layout redesign of the `bank_panel` dock window — task-grouped action bar, full M11-aware button inventory placed by cluster, entire panel drawn through the L1 kit. -CONTEXT.md §Phase L (L2 scope). DS-3 (thorough layout redesign, not a light re-skin) is the +CONTEXT-ARCHIVE.md §Phase L (L2 scope). DS-3 (thorough layout redesign, not a light re-skin) is the governing settled decision; sequenced after M11 merged. **Verify:** CTest green (`action_bar_tests`). The panel renders in the settled B+spectral language through the L1 kit — chrome, buttons, tabs, grid cells, dividers all by palette @@ -1315,8 +1315,8 @@ three-zone structure: top toolbar (capture + placement + maintenance), bottom to View tagging + switching), footer (narrow mode toggle · Tail button · Prune). A layout re-home of buttons that fire existing actions; no new actions, no capture/placement behavior change, no touching the "capture ≠ placement" principle. Independent of L3. -CONTEXT.md §Phase L (L4 dock-panel button layout). Product framing: -`docs/product/visual-design-language.md` §L4. +CONTEXT-ARCHIVE.md §Phase L (L4 dock-panel button layout). Product framing: +`CONTEXT-ARCHIVE.md` §L4 dock-panel button layout. **Verify (in DAW):** the top toolbar fires every capture + placement + maintenance action; the bottom toolbar tags/untags selected tracks and switches/toggles Arrange/Design/show-both; the footer shows a narrow `[Arrange|Design]` toggle at the left, a Tail button that cycles tail @@ -1552,7 +1552,7 @@ repitch/interpolation from root note, keymap resolution — unit-tested in CTest known signals. **The heart of the phase (D3); the mirror of `bank_model`/`peaks`/`view_mode_model`/`bank_book`; test it hard.** The core is invariant under the build-shape choice — no VST3 or REAPER type at its boundary. -CONTEXT.md §Phase S (pure core, module architecture). +CONTEXT-ARCHIVE.md §Phase S (pure core, module architecture). **Verify:** CTest green. Voice allocation is correct under polyphony (note-on/off, voice stealing where bounded); ADSR shape asserted against a known signal (mirror of `peaks`); repitch from root note produces the expected pitch ratio; keymap resolution @@ -1807,7 +1807,7 @@ capture-first layout. All layout/hit-test math is **pure geometry** (new `keyboa a `capture_browser` layout module — mirrors of `mode_switch`/`editor_geometry`); the LICE draw + drag-state machine is the editor shell. RT discipline untouched (edits commit off-thread via `commitMapAndReload`); the instrument stays a **read-only bank consumer**. -CONTEXT.md §Phase S (ReaSampler 9000 UX — capture-first editor). +CONTEXT-ARCHIVE.md §Phase S (ReaSampler 9000 UX — capture-first editor). **Policy reversal — fresh instance is SILENT, nothing auto-selected (was S4).** The S4 "first sample plays" fallback is **removed**: on open with no stored selection, the @@ -1907,7 +1907,7 @@ loop, snapping to zero-crossings (the S2 spec's zero-crossing-aware requirement) points are a **performance-map override on the zone** where set, seeded from the bank intrinsic (D-B split: the bank carries the file-fact default; the instrument's drag is the performance choice). All marker/waveform layout + hit-test is pure geometry; peaks compute -reuses `peaks`; the draw + drag is the shell. CONTEXT.md §Phase S (ReaSampler 9000 UX — +reuses `peaks`; the draw + drag is the shell. CONTEXT-ARCHIVE.md §Phase S (ReaSampler 9000 UX — waveform view). **Verify (in DAW):** selecting a zone shows its sample's waveform; dragging the loop-start and loop-end markers sets the sustain loop and a held note audibly loops that region; @@ -1953,7 +1953,7 @@ is fixed — expose attack/decay/sustain/release as draggable sliders, per-insta This is the "sensible list handling + direct manipulation of the parameters that exist" tier. All slider/scroll/search-box layout + hit-test is pure geometry; the shell draws + routes; ADSR/scroll/filter state is instrument-owned (component state / transient UI -state). CONTEXT.md §Phase S (ReaSampler 9000 UX — scale + ergonomics). +state). CONTEXT-ARCHIVE.md §Phase S (ReaSampler 9000 UX — scale + ergonomics). **Verify (in DAW):** a bank with more samples than fit **scrolls** (wheel + drag) and every sample is reachable; typing filters the list to matching names; a zone's low/high/root can be **typed** (not only dragged) via a click-to-edit field; the amp envelope's ADSR is @@ -2017,7 +2017,7 @@ into the voice engine; today they are fixed defaults), S5 (the map the numeric f OS file drop onto the editor window. The cross-artifact relay was a spike — the instrument's REAPER bridge (`reaper_bridge`) is deliberately READ-ONLY; the relay is DEGRADED and deferred. The two landed items are the drop-accept surface and the UX degrade -path. The deferred relay item remains in `PLAN.md`. CONTEXT.md §Phase S (drop-to-load). +path. The deferred relay item remains in `PLAN.md`. CONTEXT-ARCHIVE.md §Phase S (drop-to-load). **Spike verdict (ps-w12, 2026-07-27): DEGRADED.** The relay would require (a) a new instrument WRITE seam into ext-state and (b) an extension-side timer poller + claim/clear @@ -2151,7 +2151,7 @@ capture **already loaded and selected** for playback. A third `DragGesture` — VST3 component-state injection via `TrackFX_SetNamedConfigParm(..., "vst_chunk", blob)`. The shared `instrument_drop` pure module constructs the blob via the instrument's own `sample_map::serializeComponentState`/`deserializeComponentState` — one serializer called -from both artifacts, so the blob format cannot drift. CONTEXT.md §Phase S (drop-and-load). +from both artifacts, so the blob format cannot drift. CONTEXT-ARCHIVE.md §Phase S (drop-and-load). **Verify (in DAW):** dragging a single capture from the dock over a track's FX button highlights it; dropping instantiates ReaSampler 9000 on that track with the dragged capture loaded, selected, and MIDI-playable immediately; OS drag-out to Explorer still works diff --git a/CONTEXT-ARCHIVE.md b/CONTEXT-ARCHIVE.md index fa5ed9c..61490e3 100644 --- a/CONTEXT-ARCHIVE.md +++ b/CONTEXT-ARCHIVE.md @@ -30,8 +30,7 @@ REAPER-facing: track, time range, tail, SR/bit-depth/channels, output path). Output: a finished file + a populated `Sample` handed to `bank_model`. Capture is always wet; the FX *scope* (not a wet/dry dial) is the control — the pure `render_settings` module - maps a scope to its render-source bits and its FX-bypass plan (see §Capture FX - scope below). + maps a scope to its render-source bits and its FX-bypass plan (see CLAUDE.md §Precision invariants). - `insert` — placement via `InsertMedia`; conform-to-project-tempo vs literal, as an explicit flag (never silent stretching). - `bank_panel` — the docked grid: LICE-drawn thumbnails, audition, multi-select, @@ -65,7 +64,7 @@ Offline render (the crux — prototype this first): selected media items (single-file), **track** scope renders selected tracks via master. There is **no master-mix scope** (to capture the master, render a track). Render is always wet — REAPER has no true pre-FX "dry" render bit; FX scoping is done - by the FX-bypass-around-render mechanism, not a render bit (see §Capture FX scope). + by the FX-bypass-around-render mechanism, not a render bit (see CLAUDE.md §Precision invariants). - Trigger a no-dialog render via the appropriate render action / `RENDER_SETTINGS` bit. Confirm the exact command id and the "render without opening dialog" flag against current REAPER — do not assume; test that it runs headless. @@ -686,8 +685,7 @@ UX is awful" points at the editor as the live wound, so **S10 leads.** - **LICE design-kit surfaces — moved to Phase L.** The shared LICE drawing-kit surface verification (`LICE_GradRect`/`LICE_RoundRect`/AA lines/circles/beziers/polygons + the `LICE_CachedFont`/`LICE_IFont` font engine, and the vwnd drawing-craft references) now - lives with **Phase L point L1** on `dev` — see CONTEXT.md §Phase L "LICE / WDL API - surface". Phase S surfaces (S10–S13) adopt that kit when it lands; they are not gated on it. + lives with **Phase L point L1** on `dev` — see §"LICE / WDL API surface" in this file. Phase S surfaces (S10–S13) adopt that kit when it lands; they are not gated on it. --- @@ -741,7 +739,7 @@ itself**. The extension is the actor for the whole gesture. **The ReaSampler 9000 load-capture seam (the hard coupling — MUST be added; does not yet exist).** The Phase S spec today gives the instrument a **live-state *read* seam** (it -reads bank index + mapping from `"reasampler"` ext-state via the bridge — §The two seams) +reads bank index + mapping from `"reasampler"` ext-state via the bridge — CONTEXT.md §The two seams) but **no entry point for an external actor to say "this fresh instance should play *this specific* capture."** Reading the bank is not the same as being *pointed at one sample*. This wave is the reason to add that seam, and the seam lands **inside the instrument** @@ -767,8 +765,7 @@ translate a neutral state representation on its behalf. This makes the **compone blob format a shared cross-artifact contract** — one that is **still being defined in Phase S** — and a **coordination dependency between the extension and the instrument:** both must agree on the exact byte layout that ReaSampler 9000's `setChunk` accepts before either half -is final. The load-capture seam and the component-state persistence work (§Where the toggle -lives / component-state version bumps) share this one blob format. +is final. The load-capture seam and the component-state persistence work (CONTEXT.md §Where the toggle lives / component-state version bumps) share this one blob format. **Rejected alternative — (A) fresh-instance ext-state handshake.** The extension writes a small "pending load" hint into `"reasampler"` ext-state keyed to the target track/FX (a @@ -908,7 +905,7 @@ centerpiece), grouping by *task*: affordances, per-selection **move / copy / remove** sample menu. - **Prune** button (R-E) — the byte-deleting action; `warn`-colored, set apart. -**M11 adds (dev PLAN.md §M11 — merging to dev now):** +**M11 adds (COMPLETED.md §M11):** - **Action-trigger buttons** — clickable buttons firing the capture + provenance action family directly (capture item / capture track scopes, re-capture from source, resample-and-mute-source, batch capture, conform-on-insert, insert-at-cursor, drag-out, diff --git a/PLAN.md b/PLAN.md index a6383dc..e3f5bc9 100644 --- a/PLAN.md +++ b/PLAN.md @@ -18,7 +18,7 @@ it here and appends it to `COMPLETED.md`. > **Abandoned (Daniel, 2026-07-27) — will not be built.** -**Goal:** "Capture to slot N" / "insert slot N", MIDI-bindable. CONTEXT.md +**Goal:** "Capture to slot N" / "insert slot N", MIDI-bindable. CONTEXT-ARCHIVE.md Build order 9. **Verify (in DAW):** Slot capture and slot insert fire from MIDI bindings; slot state persists via the index. diff --git a/README.md b/README.md index b0c94c4..be6501f 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Pure modules have `_tests` targets that run without REAPER or a DAW. `src/resource.rc` must be pre-processed by SWELL's resgen once per platform: - php vendor/WDL/WDL/swell/mac_resgen.php src/resource.rc # macOS; Linux reuses the output + php vendor/WDL/WDL/swell/swell_resgen.php src/resource.rc # macOS; Linux reuses the output Add the generated file to the appropriate `APPLE` / Linux `target_sources` block in CMakeLists.txt. The SWS extension build is the canonical reference for this step.