Reflow the deck into two categorical rows plus a double-height MASTER bus deck
Row membership is now the group's own property, not a wrap outcome. FILTER's Band|Notch moves to its caption slack, which is what makes the sound row fit. MASTER gains the limiter toggle, the output meter and the GR lamp.
This commit is contained in:
@@ -11,9 +11,14 @@ int id(DeckParam p) { return static_cast<int>(p); }
|
||||
double clamp(double v, double lo, double hi) { return v < lo ? lo : (v > hi ? hi : v); }
|
||||
|
||||
// Segment width of the three Staged|Spline toggles. Sized so each env group's caption row stays
|
||||
// no wider than its knob row — the ceiling is PITCH ENV's, whose caption row lands exactly on
|
||||
// its four-cell knob row at 23. Raising it reflows the deck's first row.
|
||||
// no wider than its knob row; the binding group is PITCH ENV, which reaches its four-cell knob
|
||||
// row at 47 (AMP, the next tightest, at 55). Well inside the ceiling — raising it would widen
|
||||
// the CONTOUR row, which has 144px of slack, not the SOUND row.
|
||||
constexpr int kEnvModeSegW = 23;
|
||||
|
||||
// The output meter's column, right of MASTER's cell slots. 62 + the 60px cell + the gap + the
|
||||
// group's own padding is exactly kDeckSpanningW.
|
||||
constexpr int kMasterMeterW = 62;
|
||||
} // namespace
|
||||
|
||||
double deckBipolarFromNorm(double norm) { return clamp(norm, 0.0, 1.0) * 2.0 - 1.0; }
|
||||
@@ -63,7 +68,9 @@ std::vector<DeckGroupDesc> sampleDeckGroups(PlayMode playMode) {
|
||||
id(DeckParam::kFilterModAmt),
|
||||
id(DeckParam::kFilterVel),
|
||||
id(DeckParam::kFilterKeyTrack)};
|
||||
filter.rowToggle = {id(DeckParam::kFilterLaw), 44};
|
||||
// The morph law rides the caption slack. Moving it back to the knob row costs the
|
||||
// group 92px and the SOUND row stops fitting its block.
|
||||
filter.captionToggle2 = {id(DeckParam::kFilterLaw), 44};
|
||||
out.push_back(std::move(filter));
|
||||
}
|
||||
{
|
||||
@@ -126,12 +133,19 @@ std::vector<DeckGroupDesc> sampleDeckGroups(PlayMode playMode) {
|
||||
out.push_back(std::move(voice));
|
||||
}
|
||||
{
|
||||
// The lower slot is reserved and draws NOTHING: blank reads as breathing room where a
|
||||
// dashed placeholder would read as unfinished. It is one cell, not two — a second
|
||||
// would spend 60 of the layout's whole 90px budget on a control nobody has named.
|
||||
DeckGroupDesc master;
|
||||
master.id = kGroupMaster;
|
||||
master.captionWidth = 46;
|
||||
master.cellIds = {id(DeckParam::kMasterGain)};
|
||||
master.captionRadio = {id(DeckParam::kMasterGr), /*passive=*/true};
|
||||
master.captionToggle = {id(DeckParam::kLimiterEnable), 32};
|
||||
master.cellIds = {id(DeckParam::kMasterGain), -1};
|
||||
master.column = {id(DeckParam::kMasterMeter), kMasterMeterW};
|
||||
out.push_back(std::move(master));
|
||||
}
|
||||
for (DeckGroupDesc& d : out) d.row = deckRowFor(static_cast<DeckGroupId>(d.id));
|
||||
return out;
|
||||
}
|
||||
|
||||
@@ -257,6 +271,11 @@ LiveCommit deckParamCommit(DeckParam id) {
|
||||
case DeckParam::kVoiceMode:
|
||||
case DeckParam::kMonoTrigger:
|
||||
case DeckParam::kMasterGain:
|
||||
case DeckParam::kLimiterEnable:
|
||||
// MASTER's two readouts reach no parameter at all — the same footing as the overlay
|
||||
// radios above.
|
||||
case DeckParam::kMasterMeter:
|
||||
case DeckParam::kMasterGr:
|
||||
case DeckParam::kCount: // not a control
|
||||
return LiveCommit::Reload;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user