Passing -1 to hikey works properly

Disables the key matching and enables CC matching
This commit is contained in:
Paul Ferrand 2019-12-20 01:59:06 +01:00
parent 3709c4065f
commit 8ceb5f3b48
3 changed files with 34 additions and 5 deletions

View file

@ -127,9 +127,11 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
setRangeStartFromOpcode(opcode, keyRange, Default::keyRange);
break;
case hash("hikey"):
triggerOnCC = (opcode.value == "-1");
setRangeEndFromOpcode(opcode, keyRange, Default::keyRange);
break;
case hash("key"):
triggerOnCC = (opcode.value == "-1");
setRangeStartFromOpcode(opcode, keyRange, Default::keyRange);
setRangeEndFromOpcode(opcode, keyRange, Default::keyRange);
setValueFromOpcode(opcode, pitchKeycenter, Default::keyRange);
@ -557,6 +559,9 @@ bool sfz::Region::registerNoteOn(int channel, int noteNumber, uint8_t velocity,
if (!isSwitchedOn())
return false;
if (triggerOnCC)
return false;
if (previousNote && !(previousKeySwitched && noteNumber != *previousNote))
return false;
@ -592,6 +597,9 @@ bool sfz::Region::registerNoteOff(int channel, int noteNumber, uint8_t velocity
if (!isSwitchedOn())
return false;
if (triggerOnCC)
return false;
const bool velOk = velocityRange.containsWithEnd(velocity);
const bool randOk = randRange.contains(randValue);
const bool releaseTrigger = (trigger == SfzTrigger::release || trigger == SfzTrigger::release_key);
@ -611,6 +619,9 @@ bool sfz::Region::registerCC(int channel, int ccNumber, uint8_t ccValue) noexcep
if (!isSwitchedOn())
return false;
if (!triggerOnCC)
return false;
if (ccTriggers.contains(ccNumber) && ccTriggers.at(ccNumber).containsWithEnd(ccValue))
return true;
else

View file

@ -324,6 +324,7 @@ private:
bool bpmSwitched { true };
bool aftertouchSwitched { true };
std::bitset<config::numCCs> ccSwitched;
bool triggerOnCC { false };
std::string defaultPath { "" };
int activeNotesInRange { -1 };

View file

@ -121,11 +121,28 @@ TEST_CASE("Basic triggers", "Region triggers")
REQUIRE(region.registerNoteOn(0, 40, 64, 1.0f));
}
SECTION("Disable key trigger")
{
region.parseOpcode({ "key", "40" });
REQUIRE(region.registerNoteOn(0, 40, 64, 1.0f));
region.parseOpcode({ "hikey", "-1" });
REQUIRE(!region.registerNoteOn(0, 40, 64, 1.0f));
region.parseOpcode({ "hikey", "40" });
REQUIRE(region.registerNoteOn(0, 40, 64, 1.0f));
region.parseOpcode({ "key", "-1" });
REQUIRE(!region.registerNoteOn(0, 40, 64, 1.0f));
region.parseOpcode({ "key", "40" });
REQUIRE(region.registerNoteOn(0, 40, 64, 1.0f));
}
SECTION("on_loccN, on_hiccN")
{
region.parseOpcode({ "on_locc47", "64" });
region.parseOpcode({ "on_hicc47", "68" });
REQUIRE(!region.registerCC(0, 47, 63));
REQUIRE(!region.registerCC(0, 47, 64));
REQUIRE(!region.registerCC(0, 47, 65));
region.parseOpcode({ "hikey", "-1" });
REQUIRE(region.registerCC(0, 47, 64));
REQUIRE(region.registerCC(0, 47, 65));
REQUIRE(region.registerCC(0, 47, 66));