diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index cc0ac0b3..18ec3df8 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -31,7 +31,7 @@ enum class SfzTrigger { attack, release, release_key, first, legato }; enum class SfzLoopMode { no_loop, one_shot, loop_continuous, loop_sustain }; -enum class SfzOffMode { fast, normal }; +enum class SfzOffMode { fast, normal, time }; enum class SfzVelocityOverride { current, previous }; enum class SfzCrossfadeCurve { gain, power }; enum class SfzSelfMask { mask, dontMask }; @@ -75,6 +75,7 @@ namespace Default constexpr uint32_t group { 0 }; constexpr Range groupRange { 0, std::numeric_limits::max() }; constexpr SfzOffMode offMode { SfzOffMode::fast }; + constexpr float offTime { 6e-3f }; constexpr Range polyphonyRange { 0, config::maxVoices }; constexpr SfzSelfMask selfMask { SfzSelfMask::mask }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 0c1a228f..8452311b 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -161,10 +161,16 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) case hash("normal"): offMode = SfzOffMode::normal; break; + case hash("time"): + offMode = SfzOffMode::time; + break; default: DBG("Unkown off mode:" << opcode.value); } break; + case hash("off_time"): + setValueFromOpcode(opcode, offTime, Default::egTimeRange); + break; case hash("polyphony"): if (auto value = readOpcode(opcode.value, Default::polyphonyRange)) polyphony = *value; diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 76113910..72c29ad9 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -286,6 +286,7 @@ struct Region { uint32_t group { Default::group }; // group absl::optional offBy {}; // off_by SfzOffMode offMode { Default::offMode }; // off_mode + float offTime { Default::offTime }; // off_mode absl::optional notePolyphony {}; // note_polyphony unsigned polyphony { config::maxVoices }; // polyphony SfzSelfMask selfMask { Default::selfMask }; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 01469495..c6317a0f 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -195,6 +195,20 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.offMode == SfzOffMode::fast); region.parseOpcode({ "off_mode", "normal" }); REQUIRE(region.offMode == SfzOffMode::normal); + region.parseOpcode({ "off_mode", "time" }); + REQUIRE(region.offMode == SfzOffMode::time); + } + + SECTION("off_time") + { + REQUIRE(region.offTime == 0.006f); + region.parseOpcode({ "off_time", "0.1" }); + REQUIRE(region.offTime == 0.1f); + region.parseOpcode({ "off_time", "0" }); + REQUIRE(region.offTime == 0.0f); + region.parseOpcode({ "off_time", "0.1" }); + region.parseOpcode({ "off_time", "-1" }); + REQUIRE(region.offTime == 0.0f); } SECTION("lokey, hikey, and key")