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;
|
||||
case hash("release"):
|
||||
trigger = SfzTrigger::release;
|
||||
loopMode = SfzLoopMode::one_shot;
|
||||
break;
|
||||
case hash("release_key"):
|
||||
trigger = SfzTrigger::release_key;
|
||||
loopMode = SfzLoopMode::one_shot;
|
||||
break;
|
||||
default:
|
||||
DBG("Unknown trigger mode: " << opcode.value);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 } );
|
||||
}
|
||||
|
||||
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")
|
||||
{
|
||||
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);
|
||||
region.parseOpcode({ "trigger", "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" });
|
||||
REQUIRE(region.trigger == SfzTrigger::first);
|
||||
region.parseOpcode({ "trigger", "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")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue