Passing -1 to hikey works properly
Disables the key matching and enables CC matching
This commit is contained in:
parent
3709c4065f
commit
8ceb5f3b48
3 changed files with 34 additions and 5 deletions
|
|
@ -47,10 +47,10 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
|
||||||
const auto trimmedSample = trim(opcode.value);
|
const auto trimmedSample = trim(opcode.value);
|
||||||
if (trimmedSample.empty())
|
if (trimmedSample.empty())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (trimmedSample[0] == '*')
|
if (trimmedSample[0] == '*')
|
||||||
sample = std::string(trimmedSample);
|
sample = std::string(trimmedSample);
|
||||||
else
|
else
|
||||||
sample = absl::StrCat(defaultPath, absl::StrReplaceAll(trimmedSample, { { "\\", "/" } }));
|
sample = absl::StrCat(defaultPath, absl::StrReplaceAll(trimmedSample, { { "\\", "/" } }));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -127,9 +127,11 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
|
||||||
setRangeStartFromOpcode(opcode, keyRange, Default::keyRange);
|
setRangeStartFromOpcode(opcode, keyRange, Default::keyRange);
|
||||||
break;
|
break;
|
||||||
case hash("hikey"):
|
case hash("hikey"):
|
||||||
|
triggerOnCC = (opcode.value == "-1");
|
||||||
setRangeEndFromOpcode(opcode, keyRange, Default::keyRange);
|
setRangeEndFromOpcode(opcode, keyRange, Default::keyRange);
|
||||||
break;
|
break;
|
||||||
case hash("key"):
|
case hash("key"):
|
||||||
|
triggerOnCC = (opcode.value == "-1");
|
||||||
setRangeStartFromOpcode(opcode, keyRange, Default::keyRange);
|
setRangeStartFromOpcode(opcode, keyRange, Default::keyRange);
|
||||||
setRangeEndFromOpcode(opcode, keyRange, Default::keyRange);
|
setRangeEndFromOpcode(opcode, keyRange, Default::keyRange);
|
||||||
setValueFromOpcode(opcode, pitchKeycenter, Default::keyRange);
|
setValueFromOpcode(opcode, pitchKeycenter, Default::keyRange);
|
||||||
|
|
@ -557,6 +559,9 @@ bool sfz::Region::registerNoteOn(int channel, int noteNumber, uint8_t velocity,
|
||||||
if (!isSwitchedOn())
|
if (!isSwitchedOn())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (triggerOnCC)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (previousNote && !(previousKeySwitched && noteNumber != *previousNote))
|
if (previousNote && !(previousKeySwitched && noteNumber != *previousNote))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -592,6 +597,9 @@ bool sfz::Region::registerNoteOff(int channel, int noteNumber, uint8_t velocity
|
||||||
if (!isSwitchedOn())
|
if (!isSwitchedOn())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (triggerOnCC)
|
||||||
|
return false;
|
||||||
|
|
||||||
const bool velOk = velocityRange.containsWithEnd(velocity);
|
const bool velOk = velocityRange.containsWithEnd(velocity);
|
||||||
const bool randOk = randRange.contains(randValue);
|
const bool randOk = randRange.contains(randValue);
|
||||||
const bool releaseTrigger = (trigger == SfzTrigger::release || trigger == SfzTrigger::release_key);
|
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())
|
if (!isSwitchedOn())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (!triggerOnCC)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (ccTriggers.contains(ccNumber) && ccTriggers.at(ccNumber).containsWithEnd(ccValue))
|
if (ccTriggers.contains(ccNumber) && ccTriggers.at(ccNumber).containsWithEnd(ccValue))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
|
|
@ -777,7 +788,7 @@ float sfz::Region::velocityCurve(uint8_t velocity) const noexcept
|
||||||
auto after = std::find_if(velocityPoints.begin(), velocityPoints.end(), [velocity](auto& val) { return val.first >= velocity; });
|
auto after = std::find_if(velocityPoints.begin(), velocityPoints.end(), [velocity](auto& val) { return val.first >= velocity; });
|
||||||
auto before = after == velocityPoints.begin() ? velocityPoints.begin() : after - 1;
|
auto before = after == velocityPoints.begin() ? velocityPoints.begin() : after - 1;
|
||||||
// Linear interpolation
|
// Linear interpolation
|
||||||
float relativePositionInSegment {
|
float relativePositionInSegment {
|
||||||
static_cast<float>(velocity - before->first) / static_cast<float>(after->first - before->first)
|
static_cast<float>(velocity - before->first) / static_cast<float>(after->first - before->first)
|
||||||
};
|
};
|
||||||
float segmentEndpoints { after->second - before->second };
|
float segmentEndpoints { after->second - before->second };
|
||||||
|
|
|
||||||
|
|
@ -324,6 +324,7 @@ private:
|
||||||
bool bpmSwitched { true };
|
bool bpmSwitched { true };
|
||||||
bool aftertouchSwitched { true };
|
bool aftertouchSwitched { true };
|
||||||
std::bitset<config::numCCs> ccSwitched;
|
std::bitset<config::numCCs> ccSwitched;
|
||||||
|
bool triggerOnCC { false };
|
||||||
std::string defaultPath { "" };
|
std::string defaultPath { "" };
|
||||||
|
|
||||||
int activeNotesInRange { -1 };
|
int activeNotesInRange { -1 };
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ TEST_CASE("Basic triggers", "Region triggers")
|
||||||
{
|
{
|
||||||
sfz::MidiState midiState;
|
sfz::MidiState midiState;
|
||||||
sfz::Region region { midiState };
|
sfz::Region region { midiState };
|
||||||
|
|
||||||
region.parseOpcode({ "sample", "*sine" });
|
region.parseOpcode({ "sample", "*sine" });
|
||||||
SECTION("key")
|
SECTION("key")
|
||||||
{
|
{
|
||||||
|
|
@ -121,11 +121,28 @@ TEST_CASE("Basic triggers", "Region triggers")
|
||||||
REQUIRE(region.registerNoteOn(0, 40, 64, 1.0f));
|
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")
|
SECTION("on_loccN, on_hiccN")
|
||||||
{
|
{
|
||||||
region.parseOpcode({ "on_locc47", "64" });
|
region.parseOpcode({ "on_locc47", "64" });
|
||||||
region.parseOpcode({ "on_hicc47", "68" });
|
region.parseOpcode({ "on_hicc47", "68" });
|
||||||
REQUIRE(!region.registerCC(0, 47, 63));
|
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, 64));
|
||||||
REQUIRE(region.registerCC(0, 47, 65));
|
REQUIRE(region.registerCC(0, 47, 65));
|
||||||
REQUIRE(region.registerCC(0, 47, 66));
|
REQUIRE(region.registerCC(0, 47, 66));
|
||||||
|
|
@ -164,4 +181,4 @@ TEST_CASE("Legato triggers", "Region triggers")
|
||||||
region.registerNoteOff(0, 41, 0, 0.5f);
|
region.registerNoteOff(0, 41, 0, 0.5f);
|
||||||
REQUIRE(!region.registerNoteOn(0, 42, 64, 0.5f));
|
REQUIRE(!region.registerNoteOn(0, 42, 64, 0.5f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue