Merge pull request #917 from praashie/develop

Fix group cutting behavior with CC triggered samples (such as sustain pedals)
This commit is contained in:
Paul Ferrand 2021-06-23 08:17:20 +02:00 committed by GitHub
commit 3d6987d47c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 1 deletions

View file

@ -1655,7 +1655,8 @@ bool Voice::checkOffGroup(const Region* other, int delay, int noteNumber) noexce
if (impl.released())
return false;
if (impl.triggerEvent_.type == TriggerEventType::NoteOn
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)) {
off(delay);

View file

@ -1693,6 +1693,23 @@ TEST_CASE("[Synth] Off by a CC event")
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine" });
}
TEST_CASE("[Synth] CC triggered off by a CC event")
{
sfz::Synth synth;
sfz::AudioBuffer<float> buffer { 2, static_cast<unsigned>(synth.getSamplesPerBlock()) };
synth.loadSfzString(fs::current_path(), R"(
<region> group=1 off_by=2 sample=*saw hikey=-1 on_locc64=126 on_hicc64=127
<region> group=2 sample=*triangle hikey=-1 on_locc64=0 on_hicc64=1
)");
synth.cc(0, 64, 127);
synth.renderBlock(buffer);
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*saw" });
synth.cc(0, 64, 0);
synth.renderBlock(buffer);
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*triangle" });
}
TEST_CASE("[Synth] Off by a note-off event")
{
sfz::Synth synth;