CC Triggers also considers sequences

This commit is contained in:
Paul Fd 2021-07-05 11:31:24 +02:00
parent da942c9244
commit 559464684a
4 changed files with 37 additions and 9 deletions

View file

@ -129,7 +129,7 @@ bool Layer::registerNoteOff(int noteNumber, float velocity, float randValue) noe
return false;
}
bool Layer::registerCC(int ccNumber, float ccValue) noexcept
bool Layer::registerCC(int ccNumber, float ccValue, bool dontTrigger) noexcept
{
const Region& region = region_;
@ -152,14 +152,16 @@ bool Layer::registerCC(int ccNumber, float ccValue) noexcept
else
ccSwitched_.set(ccNumber, false);
if (!isSwitchedOn())
return false;
if (!region.triggerOnCC)
if (dontTrigger || !region.triggerOnCC)
return false;
if (auto triggerRange = region.ccTriggers.get(ccNumber)) {
if (triggerRange->containsWithEnd(ccValue))
if (!triggerRange->containsWithEnd(ccValue))
return false;
sequenceSwitched_ =
((sequenceCounter_++ % region.sequenceLength) == region.sequencePosition - 1);
if (isSwitchedOn())
return true;
}

View file

@ -88,7 +88,7 @@ public:
* @return true if the region should trigger on this event
* @return false
*/
bool registerCC(int ccNumber, float ccValue) noexcept;
bool registerCC(int ccNumber, float ccValue, bool dontTrigger = false) noexcept;
/**
* @brief Register a new pitch wheel event.
*

View file

@ -726,7 +726,7 @@ void Synth::Impl::finalizeSfzLoad()
// Defaults
MidiState& midiState = resources_.getMidiState();
for (int cc = 0; cc < config::numCCs; cc++) {
layer.registerCC(cc, midiState.getCCValue(cc));
layer.registerCC(cc, midiState.getCCValue(cc), true);
}
@ -1951,7 +1951,7 @@ void Synth::Impl::resetAllControllers(int delay) noexcept
for (const LayerPtr& layerPtr : layers_) {
Layer& layer = *layerPtr;
for (int cc = 0; cc < config::numCCs; ++cc)
layer.registerCC(cc, defaultCCValues_[cc]);
layer.registerCC(cc, defaultCCValues_[cc], true);
}
}

View file

@ -1960,3 +1960,29 @@ TEST_CASE("[Synth] Resets all controllers to default values")
REQUIRE( synth.getHdcc(56) == 64_norm );
REQUIRE( synth.getHdcc(78) == 0.0f );
}
TEST_CASE("[Synth] Sequences also work on cc triggers")
{
sfz::Synth synth;
std::vector<std::string> messageList;
sfz::Client client(&messageList);
client.setReceiveCallback(&simpleMessageReceiver);
sfz::AudioBuffer<float> buffer { 2, static_cast<unsigned>(synth.getSamplesPerBlock()) };
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sequence_cc_triggers.sfz", R"(
<global> seq_length=3
<region> sample=*sine hikey=-1 start_locc61=0 start_hicc61=64 seq_position=1
<region> sample=*saw hikey=-1 start_locc61=0 start_hicc61=64 seq_position=2
)");
synth.cc(0, 61, 10);
synth.renderBlock(buffer);
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine" } );
synth.cc(0, 61, 20);
synth.renderBlock(buffer);
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine", "*saw" } );
synth.cc(0, 61, 20);
synth.renderBlock(buffer);
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine", "*saw" } );
synth.cc(0, 61, 20);
synth.renderBlock(buffer);
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine", "*saw", "*sine" } );
}