Widen the deck row block to 1028 so the filter tie-line is exact, and accumulate the meter's block peaks instead of sampling one in 47

This commit is contained in:
2026-08-02 08:27:05 -04:00
parent 0627398bbb
commit df10ddacc2
29 changed files with 552 additions and 250 deletions
+11 -16
View File
@@ -13,7 +13,7 @@
#include "core/instrument/engine/filter/filter_morph.h" // MorphLaw (the law toggle's state)
#include "core/instrument/ui/knob_deck.h" // deck layout + kDeckKnobSize
#include "core/instrument/ui/master_meter.h" // the bus meter's column interior + ballistics
#include "core/instrument/ui/waveform_view.h" // waveformSurface (THE lane-split fold)
#include "core/instrument/ui/waveform_view.h" // resolveLaneSplit (THE lane-split fold)
#include "shell/instrument/editor_internal.h" // kit adapters + knob face
#include "shell/instrument/reasampler_processor.h"
@@ -52,12 +52,11 @@ void paintMeterColumn(LICE_IBitmap* bmp, const Rect& column, const MasterMeterUi
db -= static_cast<int>(kMeterTickStepDb)) {
const int y = meterDbToY(m.field, db);
const bool zero = (db == 0);
const bool numeralled = zero || (db % 12 == 0);
LICE_FillRect(bmp, m.field.x, y, m.field.width, zero ? 2 : 1,
zero ? toLice(roleColor(Role::TextDim)) : hairline, 1.0f, 0);
if (numeralled) {
kitText(bmp, Rect::ltrb(m.labels.x, y - 5, m.labels.right(), y + 5),
tickLabel(db).c_str(), Font::Micro, Role::TextDim, Align::Right);
if (meterTickNumeralled(db)) {
kitText(bmp, meterNumeralRect(m.labels, y), tickLabel(db).c_str(), Font::Micro,
Role::TextDim, Align::Right);
}
}
@@ -78,9 +77,7 @@ void paintMeterColumn(LICE_IBitmap* bmp, const Rect& column, const MasterMeterUi
}
};
if (split == LaneSplit::Single) {
const instrument::engine::MeterState& loudest =
state.left.levelDb >= state.right.levelDb ? state.left : state.right;
drawBar(m.barA, loudest);
drawBar(m.barA, meterSingleLaneState(state));
} else {
drawBar(m.barA, state.left);
drawBar(m.barB, state.right);
@@ -102,14 +99,12 @@ void ReaSamplerEditor::paintDeck(LICE_IBitmap* bmp, const FaceLayout& fl) {
const PlaySeconds& play = params_.play;
const bool isMono = (voiceMode_ == VoiceMode::Mono);
const LICE_pixel hairline = toLice(roleColor(Role::LineHairline));
// The meter's bar count is the SAME resolved decision the waveform's lane split is — read
// off waveformSurface rather than re-derived, so it can never become a second rule.
const LaneSplit meterSplit =
waveformSurface(fl.bands.waveform, channelMode_ == ChannelMode::Stereo,
channelPcmFor(selectedId_).channelCount)
.laneCount == 2
? LaneSplit::Stereo
: LaneSplit::Single;
// The meter's bar count is the SAME resolved decision the waveform's lane split is —
// resolveLaneSplit is the one home of it. Asked directly rather than read back off
// waveformSurface, whose laneCount additionally folds in the waveform BAND's pixel height,
// which decides nothing about how many channels the bus is carrying.
const LaneSplit meterSplit = resolveLaneSplit(channelMode_ == ChannelMode::Stereo,
channelPcmFor(selectedId_).channelCount);
// One compact-toggle draw (the Mono/Stereo segment grammar at Micro scale). Disabled
// segments draw inert so the dependency (Retrig|Legato needs Mono) reads at a glance.