8331df2e91
The millisecond floor lives in the custom-bounds field, not the engine, so RENDER_BOUNDSFLAG=2 is now the only bounds mode: the two-position type, the console verdict and the STARTPOS/ENDPOS drift probe all go. capture.cpp 697 -> 622.
9.1 KiB
9.1 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 — 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 kHzTailMode::Nonerenders onRENDER_BOUNDSFLAG=2(time selection, handed over viaGetSet_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 theRENDER_STARTPOS/ENDPOSread-back probe that answered this are gone. Full observation:src/core/capture/render_settings.h'skRenderBoundsTimeSelection - Still open — Auto and Manual tail.
checkRenderedBoundsjudgesTailMode::Noneonly (Auto/Manual add frames by design), so the settled result covers those two by INFERENCE, not observation: the floor applied to the bounds identically on all three tail modes, and all three now hand the window over the same way. 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 thatRENDER_TAILMSis 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 millisecondmeans 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'srenderHonoredBounds)
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)