Add opcode: loop_crossfade

This commit is contained in:
Jean Pierre Cimalando 2020-09-29 23:52:10 +02:00
parent 7933bcec8d
commit f6d05509cb
4 changed files with 14 additions and 0 deletions

View file

@ -54,6 +54,8 @@ namespace Default
constexpr Range<uint32_t> sampleCountRange { 0, std::numeric_limits<uint32_t>::max() };
constexpr SfzLoopMode loopMode { SfzLoopMode::no_loop };
constexpr Range<uint32_t> loopRange { 0, std::numeric_limits<uint32_t>::max() };
constexpr float loopCrossfade { 1e-3 };
constexpr Range<float> loopCrossfadeRange { loopCrossfade, 1.0 };
// common defaults
constexpr Range<uint8_t> midi7Range { 0, 127 };

View file

@ -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"):

View file

@ -319,6 +319,7 @@ struct Region {
absl::optional<uint32_t> sampleCount {}; // count
absl::optional<SfzLoopMode> loopMode {}; // loopmode
Range<uint32_t> loopRange { Default::loopRange }; //loopstart and loopend
float loopCrossfade { Default::loopCrossfade }; // loop_crossfade
// Wavetable oscillator
float oscillatorPhase { Default::oscillatorPhase };

View file

@ -174,6 +174,14 @@ TEST_CASE("[Region] Parsing opcodes")
REQUIRE(region.loopRange == Range<uint32_t>(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);