From 7ae0b4b043470a0bc5e7bd04c4466cd915388571 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sat, 13 Nov 2021 01:16:30 +0100 Subject: [PATCH] Choke notes when the layer is disabled, even if the group and note are the same --- src/sfizz/Voice.cpp | 6 +++++- tests/PolyphonyT.cpp | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 23964557..27a93566 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -218,6 +218,7 @@ struct Voice::Impl const NumericId id_; StateListener* stateListener_ = nullptr; + const Layer* layer_ { nullptr }; const Region* region_ { nullptr }; State state_ { State::idle }; @@ -411,6 +412,7 @@ bool Voice::startVoice(Layer* layer, int delay, const TriggerEvent& event) noexc MidiState& midiState = resources.getMidiState(); CurveSet& curveSet = resources.getCurves(); + impl.layer_ = layer; const Region& region = layer->getRegion(); impl.region_ = ®ion; @@ -1663,6 +1665,7 @@ bool Voice::Impl::released() const noexcept bool Voice::checkOffGroup(const Region* other, int delay, int noteNumber) noexcept { Impl& impl = *impl_; + const Layer* layer = impl.layer_; const Region* region = impl.region_; if (region == nullptr || other == nullptr) return false; @@ -1673,7 +1676,7 @@ bool Voice::checkOffGroup(const Region* other, int delay, int noteNumber) noexce if ((impl.triggerEvent_.type == TriggerEventType::NoteOn || impl.triggerEvent_.type == TriggerEventType::CC) && region->offBy && *region->offBy == other->group - && (region->group != other->group || noteNumber != impl.triggerEvent_.number)) { + && (region->group != other->group || !layer->ccSwitched_.all() || noteNumber != impl.triggerEvent_.number)) { off(delay); return true; } @@ -1685,6 +1688,7 @@ void Voice::reset() noexcept { Impl& impl = *impl_; impl.switchState(State::idle); + impl.layer_ = nullptr; impl.region_ = nullptr; impl.currentPromise_.reset(); impl.sourcePosition_ = 0; diff --git a/tests/PolyphonyT.cpp b/tests/PolyphonyT.cpp index 50e8265a..76738d7d 100644 --- a/tests/PolyphonyT.cpp +++ b/tests/PolyphonyT.cpp @@ -570,3 +570,21 @@ TEST_CASE("[Polyphony] Choke long release tails with note_polyphony") REQUIRE( numPlayingVoices(synth) == 1 ); // Not released, attack phase REQUIRE( numActiveVoices(synth) == 1 ); } + +TEST_CASE("[Polyphony] Choke same group and note if the region is switched off (e.g. by a CC switch)") +{ + sfz::Synth synth; + sfz::AudioBuffer buffer { 2, static_cast(synth.getSamplesPerBlock()) }; + synth.loadSfzString(fs::current_path() / "tests/TestFiles/polyphony.sfz", R"( + group=1 off_by=1 + locc1=0 hicc1=63 sample=*saw + locc1=64 hicc1=127 sample=*sine + )"); + synth.noteOn(0, 60, 63 ); + synth.renderBlock(buffer); + REQUIRE( playingSamples(synth) == std::vector { "*saw" } ); + synth.cc(0, 1, 127); + synth.noteOn(0, 60, 63 ); + synth.renderBlock(buffer); + REQUIRE( playingSamples(synth) == std::vector { "*sine" } ); +}