diff --git a/src/sfizz/OpcodeCleanup.re b/src/sfizz/OpcodeCleanup.re index 05305bff..8f48ab6c 100644 --- a/src/sfizz/OpcodeCleanup.re +++ b/src/sfizz/OpcodeCleanup.re @@ -146,6 +146,11 @@ end_generic: goto end_region; } + ("hi"|"lo") "realcc" (number) END { + opcode = absl::StrCat(group(1), "hdcc", group(2)); + goto end_region; + } + * { goto end_region; } diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 8d505186..9f665296 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -206,6 +206,18 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccConditions[opcode.parameters.back()].setEnd(normalizeCC(*value)); break; + case hash("lohdcc&"): + if (opcode.parameters.back() >= config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::normalizedRange)) + ccConditions[opcode.parameters.back()].setStart(*value); + break; + case hash("hihdcc&"): + if (opcode.parameters.back() >= config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::normalizedRange)) + ccConditions[opcode.parameters.back()].setEnd(*value); + break; case hash("sw_lokey"): setRangeStartFromOpcode(opcode, keyswitchRange, Default::keyRange); break; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index c2efe488..19d2ab71 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -278,6 +278,34 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.ccConditions[127] == sfz::Range(0_norm, 127_norm)); } + SECTION("lohdcc, hihdcc") + { + region.parseOpcode({ "lohdcc7", "0.12" }); + REQUIRE(region.ccConditions[7].getStart() == Approx(0.12f)); + REQUIRE(region.ccConditions[7].getEnd() == 1.0f); + region.parseOpcode({ "lohdcc13", "-1.0" }); + REQUIRE(region.ccConditions[13] == sfz::Range(0.0f, 1.0f)); + region.parseOpcode({ "hihdcc64", "0.45" }); + REQUIRE(region.ccConditions[64].getStart() == 0.0f); + REQUIRE(region.ccConditions[64].getEnd() == Approx(0.45f)); + region.parseOpcode({ "hihdcc126", "1.2" }); + REQUIRE(region.ccConditions[126] == sfz::Range(0.0f, 1.0f)); + } + + SECTION("lorealcc, hirealcc") + { + region.parseOpcode({ "lorealcc8", "0.12" }); + REQUIRE(region.ccConditions[8].getStart() == Approx(0.12f)); + REQUIRE(region.ccConditions[8].getEnd() == 1.0f); + region.parseOpcode({ "lorealcc14", "-1.0" }); + REQUIRE(region.ccConditions[14] == sfz::Range(0.0f, 1.0f)); + region.parseOpcode({ "hirealcc63", "0.45" }); + REQUIRE(region.ccConditions[63].getStart() == 0.0f); + REQUIRE(region.ccConditions[63].getEnd() == Approx(0.45f)); + region.parseOpcode({ "hirealcc125", "1.2" }); + REQUIRE(region.ccConditions[125] == sfz::Range(0.0f, 1.0f)); + } + SECTION("sw_lokey, sw_hikey") { REQUIRE(region.keyswitchRange == sfz::Range(0, 127));