From f189292a6043c68df651e178b307ab38436ee45c Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sun, 4 Apr 2021 21:54:19 +0200 Subject: [PATCH] CC events can also off notes Same as note-on events --- src/sfizz/Synth.cpp | 6 ++++++ src/sfizz/Voice.cpp | 2 +- tests/SynthT.cpp | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 15395563..7b5a7369 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -1215,6 +1215,12 @@ void Synth::Impl::ccDispatch(int delay, int ccNumber, float value) noexcept } if (layer->registerCC(ccNumber, value)) { + for (auto& voice : voiceManager_) { + if (voice.checkOffGroup(®ion, delay, ccNumber)) { + const TriggerEvent& event = voice.getTriggerEvent(); + noteOffDispatch(delay, event.number, event.value); + } + } startVoice(layer, delay, triggerEvent, ring); } } diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index de92d4c6..836f1075 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -1572,7 +1572,7 @@ bool Voice::checkOffGroup(const Region* other, int delay, int noteNumber) noexce return false; if (impl.triggerEvent_.type == TriggerEventType::NoteOn - && region->offBy == other->group + && region->offBy && *region->offBy == other->group && (region->group != other->group || noteNumber != impl.triggerEvent_.number)) { off(delay); return true; diff --git a/tests/SynthT.cpp b/tests/SynthT.cpp index 8db5b06c..538fd606 100644 --- a/tests/SynthT.cpp +++ b/tests/SynthT.cpp @@ -1609,6 +1609,23 @@ TEST_CASE("[Synth] Off by with CC switches") REQUIRE( getPlayingVoices(synth).front()->getRegion()->sampleId->filename() == "*saw" ); } +TEST_CASE("[Synth] Off by a CC event") +{ + sfz::Synth synth; + sfz::AudioBuffer buffer { 2, static_cast(synth.getSamplesPerBlock()) }; + + synth.loadSfzString(fs::current_path(), R"( + group=1 off_by=2 sample=*saw + group=2 hikey=-1 on_locc67=127 on_hicc67=127 sample=*sine + )"); + synth.noteOn(0, 60, 85); + synth.renderBlock(buffer); + REQUIRE( numPlayingVoices(synth) == 1 ); + synth.cc(10, 67, 127); + synth.renderBlock(buffer); + REQUIRE( numPlayingVoices(synth) == 1 ); +} + TEST_CASE("[Synth] Initial values of CC") { sfz::Synth synth;