diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index ec07ad48..230a18a8 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -1484,6 +1484,9 @@ bool sfz::Region::registerNoteOn(int noteNumber, float velocity, float randValue if (!triggerOnNote) return false; + if (velocityOverride == VelocityOverride::previous) + velocity = midiState.getLastVelocity(); + const bool velOk = velocityRange.containsWithEnd(velocity); const bool randOk = randRange.contains(randValue) || (randValue == 1.0f && randRange.getEnd() == 1.0f); const bool firstLegatoNote = (trigger == Trigger::first && midiState.getActiveNotes() == 1); diff --git a/tests/RegionTriggersT.cpp b/tests/RegionTriggersT.cpp index fa8b5f59..6817acb5 100644 --- a/tests/RegionTriggersT.cpp +++ b/tests/RegionTriggersT.cpp @@ -301,3 +301,42 @@ TEST_CASE("[Triggers] sw_vel, with a note in between and sw_previous") }; REQUIRE(messageList == expected); } + +TEST_CASE("[Triggers] sw_vel, consider the previous velocity for triggers") +{ + Synth synth; + std::vector messageList; + Client client(&messageList); + client.setReceiveCallback(&simpleMessageReceiver); + synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_vel.sfz", R"( + key=60 sample=kick.wav + key=62 sw_previous=60 sw_vel=previous sample=snare.wav lovel=63 + )"); + + SECTION("Should trigger") { + synth.noteOn(0, 60, 127); + synth.noteOn(10, 62, 10); + synth.dispatchMessage(client, 0, "/num_active_voices", "", nullptr); + synth.dispatchMessage(client, 0, "/voice0/trigger_value", "", nullptr); + synth.dispatchMessage(client, 0, "/voice1/trigger_value", "", nullptr); + std::vector expected { + "/num_active_voices,i : { 2 }", + "/voice0/trigger_value,f : { 1 }", + "/voice1/trigger_value,f : { 1 }", + }; + REQUIRE(messageList == expected); + } + + SECTION("Should not trigger") { + synth.noteOn(0, 60, 10); + synth.noteOn(10, 62, 127); + synth.dispatchMessage(client, 0, "/num_active_voices", "", nullptr); + synth.dispatchMessage(client, 0, "/voice0/trigger_value", "", nullptr); + synth.dispatchMessage(client, 0, "/voice1/trigger_value", "", nullptr); + std::vector expected { + "/num_active_voices,i : { 1 }", + "/voice0/trigger_value,f : { 0.0787402 }", + }; + REQUIRE(messageList == expected); + } +}