Merge pull request #379 from paulfd/release-loop-mode
Set loop_mode to one_shot for release regions
This commit is contained in:
commit
66705f54c3
3 changed files with 27 additions and 0 deletions
|
|
@ -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,6 +497,8 @@ 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);
|
||||||
|
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" });
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue