Slightly looser masking condition

This commit is contained in:
Paul Ferrand 2020-08-09 23:29:28 +02:00
parent 9b11530331
commit a8c524b7e8
2 changed files with 19 additions and 1 deletions

View file

@ -930,7 +930,7 @@ void sfz::Synth::noteOnDispatch(int delay, int noteNumber, float velocity) noexc
notePolyphonyCounter += 1;
switch (region->selfMask) {
case SfzSelfMask::mask:
if (voice->getTriggerValue() < velocity) {
if (voice->getTriggerValue() <= velocity) {
if (!selfMaskCandidate || selfMaskCandidate->getTriggerValue() > voice->getTriggerValue())
selfMaskCandidate = voice.get();
}

View file

@ -224,3 +224,21 @@ TEST_CASE("[Polyphony] Not self-masking")
REQUIRE(synth.getVoiceView(2)->getTriggerValue() == 64_norm);
REQUIRE(!synth.getVoiceView(2)->releasedOrFree());
}
TEST_CASE("[Polyphony] Self-masking with the exact same velocity")
{
sfz::Synth synth;
synth.loadSfzString(fs::current_path(), R"(
<region> sample=*sine key=64 note_polyphony=2
)");
synth.noteOn(0, 64, 64);
synth.noteOn(0, 64, 63);
synth.noteOn(0, 64, 63);
REQUIRE(synth.getNumActiveVoices(true) == 3); // One of these is releasing
REQUIRE(synth.getVoiceView(0)->getTriggerValue() == 64_norm);
REQUIRE(!synth.getVoiceView(0)->releasedOrFree());
REQUIRE(synth.getVoiceView(1)->getTriggerValue() == 63_norm);
REQUIRE(synth.getVoiceView(1)->releasedOrFree()); // The first one is the masking candidate since they have the same velocity
REQUIRE(synth.getVoiceView(2)->getTriggerValue() == 63_norm);
REQUIRE(!synth.getVoiceView(2)->releasedOrFree());
}