Skip to content

Commit

Permalink
allow polyaftertouch extended CC (130) to respect note num, especiall…
Browse files Browse the repository at this point in the history
…y useful when used as trigger with on_lo/hicc130 opcodes, so that the key range can be used select appropriate regions independently.
  • Loading branch information
essej committed Aug 30, 2023
1 parent afc6dba commit 74021c2
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 10 deletions.
7 changes: 6 additions & 1 deletion src/sfizz/Layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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_;

Expand All @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion src/sfizz/Layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,11 @@ struct Layer {
* @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.
*
Expand Down
11 changes: 5 additions & 6 deletions src/sfizz/Synth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1425,7 +1425,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 };
Expand All @@ -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)) {
checkOffGroups(&region, delay, ccNumber);
startVoice(layer, delay, triggerEvent, ring);
}
Expand All @@ -1466,7 +1466,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);
Expand Down Expand Up @@ -1494,7 +1494,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);
}

Expand Down Expand Up @@ -1594,8 +1594,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
Expand Down
6 changes: 4 additions & 2 deletions src/sfizz/SynthPrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 74021c2

Please sign in to comment.