From c4224b57924e121eb3a5b4d4b5f853c629b1a4ea Mon Sep 17 00:00:00 2001 From: essej Date: Tue, 29 Aug 2023 22:22:35 -0400 Subject: [PATCH] allow polyaftertouch extended CC (130) to respect note num, especially useful when used as trigger with on_lo/hicc130 opcodes, so that the key range can be used select appropriate regions independently. --- src/sfizz/Layer.cpp | 7 ++++++- src/sfizz/Layer.h | 3 ++- src/sfizz/Synth.cpp | 11 +++++------ src/sfizz/SynthPrivate.h | 6 ++++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/sfizz/Layer.cpp b/src/sfizz/Layer.cpp index 9e06c081..1e3a43d0 100644 --- a/src/sfizz/Layer.cpp +++ b/src/sfizz/Layer.cpp @@ -157,7 +157,7 @@ void Layer::updateCCState(int ccNumber, float ccValue) noexcept ccSwitched_.set(ccNumber, conditions->containsWithEnd(ccValue)); } -bool Layer::registerCC(int ccNumber, float ccValue, float randValue) noexcept +bool Layer::registerCC(int ccNumber, float ccValue, float randValue, int extendedArg) noexcept { const Region& region = region_; @@ -176,6 +176,11 @@ bool Layer::registerCC(int ccNumber, float ccValue, float randValue) noexcept if (!triggerRange->containsWithEnd(ccValue)) return false; + // only respect this polyAT trigger if the note number is one of ours + if (ccNumber == ExtendedCCs::polyphonicAftertouch && extendedArg >= 0 && !region.keyRange.containsWithEnd(extendedArg)) { + return false; + } + sequenceSwitched_ = ((sequenceCounter_++ % region.sequenceLength) == region.sequencePosition - 1); diff --git a/src/sfizz/Layer.h b/src/sfizz/Layer.h index e675ec44..0afae1f6 100644 --- a/src/sfizz/Layer.h +++ b/src/sfizz/Layer.h @@ -96,10 +96,11 @@ public: * @param ccNumber * @param ccValue * @param randValue + * @param extendedArg is used for special extendedCCs (eg. polyaftertouch to represent note num, etc) * @return true if the region should trigger on this event * @return false otherwise */ - bool registerCC(int ccNumber, float ccValue, float randValue) noexcept; + bool registerCC(int ccNumber, float ccValue, float randValue, int extendedArg=-1) noexcept; /** * @brief Register a new pitch wheel event. * diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index a8b7dc85..d4caaaba 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -1424,7 +1424,7 @@ void Synth::cc(int delay, int ccNumber, int ccValue) noexcept hdcc(delay, ccNumber, normalizedCC); } -void Synth::Impl::ccDispatch(int delay, int ccNumber, float value) noexcept +void Synth::Impl::ccDispatch(int delay, int ccNumber, float value, int extendedArg) noexcept { SisterVoiceRingBuilder ring; TriggerEvent triggerEvent { TriggerEventType::CC, ccNumber, value }; @@ -1447,7 +1447,7 @@ void Synth::Impl::ccDispatch(int delay, int ccNumber, float value) noexcept } } - if (layer->registerCC(ccNumber, value, randValue)) { + if (layer->registerCC(ccNumber, value, randValue, extendedArg)) { if (region.useTimerRange && ! voiceManager_.withinValidTimerRange(®ion, midiState.getInternalClock() + delay, sampleRate_)) continue; @@ -1469,7 +1469,7 @@ void Synth::automateHdcc(int delay, int ccNumber, float normValue) noexcept impl.performHdcc(delay, ccNumber, normValue, false); } -void Synth::Impl::performHdcc(int delay, int ccNumber, float normValue, bool asMidi) noexcept +void Synth::Impl::performHdcc(int delay, int ccNumber, float normValue, bool asMidi, int extendedArg) noexcept { ASSERT(ccNumber < config::numCCs); ASSERT(ccNumber >= 0); @@ -1497,7 +1497,7 @@ void Synth::Impl::performHdcc(int delay, int ccNumber, float normValue, bool asM for (auto& voice : voiceManager_) voice.registerCC(delay, ccNumber, normValue); - ccDispatch(delay, ccNumber, normValue); + ccDispatch(delay, ccNumber, normValue, extendedArg); midiState.ccEvent(delay, ccNumber, normValue); } @@ -1597,8 +1597,7 @@ void Synth::hdPolyAftertouch(int delay, int noteNumber, float normAftertouch) no for (auto& voice : impl.voiceManager_) voice.registerPolyAftertouch(delay, noteNumber, normAftertouch); - // Note information is lost on this CC - impl.performHdcc(delay, ExtendedCCs::polyphonicAftertouch, normAftertouch, false); + impl.performHdcc(delay, ExtendedCCs::polyphonicAftertouch, normAftertouch, false, noteNumber); } void Synth::tempo(int delay, float secondsPerBeat) noexcept diff --git a/src/sfizz/SynthPrivate.h b/src/sfizz/SynthPrivate.h index 3b051f0d..c7687954 100644 --- a/src/sfizz/SynthPrivate.h +++ b/src/sfizz/SynthPrivate.h @@ -150,8 +150,9 @@ struct Synth::Impl final: public Parser::Listener { * @param delay * @param ccNumber * @param value + * @param extendedArg used for some extendedCC (eg. polyaftertouch note num, etc) */ - void ccDispatch(int delay, int ccNumber, float value) noexcept; + void ccDispatch(int delay, int ccNumber, float value, int extendedArg=-1) noexcept; /** * @brief Start a voice for a specific region. @@ -239,8 +240,9 @@ struct Synth::Impl final: public Parser::Listener { * @param ccNumber The CC number * @param normValue The normalized value * @param asMidi Whether to process as a MIDI event + * @param extendedArg for some extendedCC (eg. polyaftertouch: note num, etc) */ - void performHdcc(int delay, int ccNumber, float normValue, bool asMidi) noexcept; + void performHdcc(int delay, int ccNumber, float normValue, bool asMidi, int extendedArg=-1) noexcept; /** * @brief Set the default value for a CC