diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 540b6944..bf4c4ae6 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -54,6 +54,8 @@ namespace Default constexpr Range sampleCountRange { 0, std::numeric_limits::max() }; constexpr SfzLoopMode loopMode { SfzLoopMode::no_loop }; constexpr Range loopRange { 0, std::numeric_limits::max() }; + constexpr float loopCrossfade { 1e-3 }; + constexpr Range loopCrossfadeRange { loopCrossfade, 1.0 }; // common defaults constexpr Range midi7Range { 0, 127 }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 2e9a1de5..8c85cca1 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -138,6 +138,9 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) case hash("loop_start"): // also loopstart setRangeStartFromOpcode(opcode, loopRange, Default::loopRange); break; + case hash("loop_crossfade"): + setValueFromOpcode(opcode, loopCrossfade, Default::loopCrossfadeRange); + break; // Wavetable oscillator case hash("oscillator_phase"): diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 76840c53..a8144d52 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -319,6 +319,7 @@ struct Region { absl::optional sampleCount {}; // count absl::optional loopMode {}; // loopmode Range loopRange { Default::loopRange }; //loopstart and loopend + float loopCrossfade { Default::loopCrossfade }; // loop_crossfade // Wavetable oscillator float oscillatorPhase { Default::oscillatorPhase }; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 77aff25a..550da46f 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -174,6 +174,14 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.loopRange == Range(0, 4294967295)); } + SECTION("loop_crossfade") + { + region.parseOpcode({ "loop_crossfade", "0.5" }); + REQUIRE(region.loopCrossfade == Approx(0.5f)); + region.parseOpcode({ "loop_crossfade", "0" }); + REQUIRE(region.loopCrossfade > 0); + } + SECTION("group") { REQUIRE(region.group == 0);