sw_default with sw_lolast and sw_hilast

This commit is contained in:
Paul Ferrand 2020-10-27 15:11:51 +01:00
parent 5ea4b876df
commit 74a676b493
2 changed files with 23 additions and 3 deletions

View file

@ -628,6 +628,17 @@ void sfz::Synth::finalizeSfzLoad()
insertPairUniquely(keyswitchLabels, *region->lastKeyswitch, *region->keyswitchLabel);
}
if (region->lastKeyswitchRange) {
auto& range = *region->lastKeyswitchRange;
if (currentSwitch)
region->keySwitched = range.containsWithEnd(*currentSwitch);
if (region->keyswitchLabel) {
for (uint8_t note = range.getStart(), end = range.getEnd(); note <= end; note++)
insertPairUniquely(keyswitchLabels, note, *region->keyswitchLabel);
}
}
// Some regions had group number but no "group-level" opcodes handled the polyphony
while (polyphonyGroups.size() <= region->group) {
polyphonyGroups.emplace_back();
@ -1176,7 +1187,6 @@ void sfz::Synth::noteOnDispatch(int delay, int noteNumber, float velocity) noexc
region->keySwitched = true;
for (auto& region : noteActivationLists[noteNumber]) {
if (region->registerNoteOn(noteNumber, velocity, randValue)) {
for (auto& voice : voices) {
if (voice->checkOffGroup(region, delay, noteNumber)) {

View file

@ -427,7 +427,6 @@ TEST_CASE("[Keyswitches] sw_previous out of range")
TEST_CASE("[Keyswitches] sw_lolast and sw_hilast")
{
// The behavior is the same in this case, regardless of the keyrange
sfz::Synth synth;
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
<region> sw_lolast=57 sw_hilast=59 key=70 sample=*saw
@ -460,7 +459,6 @@ TEST_CASE("[Keyswitches] sw_lolast and sw_hilast")
TEST_CASE("[Keyswitches] sw_lolast and sw_hilast with sw_last")
{
// The behavior is the same in this case, regardless of the keyrange
sfz::Synth synth;
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
<region> sw_last=40 sw_lolast=57 sw_hilast=59 key=70 sample=*saw
@ -487,3 +485,15 @@ TEST_CASE("[Keyswitches] sw_lolast and sw_hilast with sw_last")
REQUIRE(!synth.getRegionView(0)->isSwitchedOn());
REQUIRE(synth.getRegionView(1)->isSwitchedOn());
}
TEST_CASE("[Keyswitches] sw_lolast and sw_hilast with sw_default")
{
sfz::Synth synth;
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
<global> sw_default=58
<region> sw_lolast=57 sw_hilast=59 key=70 sample=*saw
<region> sw_lolast=60 sw_hilast=62 key=72 sample=*sine
)");
REQUIRE(synth.getRegionView(0)->isSwitchedOn());
REQUIRE(!synth.getRegionView(1)->isSwitchedOn());
}