From 9855a23903c360ac269c7aced7ccba78ca9335c1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 2 Jan 2026 17:32:48 -0700 Subject: [PATCH] MIDI triggers: make sure velocity scaling is not cumulative (see comments) --- libs/ardour/triggerbox.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index bf95500cb1..297f758ee1 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -3386,8 +3386,16 @@ MIDITrigger::midi_run (BufferSet& bufs, samplepos_t start_sample, samplepos_t en assert (buffer_samples >= 0); Evoral::Event ev (Evoral::MIDI_EVENT, buffer_samples, evsize, const_cast(buf), false); + uint8_t old_gain = 0xff; if (_gain != 1.0f && ev.is_note()) { + /* We must save and restore the event gain + value because we're modifying it in place, + not in a copy of the event. If we don't do + this then each subsequent call to + scale_velocity() moves it closer to 0 or 127 + */ + old_gain = ev.velocity (); ev.scale_velocity (_gain); } @@ -3419,6 +3427,10 @@ MIDITrigger::midi_run (BufferSet& bufs, samplepos_t start_sample, samplepos_t en DEBUG_TRACE (DEBUG::Triggers, string_compose ("given et %1 TS %7 rs %8 ts %2 bs %3 ss %4 do %5, inserting %6\n", maybe_last_event_timeline_beats, timeline_samples, buffer_samples, start_sample, dest_offset, ev, transition_beats, region_start)); mb->insert_event (ev); + + if (old_gain != 0xff) { + ev.set_velocity (old_gain); + } } _box.tracker->track (buf);