From 944373ea83749d4580f58e6fab500ca24e625286 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Tue, 25 Aug 2020 21:34:42 +0200 Subject: [PATCH] Move common voice starting logic in a separate method --- src/sfizz/Synth.cpp | 61 ++++++++++++++++----------------------------- src/sfizz/Synth.h | 1 + 2 files changed, 23 insertions(+), 39 deletions(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 850456b2..890f990b 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -893,6 +893,24 @@ void sfz::Synth::noteOff(int delay, int noteNumber, uint8_t velocity) noexcept noteOffDispatch(delay, noteNumber, replacedVelocity); } +void sfz::Synth::startVoice(Region* region, int delay, const TriggerEvent& triggerEvent, SisterVoiceRingBuilder& ring) noexcept +{ + checkNotePolyphony(region, delay, triggerEvent); + checkRegionPolyphony(region, delay); + checkGroupPolyphony(region, delay); + checkSetPolyphony(region, delay); + + Voice* selectedVoice = findFreeVoice(); + if (selectedVoice == nullptr) + return; + + ASSERT(selectedVoice->isFree()); + selectedVoice->startVoice(region, delay, triggerEvent); + ring.addVoiceToRing(selectedVoice); + RegionSet::registerVoiceInHierarchy(region, selectedVoice); + polyphonyGroups[region->group].registerVoice(selectedVoice); +} + bool matchReleaseRegionAndVoice(const sfz::Region& region, const sfz::Voice& voice) { const sfz::TriggerEvent& event = voice.getTriggerEvent(); @@ -926,13 +944,7 @@ void sfz::Synth::noteOffDispatch(int delay, int noteNumber, float velocity) noex continue; } - if (Voice* selectedVoice = findFreeVoice()) { - ASSERT(selectedVoice->isFree()); - selectedVoice->startVoice(region, delay, triggerEvent); - ring.addVoiceToRing(selectedVoice); - RegionSet::registerVoiceInHierarchy(region, selectedVoice); - polyphonyGroups[region->group].registerVoice(selectedVoice); - } + startVoice(region, delay, triggerEvent, ring); } } } @@ -1040,18 +1052,7 @@ void sfz::Synth::noteOnDispatch(int delay, int noteNumber, float velocity) noexc } } - checkNotePolyphony(region, delay, triggerEvent); - checkRegionPolyphony(region, delay); - checkGroupPolyphony(region, delay); - checkSetPolyphony(region, delay); - - if (Voice* selectedVoice = findFreeVoice()) { - ASSERT(selectedVoice->isFree()); - selectedVoice->startVoice(region, delay, triggerEvent); - ring.addVoiceToRing(selectedVoice); - RegionSet::registerVoiceInHierarchy(region, selectedVoice); - polyphonyGroups[region->group].registerVoice(selectedVoice); - } + startVoice(region, delay, triggerEvent, ring); } } } @@ -1096,10 +1097,6 @@ void sfz::Synth::hdcc(int delay, int ccNumber, float normValue) noexcept if (ccNumber == region->sustainCC) { if (!region->rtDead) { // check that a voice with compatible trigger is playing - // FIXME: we're going twice over the voices, when the synth - // handles the regions completely these dispatch functions - // should be overhauled, also to include voice stealing on - // all events const auto compatibleVoice = [region](const VoicePtr& v) -> bool { return matchReleaseRegionAndVoice(*region, *v); }; @@ -1110,29 +1107,15 @@ void sfz::Synth::hdcc(int delay, int ccNumber, float normValue) noexcept for (auto& note: region->delayedReleases) { // FIXME: we really need to have some form of common method to find and start voices... - auto voice = findFreeVoice(); - if (voice == nullptr) - continue; - const TriggerEvent noteOffEvent { TriggerEventType::NoteOff, note.first, note.second }; - voice->startVoice(region, delay, noteOffEvent); - - ring.addVoiceToRing(voice); - RegionSet::registerVoiceInHierarchy(region, voice); - polyphonyGroups[region->group].registerVoice(voice); + startVoice(region, delay, noteOffEvent, ring); } region->delayedReleases.clear(); } if (region->registerCC(ccNumber, normValue)) { - if (Voice* selectedVoice = findFreeVoice()) { - ASSERT(selectedVoice->isFree()); - selectedVoice->startVoice(region, delay, triggerEvent); - ring.addVoiceToRing(selectedVoice); - RegionSet::registerVoiceInHierarchy(region, selectedVoice); - polyphonyGroups[region->group].registerVoice(selectedVoice); - } + startVoice(region, delay, triggerEvent, ring); } } } diff --git a/src/sfizz/Synth.h b/src/sfizz/Synth.h index 1d2f1f5f..73403913 100644 --- a/src/sfizz/Synth.h +++ b/src/sfizz/Synth.h @@ -784,6 +784,7 @@ private: void checkNotePolyphony(const Region* region, int delay, const TriggerEvent& triggerEvent) noexcept; void checkGroupPolyphony(const Region* region, int delay) noexcept; void checkSetPolyphony(const Region* region, int delay) noexcept; + void startVoice(Region* region, int delay, const TriggerEvent& triggerEvent, SisterVoiceRingBuilder& ring) noexcept; std::array noteActivationLists; std::array ccActivationLists;