bcdf97d6c4
Grid-ness of an edge was a proxy for "no floor could explain this count," not the test itself — equal remainders on both edges cancel under a full floor. Now checks all three floored models directly and corrects the SHORT/LONG floor-signature docs.
11 KiB
11 KiB
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.000–12.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 twoRENDER_BOUNDSFLAGchannels exist, and the two live observations behind this:src/core/capture/render_settings.h'sRenderBoundsChannelanddocs/TODO.md"An offline capture can be refused...". Both live observations started at0s, 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 viaGetSet_LoopTimeRange) instead of custom time bounds. On every return past the point a bounds channel is chosen (the format/mode/empty-range/no-project refusals answer earlier and print nothing), one line beginningReaSampler capture -- bounds channel:prints — including the two paths that answer before any bounds are judged (unsupported format, no output file), which printNOT JUDGEDrather than staying silent. Read the verdict: the floor's signature is ONLY a sentence naming "floored to the millisecond" — a bare SHORT with no such sentence means the shortfall's cause is unestablished, and LONG can never be the floor's signature (a floor only removes frames, never adds them). (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, and it can mask a floor: a window whose start and end sit in the same millisecond bucket makes the floored count equal the exact one, so a real one-frame floor there reads as a bare SHORT (WITHIN TOLERANCE) with no floor sentence at all. EXACT is the fix only when the line carries no further caveat. The verdict checks the observed count against every millisecond-floored model of the window (start floored alone, end floored alone, both together) and names any that reproduce it — grid membership on either edge is a proxy for that collision, not the test itself, so the caveat can fire even when NEITHER edge sits on the millisecond grid (sub-millisecond remainders on the two edges can cancel under a full floor — a dragged, fixed-length time selection is the reproducible case). Re-run with a window the caveat doesn't name 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 window rounds to 0 frames at this rate) OR the render source itself is INFERRED (not SDK-confirmed) to derive its own bounds and never consult the channel — selected-items captures always read this way; razor edits never do today, because no offline capture path assignsSourceMode::RazorArea(razor is a range source resolved through track/item scope, not a render source of its own) — 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 renderdrift 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 thatRENDER_TAILMSis 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 (checkRenderedBoundsreturns immediately fortailMode != 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,
+Npresent 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
.wavis 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)