Support lohdccN and hihdccN

This commit is contained in:
Jean Pierre Cimalando 2020-05-15 00:37:47 +02:00
parent ec7b9bbb1f
commit 8c8192140e
3 changed files with 45 additions and 0 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -278,6 +278,34 @@ TEST_CASE("[Region] Parsing opcodes")
REQUIRE(region.ccConditions[127] == sfz::Range<float>(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<float>(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<float>(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<float>(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<float>(0.0f, 1.0f));
}
SECTION("sw_lokey, sw_hikey")
{
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(0, 127));