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));
|
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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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(®ion, midiState.getInternalClock() + delay, sampleRate_))
|
if (region.useTimerRange && ! voiceManager_.withinValidTimerRange(®ion, 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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue