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:
parent
85832f2baf
commit
c4224b5792
4 changed files with 17 additions and 10 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue