Update ingest surface (2) + instrument_drop_win entry points in CLAUDE.md
and the Ingest-through-the-bank spec in CONTEXT.md; createTrackWithInstrument
removed.
ME-import adds the new RS9k to the selected track instead of creating a
new track; no selected track refuses gracefully with the sound still
banked. Removes the now-dead createTrackWithInstrument.
No track is created; no routing changes. No selected track -> bank
import proceeds, instrument placement is refused with a console message
explaining why. createTrackWithInstrument removed (was sole caller).
Dropping audio onto the bank panel imports to the bank without
force-selecting on any live instance; generation bump retained so open
instances see the new sounds.
Remove both ingestAssignActiveInstance() calls from ingestDroppedFiles.
New samples still land in the bank, bump the generation, and persist —
but the drop no longer force-selects on any live instance. Dedup branch
simplified; stale comments corrected. ingestAssignActiveInstance stays
defined for the main.cpp path.
Repurpose INGEST_IMPORT_MEDIA_EXPLORER to stand up a fresh instrument on
a new track pre-loaded with the imported sound, instead of force-selecting
on the active instance.
Repurpose INGEST_IMPORT_MEDIA_EXPLORER (id unchanged) to stand up a
fresh ReaSampler 9000 on a new named track pre-loaded with the imported
sound, instead of force-selecting on the active instance. One undo point.
Per-PerformanceZone state home, new pure velocity_curve module, application at
Voice::start(), Sample-view editor UI. New PLAN points S-VIEW-9 (foundation,
blocked by Wave 1 T-KEYTRK) + S-VIEW-10 (Wave 2 shell). Fork R10-F1 (flat-y=1
default is a non-back-compat behavior change) left open for Daniel.
Add previewVelocity_ member to ReaSamplerProcessor; populate it in
getState and restore it in setState so the field round-trips in the
plugin, not just in the pure unit test. Clamp 1..127 at the
deserialize read boundary in sample_map.cpp.
The FX-hotspot classifier matched only fx_ (the FX-chain/floating windows),
so a drop on a track TCP FX button (info tcp*) never armed the drop and the
capture fell through to arrange as audio. Widen to fx_/tcp/mcp in a pure,
unit-tested predicate; shell calls it.
New top-level previewVelocity field (MIDI 1..127, mid default 64), sibling of
channelMode. Envelope bumped v5->v6; v5 and older blobs lift to the mid default.
Zones payload untouched (independent version axis). Round-trip + v5/v4-lift +
truncation tests added.
keyTrackedRatio is bit-identical to pitchRatio at 100%; keyTrack threads through PerformanceZone->ResolvedZone->KeyZone into baseRatio_, so Varispeed and Preserve both inherit it. Zones payload bumped to v6; older blobs lift to 1.0.
F1 -> preview velocity persists via VST3 component state (v5->v6). F2 -> envelope nodes draggable via new pure envelope_edit module. Drop the two-pass L3 restyle framing; build on the merged L3 LnF. F3 remains open.
L3 (VST editor + embed-strip restyle) is on dev. Append its COMPLETED entry
and flip visual-design-language.md §5.3/5.4 from GATED to landed / Phase L
complete. PLAN.md + CONTEXT.md L3 edits already landed via the S-VIEW commit.
New items adopt the single mode of their track's pre-existing content; active-mode rule retained for new tracks, empty tracks, and multi-mode tracks. Reconciles spec with the fix-drop-lane-strand merge.
A bank-panel capture dropped onto a track with pre-existing content was
auto-tagged into the active mode, forcing a multi-mode lane split whose
toggle silenced the pre-existing items. New items now adopt the single
mode of their track's prior content; deliberate splits stay on the
explicit item-move path.
All eight drag-state fields cleared through one canonical helper.
WM_CAPTURECHANGED now resets instrumentDropTrack (was missing per doc-contract).
WM_DESTROY and closePanel gain dropKind/dropBankId resets (inert on teardown; correct for symmetry).
On chunk-write failure, call TrackFX_Delete(track, fxIndex) to remove
the just-added empty FX instance before returning false. Signature
verified at reaper_plugin_functions.h:7236. Update the header comment
from "leaves at most the added FX" to the new all-or-nothing contract.
kLegacyV3NominalRate removed. readZonesPayload, deserializePerformance, deserializeComponentState now take a projectRate for v3 frames→seconds. Rate fields default 0 (invalid). Four 44100 fallbacks replaced with assert+safe-return. 96k v3-lift test added.