fix(bridge): stop leaves sound looping — EventList maxSize=50 drops STOP sweep note-offs

Root cause: Steinberg EventList defaults to maxSize=50 events. The STOP
all-notes-off sweep queues 128 note-offs per channel (16ch x 128 pitch),
so addEvent beyond 50 fails silently and the plugin never receives the
remaining note-offs — voices keep sustaining and the transport loops
forever until the bridge process is killed.

Fix: raise eventList.setMaxSize(4096) in loadPlugin. Also assign unique
noteIds per overlapping note-on (stack per pitch) so note-off releases
every voice at that pitch, and log addEvent result + channel in debug
output for verification.
This commit is contained in:
2026-08-14 09:45:50 +07:00
parent 29f7fecb35
commit f7f20e3a0a
3 changed files with 76 additions and 21 deletions
+2
View File
@@ -28,6 +28,7 @@ public:
bool reloadForGUI() override;
bool attachView(void* parentWindowHandle) override;
void closeGUI() override;
void setChannel(uint32_t ch) { channel_ = ch; }
bool needsReload() const override { return hasAttachedOnce_ && !guiAttached_; }
void setReloading(bool on) override { reloading_ = on; }
void processAudioBlock(float* outputL, float* outputR, uint32_t numSamples) override;
@@ -42,6 +43,7 @@ private:
bool guiAttached_;
bool hasAttachedOnce_;
bool reloading_; // guarded by InstrumentEngineManager::mu_ (set via setReloading)
uint32_t channel_ = 0;
bool reload();
};