Files
reasampler/docs/VERIFICATION.md
T
daniel 5f971e60cd Close three critical review findings on the render-bounds-channel verdict
Verdict can no longer print a false EXACT on an on-grid end, no longer names a
bounds channel a content-derived render never consulted, and the grid-align doc
premise is corrected without implementing it.
2026-08-02 15:56:57 -04:00

10 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 — what to expect. A custom-bounds render is known to floor its window's END to the millisecond and write the floored value back over RENDER_ENDPOS. Mechanism, why two RENDER_BOUNDSFLAG channels exist, and the two live observations behind this: src/core/capture/render_settings.h's RenderBoundsChannel and docs/TODO.md "An offline capture can be refused...". Both live observations started at 0s, on the grid, so nothing is known about the START edge
  • The one experiment — does another bounds mode escape the floor? This build renders on the TIME SELECTION channel (RENDER_BOUNDSFLAG=2, window handed over via GetSet_LoopTimeRange) instead of custom time bounds. Every capture prints one line beginning ReaSampler capture -- bounds channel: — including the two paths that answer before any bounds are judged (unsupported format, no output file), which print NOT JUDGED rather than staying silent. Read the verdict: a bare SHORT/LONG (no tag), or one naming "floored to the millisecond", is the floor's signature — it did not escape this channel. (WITHIN TOLERANCE) on a SHORT/LONG is the gate's ordinary ±1-frame edge-convention slack (render_window.h), not the floor — don't read it as either result. EXACT on a window whose END is off the millisecond grid is the fix — the floor did not reach this channel. EXACT on a window whose END lands on the grid is NOT conclusive: the line adds "The END edge is UNTESTED here too" — a floored render prints the identical count by coincidence, so re-run with an off-grid end before trusting EXACT. NOT JUDGED naming a bounds channel means that capture answered nothing (tail mode was not None, the render was empty, the render never even reached a bounds check) OR the render source itself derives its own bounds and never consulted the channel — selected-items/razor captures always read this way, so pick a window narrower than the selected item(s) to route through the time-bounded source instead
  • Same run, the START edge. The verdict line also says whether the run tested the start. Capture a range whose start is NOT a whole millisecond (set View → time unit to Samples, then nudge the selection start off the grid) so the line reads The START edge IS tested here. Report that line verbatim — it is the only evidence available for whether the start floors too, and a start floor is the case that would break the null test silently rather than loudly
  • Auto and Manual tail. Repeat the off-grid-start/off-grid-end capture once with the panel tail toggle at Auto and once at Manual. Neither is judged against a frame count, so the evidence is the after render drift lines: report whether either channel's bounds read back changed. [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, an end floor could be costing Auto/Manual real content with no detector (checkRenderedBounds returns immediately for tailMode != None) — so also report by ear/measurement whether either tail capture comes up short against the source, not only whether the bounds fields drifted
  • Whichever way the experiment lands, the refused render is still 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

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)

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)