Merge Γ-W1-T4: the editor floor, the width budget, and the deck row law

This commit is contained in:
2026-08-01 21:32:52 -04:00
8 changed files with 263 additions and 47 deletions
+23
View File
@@ -130,6 +130,29 @@ std::vector<DeckGroupDesc> sampleDeckGroups(PlayMode playMode) {
return out;
}
DeckRow deckRowFor(DeckGroupId group) {
// Every enumerator listed and no default, on the same gate isLiveDeckParam below relies on.
switch (group) {
case kGroupPitch:
case kGroupFilter:
case kGroupVelocity:
case kGroupVoice:
return DeckRow::Sound;
case kGroupPitchEnv:
case kGroupFilterEnv:
case kGroupAmpEnv:
return DeckRow::Contour;
case kGroupMaster:
return DeckRow::Spanning;
}
// Unreachable for a valid enumerator, and Spanning rather than Sound ON PURPOSE: the
// -Wswitch gate is compiler-dependent, so on a toolchain that does not raise it a dropped
// case arm falls here instead. Sound is what a new group most plausibly IS, which would
// make the fall-through invisible; Spanning is the one row nothing may silently join, so
// the tests' partition count catches it.
return DeckRow::Spanning;
}
CurveTarget curveTargetFor(int controlId) {
switch (static_cast<DeckParam>(controlId)) {
case DeckParam::kAmpVelCurve: return CurveTarget::kAmp;