From 8ceb5f3b48bcb82fdf3563bb9a26f2a505a25517 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Fri, 20 Dec 2019 01:59:06 +0100 Subject: [PATCH] Passing -1 to hikey works properly Disables the key matching and enables CC matching --- src/sfizz/Region.cpp | 17 ++++++++++++++--- src/sfizz/Region.h | 1 + tests/RegionTriggersT.cpp | 21 +++++++++++++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 2a3c8099..db18e5c9 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -47,10 +47,10 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) const auto trimmedSample = trim(opcode.value); if (trimmedSample.empty()) break; - + if (trimmedSample[0] == '*') sample = std::string(trimmedSample); - else + else sample = absl::StrCat(defaultPath, absl::StrReplaceAll(trimmedSample, { { "\\", "/" } })); } break; @@ -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 @@ -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 before = after == velocityPoints.begin() ? velocityPoints.begin() : after - 1; // Linear interpolation - float relativePositionInSegment { + float relativePositionInSegment { static_cast(velocity - before->first) / static_cast(after->first - before->first) }; float segmentEndpoints { after->second - before->second }; diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 82465563..c8b55262 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -324,6 +324,7 @@ private: bool bpmSwitched { true }; bool aftertouchSwitched { true }; std::bitset ccSwitched; + bool triggerOnCC { false }; std::string defaultPath { "" }; int activeNotesInRange { -1 }; diff --git a/tests/RegionTriggersT.cpp b/tests/RegionTriggersT.cpp index a224257b..9f963974 100644 --- a/tests/RegionTriggersT.cpp +++ b/tests/RegionTriggersT.cpp @@ -29,7 +29,7 @@ TEST_CASE("Basic triggers", "Region triggers") { sfz::MidiState midiState; sfz::Region region { midiState }; - + region.parseOpcode({ "sample", "*sine" }); SECTION("key") { @@ -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)); @@ -164,4 +181,4 @@ TEST_CASE("Legato triggers", "Region triggers") region.registerNoteOff(0, 41, 0, 0.5f); REQUIRE(!region.registerNoteOn(0, 42, 64, 0.5f)); } -} \ No newline at end of file +}