Only override the loop mode if unset
This commit is contained in:
parent
1cf5e8d571
commit
66bdaafbe7
4 changed files with 27 additions and 7 deletions
|
|
@ -349,11 +349,9 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
|
||||||
break;
|
break;
|
||||||
case hash("release"):
|
case hash("release"):
|
||||||
trigger = SfzTrigger::release;
|
trigger = SfzTrigger::release;
|
||||||
loopMode = SfzLoopMode::one_shot;
|
|
||||||
break;
|
break;
|
||||||
case hash("release_key"):
|
case hash("release_key"):
|
||||||
trigger = SfzTrigger::release_key;
|
trigger = SfzTrigger::release_key;
|
||||||
loopMode = SfzLoopMode::one_shot;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DBG("Unknown trigger mode: " << opcode.value);
|
DBG("Unknown trigger mode: " << opcode.value);
|
||||||
|
|
|
||||||
|
|
@ -507,6 +507,9 @@ void sfz::Synth::finalizeSfzLoad()
|
||||||
region->loopMode = SfzLoopMode::loop_continuous;
|
region->loopMode = SfzLoopMode::loop_continuous;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (region->isRelease() && !region->loopMode)
|
||||||
|
region->loopMode = SfzLoopMode::one_shot;
|
||||||
|
|
||||||
if (region->loopRange.getEnd() == Default::loopRange.getEnd())
|
if (region->loopRange.getEnd() == Default::loopRange.getEnd())
|
||||||
region->loopRange.setEnd(region->sampleEnd);
|
region->loopRange.setEnd(region->sampleEnd);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -575,6 +575,28 @@ TEST_CASE("[Files] Looped regions can start at 0")
|
||||||
REQUIRE( synth.getRegionView(0)->loopRange == Range<uint32_t> { 0, synth.getRegionView(0)->sampleEnd } );
|
REQUIRE( synth.getRegionView(0)->loopRange == Range<uint32_t> { 0, synth.getRegionView(0)->sampleEnd } );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Synth] Release triggers automatically sets the loop mode")
|
||||||
|
{
|
||||||
|
sfz::Synth synth;
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/triggers_setting_loops.sfz", R"(
|
||||||
|
<region> sample=kick.wav pitch_keycenter=69 loop_mode=loop_sustain trigger=release
|
||||||
|
<region> sample=kick.wav pitch_keycenter=69 loop_mode=loop_sustain trigger=release_key
|
||||||
|
<region> sample=kick.wav pitch_keycenter=69 trigger=release loop_mode=loop_sustain
|
||||||
|
<region> sample=kick.wav pitch_keycenter=69 trigger=release_key loop_mode=loop_sustain
|
||||||
|
<region> sample=looped_flute.wav pitch_keycenter=69 trigger=release_key
|
||||||
|
<region> sample=kick.wav pitch_keycenter=69 trigger=release_key // These are normal and set to one_shot
|
||||||
|
<region> sample=kick.wav pitch_keycenter=69 trigger=release
|
||||||
|
)");
|
||||||
|
REQUIRE( synth.getNumRegions() == 7 );
|
||||||
|
REQUIRE( synth.getRegionView(0)->loopMode == SfzLoopMode::loop_sustain );
|
||||||
|
REQUIRE( synth.getRegionView(1)->loopMode == SfzLoopMode::loop_sustain );
|
||||||
|
REQUIRE( synth.getRegionView(2)->loopMode == SfzLoopMode::loop_sustain );
|
||||||
|
REQUIRE( synth.getRegionView(3)->loopMode == SfzLoopMode::loop_sustain );
|
||||||
|
REQUIRE( synth.getRegionView(4)->loopMode == SfzLoopMode::loop_continuous );
|
||||||
|
REQUIRE( synth.getRegionView(5)->loopMode == SfzLoopMode::one_shot );
|
||||||
|
REQUIRE( synth.getRegionView(6)->loopMode == SfzLoopMode::one_shot );
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("[Files] Case sentitiveness")
|
TEST_CASE("[Files] Case sentitiveness")
|
||||||
{
|
{
|
||||||
const fs::path sfzFilePath = fs::current_path() / "tests/TestFiles/case_insensitive.sfz";
|
const fs::path sfzFilePath = fs::current_path() / "tests/TestFiles/case_insensitive.sfz";
|
||||||
|
|
|
||||||
|
|
@ -497,15 +497,12 @@ TEST_CASE("[Region] Parsing opcodes")
|
||||||
REQUIRE(region.trigger == SfzTrigger::attack);
|
REQUIRE(region.trigger == SfzTrigger::attack);
|
||||||
region.parseOpcode({ "trigger", "release" });
|
region.parseOpcode({ "trigger", "release" });
|
||||||
REQUIRE(region.trigger == SfzTrigger::release);
|
REQUIRE(region.trigger == SfzTrigger::release);
|
||||||
REQUIRE(region.loopMode == SfzLoopMode::one_shot);
|
region.parseOpcode({ "trigger", "release_key" });
|
||||||
|
REQUIRE(region.trigger == SfzTrigger::release_key);
|
||||||
region.parseOpcode({ "trigger", "first" });
|
region.parseOpcode({ "trigger", "first" });
|
||||||
REQUIRE(region.trigger == SfzTrigger::first);
|
REQUIRE(region.trigger == SfzTrigger::first);
|
||||||
region.parseOpcode({ "trigger", "legato" });
|
region.parseOpcode({ "trigger", "legato" });
|
||||||
REQUIRE(region.trigger == SfzTrigger::legato);
|
REQUIRE(region.trigger == SfzTrigger::legato);
|
||||||
region.parseOpcode({ "loop_mode", "no_loop" });
|
|
||||||
region.parseOpcode({ "trigger", "release_key" });
|
|
||||||
REQUIRE(region.trigger == SfzTrigger::release_key);
|
|
||||||
REQUIRE(region.loopMode == SfzLoopMode::one_shot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("on_locc, on_hicc")
|
SECTION("on_locc, on_hicc")
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue