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.
This commit is contained in:
2026-07-27 21:32:22 -04:00
parent e4f4691a0d
commit b09f375490
5 changed files with 44 additions and 47 deletions
+1 -1
View File
@@ -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: `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. 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.
+35 -35
View File
@@ -36,7 +36,7 @@ build` is green with the new `bank_model` + `peaks` suites present.
## Milestone 1 — bank_model + JSON round-trip (pure) ## Milestone 1 — bank_model + JSON round-trip (pure)
**Goal:** The `Sample` metadata struct and `BankIndex` (add / remove / query / **Goal:** The `Sample` metadata struct and `BankIndex` (add / remove / query /
tier moves / dedup-by-hash) with JSON serialize/deserialize to `std::string`. 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) **Verify:** CTest green. Round-trip is lossless (deserialize(serialize(x)) == x)
across all fields; dedup-by-hash and tier filtering asserted; **relative paths across all fields; dedup-by-hash and tier filtering asserted; **relative paths
only** invariant enforced at the model boundary (no absolute path accepted/stored). 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, - [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, 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, 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] `BankIndex`: ordered collection keyed by id; add / remove / query.
- [x] Hash lookup for dedup-by-content-hash. - [x] Hash lookup for dedup-by-content-hash.
- [x] Tier model (scratch | archive) + tier-move + tier filtering; scratch marked - [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) ## Milestone 2 — peaks (pure)
**Goal:** Compute waveform min/max bins from raw PCM, dependency-free (not **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 **Verify:** CTest green. Fed a known signal (full-scale sine, ramp), asserted
min/max envelope per bin matches expected within tolerance; channel count min/max envelope per bin matches expected within tolerance; channel count
preserved; bin count honored for arbitrary sample lengths (incl. remainder bin). 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) ## Milestone 3 — Offline capture spike (REAPER shell)
**Goal:** Offline-render the time-selection master mix to a wav in the project **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. §REAPER API surface (offline render), Build order 3.
**Verify (in DAW):** Render runs via `Main_OnCommand(42230)` ("Render using most **Verify (in DAW):** Render runs via `Main_OnCommand(42230)` ("Render using most
recent settings") — REAPER always shows its offline-render progress window; no recent settings") — REAPER always shows its offline-render progress window; no
@@ -87,7 +87,7 @@ fallback).
added silence without an explicit tail). added silence without an explicit tail).
- [x] `ICaptureBackend` interface + `CaptureRequest` (source mode, time range, - [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 + - [x] `OfflineRenderBackend`: drive `GetSetProjectInfo` render settings +
`GetSetProjectInfo_String` file/pattern/format; **verify every flag against `GetSetProjectInfo_String` file/pattern/format; **verify every flag against
`vendor/reaper-sdk/sdk/reaper_plugin_functions.h`.** `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) ## Milestone 4 — persist (index ↔ project ext state)
**Goal:** Write the `BankIndex` JSON to project ext state, reload on project open; **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 **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 with the .rpp**; **relative paths only** in the persisted index (Save As to a new
folder still resolves the bank). folder still resolves the bank).
@@ -121,7 +121,7 @@ folder still resolves the bank).
## Milestone 5 — bank_panel (docked grid) ## Milestone 5 — bank_panel (docked grid)
**Goal:** Docked LICE-drawn grid: thumbnails (from `peaks`), audition, **Goal:** Docked LICE-drawn grid: thumbnails (from `peaks`), audition,
multi-select, keyboard navigation. Reuses the docking setup from the retired 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 **Verify (in DAW):** Grid docks; thumbnails render from computed peaks; audition
plays selected sample; multi-select + keyboard nav work. plays selected sample; multi-select + keyboard nav work.
@@ -137,7 +137,7 @@ plays selected sample; multi-select + keyboard nav work.
--- ---
## Milestone 6 — insert (placement) ## 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. §insert, Build order 6.
**Verify (in DAW):** Selected sample inserts at the edit cursor wrapped in **Verify (in DAW):** Selected sample inserts at the edit cursor wrapped in
`Undo_BeginBlock2` / `Undo_EndBlock2`; conform-to-tempo is an explicit flag — `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) ## D1 — view_mode_model (pure)
**Goal:** REAPER-free mode registry + membership index + folder-tree-aware **Goal:** REAPER-free mode registry + membership index + folder-tree-aware
visibility derivation + parking/restore planner + JSON round-trip. The heart of the 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. **Verify:** CTest green. N-mode model (not a boolean); Arrange + Design seeded.
Restore-planner round-trip (snapshot → park → restore) returns every driven flag to Restore-planner round-trip (snapshot → park → restore) returns every driven flag to
its captured value. Parent-derivation correct against a supplied folder tree. its captured value. Parent-derivation correct against a supplied folder tree.
@@ -182,7 +182,7 @@ mode.
## D2 — view shell (apply flags in the DAW) ## D2 — view shell (apply flags in the DAW)
**Goal:** Read the folder tree and drive REAPER flags per the planner. **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 **Verify (in DAW):** Toggling active mode hides + parks inactive leaves
(`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline) and restores (`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline) and restores
active ones from snapshot. **Master untouched. `B_MUTE`/`I_SOLO` untouched.** 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) ## D3 — persist slice (view state ↔ project ext state)
**Goal:** Serialize the view section into the `"reasampler"` namespace alongside the **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 / **Verify (in DAW):** Membership + active mode + snapshots survive Save / Save As /
close+reopen; on open, the active mode's visibility + processing is reapplied. 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 Saved-while-parked project restores parked tracks from persisted snapshots (not to a
@@ -215,7 +215,7 @@ guessed "on").
--- ---
## D4 — actions ## 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); (actions). **Verify (in DAW):** Each action registered (bindable in Actions list);
toggle + mode-jumps MIDI-bindable; tag/untag acts on the current track selection. 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 ## Milestone 7 — capture action family
**Goal:** Bindable capture actions for master / selected tracks / selected items / **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 **Verify (in DAW):** Each action registered (bindable in Actions list), routes to
the offline backend, and honors wet/dry + tail. **Load-bearing principle:** none the offline backend, and honors wet/dry + tail. **Load-bearing principle:** none
auto-inserts into the arrange. auto-inserts into the arrange.
@@ -357,7 +357,7 @@ auto-inserts into the arrange.
## Milestone 8 — RealtimeRecordBackend ## Milestone 8 — RealtimeRecordBackend
**Goal:** Realtime record behind the same `ICaptureBackend`, producing identical **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 **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** output via a `CreateTrackSend`; recorded file moves into the bank; **non-destructive**
— temp track (and its sends) removed cleanly, every snapshotted track arm, time — 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 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 were completed in D2-W3-A; this wave closes the remaining action surface and
cleans up the implementation. 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 **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 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. 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 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; sample between banks, JSON round-trip + legacy-migration. The heart of the phase;
mirror of `bank_model` / `view_mode_model`; **`BankIndex` untouched (additive)**. 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, **Verify:** CTest green. Pool always present, un-deletable, un-renamable,
un-evacuable (rules rejected in-model). Active-bank defaults to pool. Move is un-evacuable (rules rejected in-model). Active-bank defaults to pool. Move is
index-only (source loses entry, destination gains it) and observes destination 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 **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 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 `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 **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`; 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 a project saved before this phase (legacy `bank_index` only) loads as pool + zero
@@ -868,7 +868,7 @@ written.
--- ---
## B3 — actions ## 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); (actions). **Verify (in DAW):** Each action registered (bindable in Actions list);
bank-activate + move/copy + evacuate MIDI-bindable; create/rename/delete/evacuate bank-activate + move/copy + evacuate MIDI-bindable; create/rename/delete/evacuate
drive the B1 model via the B2-persisted session. 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) ## B4 — bank_panel vertical split (UI)
**Goal:** The vertical-split bank window — pool on top, named-banks tab-page region **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 (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** 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 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 **Goal:** Populate `Sample.provenance` (parent sample id + a capture-recipe
fingerprint) on resample-from-sample, and ship a **"re-capture from source"** fingerprint) on resample-from-sample, and ship a **"re-capture from source"**
action that regenerates a sample from its recorded source. Reconciled with the 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`. the settled reconciliation in `docs/product/provenance.md`.
**Verify (in DAW):** A sample resampled from a bank sample carries its parent id + **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 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 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 B-cap), compute the orphan set `(owned ∩ present) referenced`. The mirror of
`ViewModeModel::reconcile(liveGuids)`, one level down (files instead of GUIDs). `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 **Verify:** CTest green. **Prune null test:** a folder whose every file is
referenced deletes nothing; prune returns exactly `(owned ∩ present) referenced` referenced deletes nothing; prune returns exactly `(owned ∩ present) referenced`
and nothing else. Referenced-set unioned across every bank (a file referenced by any 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), **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 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 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 **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 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. 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 **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 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. 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, **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 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 referenced file, never a hand-dropped non-bank file; the referenced/owned-set safety
@@ -1168,7 +1168,7 @@ untouched.
## Milestone 11 — polish (wave 1) ## Milestone 11 — polish (wave 1)
**Goal:** Batch capture (per selected item / per razor area), action trigger buttons **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 **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 in-panel action fires through the command-id contract without regressing precision
invariants. invariants.
@@ -1197,7 +1197,7 @@ invariants.
architecture. Mirror of the null-test cut precedent ("Cut (fixed by Daniel)"). architecture. Mirror of the null-test cut precedent ("Cut (fixed by Daniel)").
## Milestone 11 — polish (wave 2 / completion) ## 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). §Non-goals (drag-out deferred to last).
**Verify (gates 24/24 both configs):** Drag-out places a valid file in the OS target **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 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 **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 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`. 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. 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 **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 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 ## L2 — dock-panel layout redesign
**Goal:** Full layout redesign of the `bank_panel` dock window — task-grouped action bar, **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. 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. governing settled decision; sequenced after M11 merged.
**Verify:** CTest green (`action_bar_tests`). The panel renders in the settled B+spectral **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 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 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 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. change, no touching the "capture ≠ placement" principle. Independent of L3.
CONTEXT.md §Phase L (L4 dock-panel button layout). Product framing: CONTEXT-ARCHIVE.md §Phase L (L4 dock-panel button layout). Product framing:
`docs/product/visual-design-language.md` §L4. `CONTEXT-ARCHIVE.md` §L4 dock-panel button layout.
**Verify (in DAW):** the top toolbar fires every capture + placement + maintenance action; the **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 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 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 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 `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. 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, **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 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 `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 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 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**. 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 **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 "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 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 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 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). waveform view).
**Verify (in DAW):** selecting a zone shows its sample's waveform; dragging the loop-start **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; 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" 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 + 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 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 **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 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 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 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 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 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 **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 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)`. VST3 component-state injection via `TrackFX_SetNamedConfigParm(..., "vst_chunk", blob)`.
The shared `instrument_drop` pure module constructs the blob via the instrument's own The shared `instrument_drop` pure module constructs the blob via the instrument's own
`sample_map::serializeComponentState`/`deserializeComponentState` — one serializer called `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 **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 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 capture loaded, selected, and MIDI-playable immediately; OS drag-out to Explorer still works
+6 -9
View File
@@ -30,8 +30,7 @@ REAPER-facing:
track, time range, tail, SR/bit-depth/channels, output path). Output: a finished 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 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 *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 maps a scope to its render-source bits and its FX-bypass plan (see CLAUDE.md §Precision invariants).
scope below).
- `insert` — placement via `InsertMedia`; conform-to-project-tempo vs literal, - `insert` — placement via `InsertMedia`; conform-to-project-tempo vs literal,
as an explicit flag (never silent stretching). as an explicit flag (never silent stretching).
- `bank_panel` — the docked grid: LICE-drawn thumbnails, audition, multi-select, - `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 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). 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 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` - 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 bit. Confirm the exact command id and the "render without opening dialog" flag
against current REAPER — do not assume; test that it runs headless. 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 - **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 verification (`LICE_GradRect`/`LICE_RoundRect`/AA lines/circles/beziers/polygons + the
`LICE_CachedFont`/`LICE_IFont` font engine, and the vwnd drawing-craft references) now `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 lives with **Phase L point L1** on `dev` — see §"LICE / WDL API surface" in this file. Phase S surfaces (S10S13) adopt that kit when it lands; they are not gated on it.
surface". Phase S surfaces (S10S13) 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 **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 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 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*. 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** 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 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 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 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 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.
lives / component-state version bumps) share this one blob format.
**Rejected alternative — (A) fresh-instance ext-state handshake.** The extension writes a **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 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. affordances, per-selection **move / copy / remove** sample menu.
- **Prune** button (R-E) — the byte-deleting action; `warn`-colored, set apart. - **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 - **Action-trigger buttons** — clickable buttons firing the capture + provenance action
family directly (capture item / capture track scopes, re-capture from source, 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, resample-and-mute-source, batch capture, conform-on-insert, insert-at-cursor, drag-out,
+1 -1
View File
@@ -18,7 +18,7 @@ it here and appends it to `COMPLETED.md`.
> **Abandoned (Daniel, 2026-07-27) — will not be built.** > **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. Build order 9.
**Verify (in DAW):** Slot capture and slot insert fire from MIDI bindings; slot **Verify (in DAW):** Slot capture and slot insert fire from MIDI bindings; slot
state persists via the index. state persists via the index.
+1 -1
View File
@@ -57,7 +57,7 @@ Pure modules have `<module>_tests` targets that run without REAPER or a DAW.
`src/resource.rc` must be pre-processed by SWELL's resgen once per platform: `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 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. CMakeLists.txt. The SWS extension build is the canonical reference for this step.