Report the instrument's automatable parameters to the host under a frozen id table, in signal-flow order, with real units

42 of 44 ids issued: pitch key-track and Trigger length stay reserved
pending a live path. Master gain reclassified Live — it never reloaded.
This commit is contained in:
2026-08-02 15:14:16 -04:00
parent c7afa3a80f
commit bfaa0f2614
38 changed files with 1742 additions and 218 deletions
+8 -3
View File
@@ -85,6 +85,13 @@ void ReaSamplerEditor::onMouseUp(int x, int y) {
invalidate();
}
if (drag_ == DragKind::kNone) return;
// Stack RAII rather than a call at each exit: this handler leaves through several early
// returns, and the release commit's final performEdit must land INSIDE the bracket the grab
// opened while the bracket itself may not outlive the handler on any path.
struct GestureClose {
ReaSamplerProcessor* p;
~GestureClose() { if (p) p->endParamGesture(); }
} gestureClose{processor_};
const DragKind kind = drag_;
const int paramId = dragParamId_;
const int curveIdx = curvePointIndex_;
@@ -107,9 +114,7 @@ void ReaSamplerEditor::onMouseUp(int x, int y) {
// directly. Voice count: the label/needle tracks live during the drag but the engine
// rebuild (setVoiceCount) fires ONCE here on release — not per integer step.
const bool deckTransient =
kind == DragKind::kDeckKnob &&
(paramId == -2 || paramId == static_cast<int>(ParamControl::kVoiceCount) ||
paramId == static_cast<int>(ParamControl::kMasterGain));
kind == DragKind::kDeckKnob && deckKnobIsProcessorSide(paramId);
if (kind == DragKind::kScrollThumb || deckTransient) {
// Commit the voice count now that the drag is complete (one rebuild per full drag).
if (deckTransient && processor_ &&