L7: capture-order slot model, card metadata overlay, tertiary-border selection

Add gap-preserving per-bank SlotMap (reorder + Alt-replace mutators, JSON
round-trip, insertion-order migration) to bank_book; stamp captureTimeSig on
Sample; pure card_meta formatters + card_drag gesture/slot module; card
metadata overlay + purple selection border in the panel. Shell drop/cursor
wiring deferred. Fixes: removeSample syncs SlotMap; card_drag gap-probe coordinate.
This commit is contained in:
2026-07-27 01:49:07 -04:00
parent 7dc77e51b5
commit fdb9e38ad6
20 changed files with 1495 additions and 21 deletions
+7
View File
@@ -33,6 +33,8 @@ static Sample fullSample(const std::string& seed) {
s.lengthSeconds = 3.141592653589793;
s.lengthBeats = 4.0;
s.captureTempo = 128.5;
s.captureTimeSigNum = 6; // L7 F1 meter stamp (non-4/4 to prove it round-trips)
s.captureTimeSigDenom = 8;
s.key = "F#m";
s.levels = {-0.3, -12.7, -14.2};
s.clipped = true;
@@ -77,6 +79,11 @@ static void testFullFieldRoundTrip() {
if (back) {
const Sample* full = back->query("id-a");
CHECK(full && full->key.has_value() && *full->key == "F#m");
// L7 F1 meter stamp survived exactly.
CHECK(full && full->captureTimeSigNum == 6 && full->captureTimeSigDenom == 8);
// The minimal sample never stamped a meter -> 0/0 (the unstamped default).
const Sample* minMeter = back->query("min-b");
CHECK(minMeter && minMeter->captureTimeSigNum == 0 && minMeter->captureTimeSigDenom == 0);
CHECK(full && full->provenance.has_value());
CHECK(full && full->provenance->fxChainSnapshot == "<FXCHAIN\n BYPASS 0 0 0\n>");