diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 0ce7d527..5a0b6103 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -507,6 +507,9 @@ void sfz::Synth::finalizeSfzLoad() region->loopMode = SfzLoopMode::loop_continuous; } + if (region->isRelease() && !region->loopMode) + region->loopMode = SfzLoopMode::one_shot; + if (region->loopRange.getEnd() == Default::loopRange.getEnd()) region->loopRange.setEnd(region->sampleEnd); diff --git a/tests/FilesT.cpp b/tests/FilesT.cpp index f92f496c..6c0c6507 100644 --- a/tests/FilesT.cpp +++ b/tests/FilesT.cpp @@ -575,6 +575,28 @@ TEST_CASE("[Files] Looped regions can start at 0") REQUIRE( synth.getRegionView(0)->loopRange == Range { 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"( + sample=kick.wav pitch_keycenter=69 loop_mode=loop_sustain trigger=release + sample=kick.wav pitch_keycenter=69 loop_mode=loop_sustain trigger=release_key + sample=kick.wav pitch_keycenter=69 trigger=release loop_mode=loop_sustain + sample=kick.wav pitch_keycenter=69 trigger=release_key loop_mode=loop_sustain + sample=looped_flute.wav pitch_keycenter=69 trigger=release_key + sample=kick.wav pitch_keycenter=69 trigger=release_key // These are normal and set to one_shot + 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") { const fs::path sfzFilePath = fs::current_path() / "tests/TestFiles/case_insensitive.sfz"; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 9ea9b924..9e90b7db 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -497,6 +497,8 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.trigger == SfzTrigger::attack); region.parseOpcode({ "trigger", "release" }); REQUIRE(region.trigger == SfzTrigger::release); + region.parseOpcode({ "trigger", "release_key" }); + REQUIRE(region.trigger == SfzTrigger::release_key); region.parseOpcode({ "trigger", "first" }); REQUIRE(region.trigger == SfzTrigger::first); region.parseOpcode({ "trigger", "legato" });