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.

This commit is contained in:
essej 2023-08-29 22:22:35 -04:00 committed by Paul Ferrand
parent 85832f2baf
commit c4224b5792
4 changed files with 17 additions and 10 deletions

View file

@ -157,7 +157,7 @@ void Layer::updateCCState(int ccNumber, float ccValue) noexcept
ccSwitched_.set(ccNumber, conditions->containsWithEnd(ccValue)); 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_; const Region& region = region_;
@ -176,6 +176,11 @@ bool Layer::registerCC(int ccNumber, float ccValue, float randValue) noexcept
if (!triggerRange->containsWithEnd(ccValue)) if (!triggerRange->containsWithEnd(ccValue))
return false; 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_ = sequenceSwitched_ =
((sequenceCounter_++ % region.sequenceLength) == region.sequencePosition - 1); ((sequenceCounter_++ % region.sequenceLength) == region.sequencePosition - 1);

View file

@ -96,10 +96,11 @@ public:
* @param ccNumber * @param ccNumber
* @param ccValue * @param ccValue
* @param randValue * @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 true if the region should trigger on this event
* @return false otherwise * @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. * @brief Register a new pitch wheel event.
* *

View file

@ -1424,7 +1424,7 @@ void Synth::cc(int delay, int ccNumber, int ccValue) noexcept
hdcc(delay, ccNumber, normalizedCC); 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; SisterVoiceRingBuilder ring;
TriggerEvent triggerEvent { TriggerEventType::CC, ccNumber, value }; 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(&region, midiState.getInternalClock() + delay, sampleRate_)) if (region.useTimerRange && ! voiceManager_.withinValidTimerRange(&region, midiState.getInternalClock() + delay, sampleRate_))
continue; continue;
@ -1469,7 +1469,7 @@ void Synth::automateHdcc(int delay, int ccNumber, float normValue) noexcept
impl.performHdcc(delay, ccNumber, normValue, false); 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 < config::numCCs);
ASSERT(ccNumber >= 0); ASSERT(ccNumber >= 0);
@ -1497,7 +1497,7 @@ void Synth::Impl::performHdcc(int delay, int ccNumber, float normValue, bool asM
for (auto& voice : voiceManager_) for (auto& voice : voiceManager_)
voice.registerCC(delay, ccNumber, normValue); voice.registerCC(delay, ccNumber, normValue);
ccDispatch(delay, ccNumber, normValue); ccDispatch(delay, ccNumber, normValue, extendedArg);
midiState.ccEvent(delay, ccNumber, normValue); midiState.ccEvent(delay, ccNumber, normValue);
} }
@ -1597,8 +1597,7 @@ void Synth::hdPolyAftertouch(int delay, int noteNumber, float normAftertouch) no
for (auto& voice : impl.voiceManager_) for (auto& voice : impl.voiceManager_)
voice.registerPolyAftertouch(delay, noteNumber, normAftertouch); voice.registerPolyAftertouch(delay, noteNumber, normAftertouch);
// Note information is lost on this CC impl.performHdcc(delay, ExtendedCCs::polyphonicAftertouch, normAftertouch, false, noteNumber);
impl.performHdcc(delay, ExtendedCCs::polyphonicAftertouch, normAftertouch, false);
} }
void Synth::tempo(int delay, float secondsPerBeat) noexcept void Synth::tempo(int delay, float secondsPerBeat) noexcept

View file

@ -150,8 +150,9 @@ struct Synth::Impl final: public Parser::Listener {
* @param delay * @param delay
* @param ccNumber * @param ccNumber
* @param value * @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. * @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 ccNumber The CC number
* @param normValue The normalized value * @param normValue The normalized value
* @param asMidi Whether to process as a MIDI event * @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 * @brief Set the default value for a CC