Decouple the instrument reload from VST3 activation, and make the master meter's accumulate exact

This commit is contained in:
2026-08-02 12:41:57 -04:00
parent 4b0b03d8d5
commit 5c6525fb91
17 changed files with 462 additions and 239 deletions
+7 -3
View File
@@ -37,11 +37,14 @@ std::string tickLabel(int db) {
}
// The MASTER column: dB scale in the label gutter, one or two bars, the held peak tick, and
// the latched clip cap. `split` is waveformSurface's own lane decision — see master_meter.h.
// the latched clip cap. `split` is the RESOLVED lane decision — see master_meter.h.
void paintMeterColumn(LICE_IBitmap* bmp, const Rect& column, const MasterMeterUi& state,
LaneSplit split) {
if (column.width <= 0 || column.height <= 0) return;
const MeterRects m = meterRects(column, split);
// A column narrower than the interior needs yields all-empty rects, which under rect.h's
// contract means suppressed — not a zero-height field to fill, tick twelve times and cap.
if (m.field.empty()) return;
fillSurface(bmp, toKitBox(m.field), Role::BgCell, InteractionState::Rest);
// Scale: a rule every 6 dB, numeralled every 12 with 0 dB heavier — the reference the
@@ -60,8 +63,9 @@ void paintMeterColumn(LICE_IBitmap* bmp, const Rect& column, const MasterMeterUi
}
}
// The bars. A single-lane surface shows ONE bar off the louder channel: the two are the
// same signal there (dual-mono), so two bars would be a duplicate rather than a reading.
// The bars. A single-lane surface shows ONE bar folding both channels per field
// (meterSingleLaneState) — the two are the same signal there (dual-mono), so two bars would
// be a duplicate rather than a reading.
const LICE_pixel barInk = toLice(roleColor(Role::AccentPrimary));
const LICE_pixel holdInk = toLice(roleColor(Role::TextPrimary));
const auto drawBar = [&](const Rect& bar, const instrument::engine::MeterState& ch) {