Files
reasampler/docs/VERIFICATION.md
T

12 KiB
Raw Blame History

DAW verification — post-1.0 work on dev

Checks for Θ, Ξ, Ψ, and Ε work that no unit test can close. Build Release, install into UserPlugins/, restart REAPER. Panel tail toggle = None, project rate 48000, unless a check says otherwise.

Precision invariants

  • Dry offline item capture of a 2 s range, re-inserted at its source position, inverted against the source — reads silence (CLAUDE.md:207)
  • Run the identical offline capture request twice — the two files are byte-identical on disk (CLAUDE.md:208)
  • After any capture, source items and tracks are unchanged: fader, pan, mute, FX bypass, selection (CLAUDE.md:209)
  • After a realtime capture, the temp track is gone and every source track's routing is back as it was (CLAUDE.md:209)
  • Capture 10.00012.000 s — card reads 2.000 s / 96000 frames, no leading or trailing silence (CLAUDE.md:210)
  • With an FX on the source track: item scope does NOT carry it, track scope does (CLAUDE.md:212)
  • Track scope on a child track with FX, gain, and pan set on the parent and master — neither colors the capture (CLAUDE.md:212)
  • Save, move the whole project folder elsewhere, reopen — every card still resolves and auditions (CLAUDE.md:211)

The decisive observation

  • Run first. docs/verify-track-scope-multitrack.md §3 by hand, and count the files REAPER writes (docs/TODO.md:552, PLAN.md:2134, PLAN.md:2238)
  • Two files confirms Ψ-W1-T1 and Ψ-W3-T1 at once; one summed file invalidates both — stop and report, the refusal is costing a capture 1.0.0 accepted (PLAN.md:2239, docs/COMPLETED.md:884)
  • Then walk the rest of docs/verify-track-scope-multitrack.md (§1–§2, §4–§7) for the multi-track refusal itself (PLAN.md:2240)

Capture range and bounds

  • Over an item much longer than the selection: item scope × time selection, and item scope × razor — each lands exactly the window, not the whole item (PLAN.md:2136)
  • Same source: track scope × time selection, and track scope × razor — same exact window (PLAN.md:2136)
  • One razor-union case (two disjoint areas, one track) — lands the requested window, no ReaSampler capture failed: line (PLAN.md:2137)
  • Capture an item whose extent already equals the window — still lands, unchanged (the byte-identity regression floor) (docs/COMPLETED.md:829)
  • The millisecond floor — SETTLED, nothing to re-run for TailMode::None. The floor lives in the custom-time-bounds field (RENDER_BOUNDSFLAG=0), not in the render engine. Two live 48 kHz TailMode::None renders on RENDER_BOUNDSFLAG=2 (time selection, handed over via GetSet_LoopTimeRange) came back exact — 97627 frames against 97627 — the second over a window whose START carried a sub-millisecond remainder, with no floored model of that window able to reproduce the count. Time selection is now the only bounds mode a capture can reach; the console verdict line and the RENDER_STARTPOS/ENDPOS read-back probe that answered this are gone. Full observation: src/core/capture/render_settings.h's kRenderBoundsTimeSelection
  • Still open — Auto and Manual tail. checkRenderedBounds judges TailMode::None only (Auto/Manual add frames by design), so the settled result covers those two by INFERENCE, not observation, and the inference rests on an unverified PREMISE too: that the (retired) floor applied to the bounds identically across all three tail modes, and that all three now hand the window over the same way. Neither is measured — both live short renders that settled the bounds mode were TailMode::None; no Auto or Manual capture has been observed at all. On Auto/Manual, the ONLY automatic check left is the 0-byte gate (checkRenderedFileNotEmpty) — there is no automatic bounds signal for those two modes at all until this bullet is closed by hand. What would establish it: repeat an off-grid-start capture at Manual over a source that is loud right to the window's end, and check the landed file's frames against window + tailMs — a floored edge shows up in that count. Auto cannot be checked by count (it trims trailing silence), so it needs the null test by ear/inversion against the source instead
  • [verify — DAW] A tail is assumed to render PAST the window end — the SDK header (:3048) confirms only that RENDER_TAILMS is a length in ms, not that it extends past the end. If that assumption is wrong, a tail capture is silently SHORTER than its window with no detector at all. Report whether either tail capture comes up short against the source
  • A refused render is kept for diagnosis at <project folder>/reasampler_refused/ (the refusal line names the path; a failed move leaves it unindexed in the bank folder and says so). Delete the folder when done — nothing in the bank references it
  • If a capture is refused for a short render, report the refusal line verbatim. A message naming floored to the millisecond means the floor is back on a mode measured escaping it; a shortfall of one or two frames with no such sentence may be the gate's own edge-convention tolerance rather than the render (render_window.h's renderHonoredBounds)

Names and channels

  • Capture from a named track — the card reads <Track> MM-DD HHMM; capture again the same minute and the second carries an ordinal (PLAN.md:2199)
  • Capture from an unnamed track, and from a multi-item selection — both readable, +N present on the multi (PLAN.md:2199, docs/COMPLETED.md:862)
  • Load a named capture into ReaSampler 9000 — the same name shows there (PLAN.md:2200)
  • The card label stays legible over its scrim at every card size (docs/COMPLETED.md:863)
  • Capture a dead-center mono source — the .wav is roughly half the size of the equivalent stereo capture (PLAN.md:2216)
  • Insert that collapsed file on a stereo track and null it against the source — confirms REAPER sums a 1-channel item at unity (PLAN.md:2218)
  • Capture a true-stereo source — stays 2-channel, and both it and the collapsed file load into the instrument correctly (PLAN.md:2217)

Mode switching

  • Solo tracks in Arrange, switch to Design, solo different tracks, switch back — each mode restores its own solo set verbatim (PLAN.md:2151)
  • Attempt a mode switch while the transport is playing, then while recording — both refuse, visibly (PLAN.md:2151)
  • Click the footer mode segment, save, reopen the project — the mode persisted (PLAN.md:2152, docs/COMPLETED.md:841)

Actions and drops

  • Add the import action to a Media Explorer toolbar and fire it from there — it imports (PLAN.md:2162)
  • Fire the existing Main-section import binding — still works (PLAN.md:2163)
  • Unload/reload (restart REAPER) — no duplicate Media Explorer entry in the action list (PLAN.md:2164)
  • Drag one card across the arrange, over an FX window, over the TCP/MCP and back — cue changes per surface, every transition reverses (PLAN.md:2176, PLAN.md:2177)
  • Drag fast, and drag onto a narrow TCP — target class still resolves; no release anywhere in REAPER is a silent no-op (PLAN.md:2178, docs/COMPLETED.md:858)
  • Drop a single card into the arrange — an item lands at the pointer's track and time (PLAN.md:2174)
  • Drag-out to an external app twenty-plus times in a row — audio arrives every time; this is a soak, a single pass is not a gate (docs/COMPLETED.md:109)
  • Drop a capture onto an FX container — the instrument loads with that capture (docs/COMPLETED.md:110)

Bank packages

  • Run in full. docs/verify-package-transfer.md — the whole cross-machine export/import round trip: writes-one-file, the transfer itself, re-importing the same file never overwrites, the round trip back to the source, the too-new / truncated / mid-payload-corruption refusals (each an exact string), the unsaved-project refusals, and drag-and-drop (docs/COMPLETED.md:1068, PLAN.md:2578)
  • Force a degraded tracking ledger and confirm the import refuses before the file picker opens: save a project with a bank, close REAPER, edit the saved .rpp's owned_files ext-state value inside its <REASAMPLER ...> block — corrupt the JSON for the Unreadable case, or bump "v":2 to "v":3 for the FutureVersion case — reopen the project, then run ReaSampler: import bank package (.rsbank). Read off: the console prints the ledger-refusal block and no file dialog ever appears (src/core/tracking/origin_ledger.h:95,101, src/shell/actions/package_import_action.cpp:161-167)
  • Export dialog: type a destination name with no extension, then again over a name that already carries a different one (e.g. mybank.bak) — read off whether GetUserFileName appended .rsbank itself or ReaSampler's own re-append produced the double-extension result (mybank.bak.rsbank) the code expects (src/shell/package/CLAUDE.md:112-122)
  • Both the export and the import file dialogs open in front of REAPER's main window, not behind it — GetUserFileName takes no owner window (src/shell/package/CLAUDE.md:110-112)
  • With a ReaSampler 9000 instance's editor open on the destination project (Browse view visible), import a .rsbank from the docked panel — the browser reflects the new bank without closing or reopening the editor (the bank-generation bump, src/shell/persist/session.h:114-121, polled by the instrument at src/shell/instrument/processor_reload.cpp:444-475)
  • Drag two or more .rsbank files onto the docked panel in one drop — each lands as its OWN new bank, never merged into one, and if the tracking ledger is degraded the refusal prints ONCE for the whole drop rather than once per file (src/shell/panel/panel_window.cpp:63-94)
  • Kill REAPER (or the process) partway through an import so a partial bank file is stranded under its real name in the bank folder, then re-run the same import into the same project — read off what happens. Whether the import verb should pre-clean that stale debris is an open question, not yet decided (src/shell/package/CLAUDE.md:102-108)

The resample bake

  • Bake a dialed sound — the banked file sounds like what the editor was playing (docs/COMPLETED.md:737)
  • Bake the result twice more — iteration composes, nothing is lost per pass (docs/COMPLETED.md:737)
  • Save and reopen after a bake — the instance still points at the baked capture (docs/COMPLETED.md:737)
  • Confirm no bake put an item in the arrange, and the superseded file is still on disk (docs/COMPLETED.md:737)
  • Bake from an instance in a background project tab — refuses rather than writing into the wrong bank (docs/COMPLETED.md:725)
  • Load the VST with the extension not installed — the resample affordance reads unavailable, not silently lossy (docs/COMPLETED.md:731)
  • After a bake: instance is in Trigger with start point reset, channel mode and preview velocity survived (docs/COMPLETED.md:714, docs/COMPLETED.md:720)
  • Gate mode + active sustain loop — "Bake Hold" appears within ~500 ms, its label fits its cell, its travel is duration-ordered (docs/COMPLETED.md:806)

Instrument migration

  • Open a project saved before the zone retirement — the instance reopens on its first zone and sounds the same (docs/COMPLETED.md:85)
  • Such an instance with implicit channel mode + a stereo capture reopens Stereo — confirm that is acceptable by ear (docs/COMPLETED.md:78)

Look and feel

  • Sign off by eye in a live editor window: knob arcs, needles, envelope splines, waveform outline (docs/COMPLETED.md:669, PLAN.md:375)
  • Same pass for legibility: text sizes, arc weight, and whether the waveform stroke thickens the docked panel (docs/COMPLETED.md:613, PLAN.md:348)
  • Piano strip at the 840 px default — keys tile uniformly, the 37 px end gutters read as acceptable (docs/COMPLETED.md:219)
  • Resize the editor across several widths — gutters stay symmetric, no key width jumps (docs/COMPLETED.md:217)
  • Set host/OS scaling to 150% then 200% — record how the strip and the AA strokes actually look (docs/TODO.md:418, docs/COMPLETED.md:226)