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));
}
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);

View file

@ -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.
*

View file

@ -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(&region, 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

View file

@ -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