diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 9e6f0d84..5ceaa784 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -34,6 +34,7 @@ enum class SfzLoopMode { no_loop, one_shot, loop_continuous, loop_sustain }; enum class SfzOffMode { fast, normal }; enum class SfzVelocityOverride { current, previous }; enum class SfzCrossfadeCurve { gain, power }; +enum class SfzSelfMask { mask, dontMask }; namespace sfz { @@ -65,6 +66,8 @@ namespace Default constexpr uint32_t group { 0 }; constexpr Range groupRange { 0, std::numeric_limits::max() }; constexpr SfzOffMode offMode { SfzOffMode::fast }; + constexpr Range polyphonyRange { 0, config::maxVoices }; + constexpr SfzSelfMask selfMask { SfzSelfMask::mask }; // Region logic: key mapping constexpr Range keyRange { 0, 127 }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 7ab2dbfb..ff37c50d 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -124,6 +124,22 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) DBG("Unkown off mode:" << std::string(opcode.value)); } break; + case hash("note_polyphony"): + if (auto value = readOpcode(opcode.value, Default::polyphonyRange)) + notePolyphony = *value; + break; + case hash("note_selfmask"): + switch (hash(opcode.value)) { + case hash("on"): + selfMask = SfzSelfMask::mask; + break; + case hash("off"): + selfMask = SfzSelfMask::dontMask; + break; + default: + DBG("Unkown self mask value:" << std::string(opcode.value)); + } + break; // Region logic: key mapping case hash("lokey"): setRangeStartFromOpcode(opcode, keyRange, Default::keyRange); diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index eb3adb13..a499a5eb 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -240,6 +240,8 @@ struct Region { uint32_t group { Default::group }; // group absl::optional offBy {}; // off_by SfzOffMode offMode { Default::offMode }; // off_mode + absl::optional notePolyphony {}; + SfzSelfMask selfMask { Default::selfMask }; // Region logic: key mapping Range keyRange { Default::keyRange }; //lokey, hikey and key diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index c5338b49..c0b83dd4 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -1407,6 +1407,29 @@ TEST_CASE("[Region] Parsing opcodes") region.parseOpcode({ "oscillator_phase", "361" }); REQUIRE(region.oscillatorPhase == 360.0f); } + + SECTION("Note polyphony") + { + REQUIRE(!region.notePolyphony); + region.parseOpcode({ "note_polyphony", "45" }); + REQUIRE(region.notePolyphony); + REQUIRE(*region.notePolyphony == 45); + region.parseOpcode({ "note_polyphony", "-1" }); + REQUIRE(region.notePolyphony); + REQUIRE(*region.notePolyphony == 0); + } + + SECTION("Note selfmask") + { + REQUIRE(region.selfMask == SfzSelfMask::mask); + region.parseOpcode({ "note_selfmask", "off" }); + REQUIRE(region.selfMask == SfzSelfMask::dontMask); + region.parseOpcode({ "note_selfmask", "on" }); + REQUIRE(region.selfMask == SfzSelfMask::mask); + region.parseOpcode({ "note_selfmask", "off" }); + region.parseOpcode({ "note_selfmask", "garbage" }); + REQUIRE(region.selfMask == SfzSelfMask::dontMask); + } } // Specific region bugs