diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 8be2fc96..cc0ac0b3 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -143,6 +143,7 @@ namespace Default constexpr SfzCrossfadeCurve crossfadeVelCurve { SfzCrossfadeCurve::power }; constexpr SfzCrossfadeCurve crossfadeCCCurve { SfzCrossfadeCurve::power }; constexpr float rtDecay { 0.0f }; + constexpr bool rtDead { false }; constexpr Range rtDecayRange { 0.0f, 200.0f }; // Performance parameters: Filters diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index ca2c15b8..93bc8996 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -111,7 +111,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) loopMode = SfzLoopMode::loop_sustain; break; default: - DBG("Unkown loop mode:" << std::string(opcode.value)); + DBG("Unkown loop mode:" << opcode.value); } break; case hash("loop_end"): // also loopend @@ -161,7 +161,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) offMode = SfzOffMode::normal; break; default: - DBG("Unkown off mode:" << std::string(opcode.value)); + DBG("Unkown off mode:" << opcode.value); } break; case hash("polyphony"): @@ -181,7 +181,16 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) selfMask = SfzSelfMask::dontMask; break; default: - DBG("Unkown self mask value:" << std::string(opcode.value)); + DBG("Unkown self mask value:" << opcode.value); + } + break; + case hash("rt_dead"): + if (opcode.value == "on") { + rtDead = true; + } else if (opcode.value == "off") { + rtDead = false; + } else { + DBG("Unkown rt_dead value:" << opcode.value); } break; // Region logic: key mapping @@ -274,7 +283,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) velocityOverride = SfzVelocityOverride::previous; break; default: - DBG("Unknown velocity mode: " << std::string(opcode.value)); + DBG("Unknown velocity mode: " << opcode.value); } break; @@ -337,7 +346,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) trigger = SfzTrigger::release_key; break; default: - DBG("Unknown trigger mode: " << std::string(opcode.value)); + DBG("Unknown trigger mode: " << opcode.value); } break; case hash("start_locc&"): // also on_locc& @@ -468,7 +477,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) crossfadeKeyCurve = SfzCrossfadeCurve::gain; break; default: - DBG("Unknown crossfade power curve: " << std::string(opcode.value)); + DBG("Unknown crossfade power curve: " << opcode.value); } break; case hash("xf_velcurve"): @@ -480,7 +489,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) crossfadeVelCurve = SfzCrossfadeCurve::gain; break; default: - DBG("Unknown crossfade power curve: " << std::string(opcode.value)); + DBG("Unknown crossfade power curve: " << opcode.value); } break; case hash("xfin_locc&"): @@ -516,7 +525,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) crossfadeCCCurve = SfzCrossfadeCurve::gain; break; default: - DBG("Unknown crossfade power curve: " << std::string(opcode.value)); + DBG("Unknown crossfade power curve: " << opcode.value); } break; case hash("rt_decay"): @@ -636,7 +645,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) filters[filterIndex].type = *ftype; else { filters[filterIndex].type = FilterType::kFilterNone; - DBG("Unknown filter type: " << std::string(opcode.value)); + DBG("Unknown filter type: " << opcode.value); } } break; @@ -745,7 +754,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) equalizers[eqNumber - 1].type = *ftype; else { equalizers[eqNumber - 1].type = EqType::kEqNone; - DBG("Unknown EQ type: " << std::string(opcode.value)); + DBG("Unknown EQ type: " << opcode.value); } } break; diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 366efd1f..3a175252 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -288,6 +288,7 @@ struct Region { absl::optional notePolyphony {}; // note_polyphony unsigned polyphony { config::maxVoices }; // polyphony SfzSelfMask selfMask { Default::selfMask }; + bool rtDead { Default::rtDead }; // Region logic: key mapping Range keyRange { Default::keyRange }; //lokey, hikey and key diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index d98b6c7a..e1d692c5 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -1628,6 +1628,18 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.selfMask == SfzSelfMask::dontMask); } + SECTION("Release dead") + { + REQUIRE(region.rtDead == false); + region.parseOpcode({ "rt_dead", "on" }); + REQUIRE(region.rtDead == true); + region.parseOpcode({ "rt_dead", "off" }); + REQUIRE(region.rtDead == false); + region.parseOpcode({ "rt_dead", "on" }); + region.parseOpcode({ "rt_dead", "garbage" }); + REQUIRE(region.rtDead == true); + } + SECTION("amplitude") { REQUIRE(region.amplitude == 1.0_a);