diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 3226d447..f32b47fa 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -911,7 +911,7 @@ void sfz::Synth::startVoice(Region* region, int delay, const TriggerEvent& trigg polyphonyGroups[region->group].registerVoice(selectedVoice); } -bool sfz::Synth::matchAttackRegion(const Region* releaseRegion) noexcept +bool sfz::Synth::playingAttackVoice(const Region* releaseRegion) noexcept { const auto compatibleVoice = [releaseRegion](const Voice* v) -> bool { const sfz::TriggerEvent& event = v->getTriggerEvent(); @@ -937,7 +937,7 @@ void sfz::Synth::noteOffDispatch(int delay, int noteNumber, float velocity) noex for (auto& region : noteActivationLists[noteNumber]) { if (region->registerNoteOff(noteNumber, velocity, randValue)) { - if (region->trigger == SfzTrigger::release && !region->rtDead && !matchAttackRegion(region)) + if (region->trigger == SfzTrigger::release && !region->rtDead && !playingAttackVoice(region)) continue; startVoice(region, delay, triggerEvent, ring); @@ -1058,7 +1058,7 @@ void sfz::Synth::noteOnDispatch(int delay, int noteNumber, float velocity) noexc void sfz::Synth::startDelayedReleaseVoices(Region* region, int delay, SisterVoiceRingBuilder& ring) noexcept { - if (!region->rtDead && !matchAttackRegion(region)) { + if (!region->rtDead && !playingAttackVoice(region)) { region->delayedReleases.clear(); return; } diff --git a/src/sfizz/Synth.h b/src/sfizz/Synth.h index 3a12c5bb..6c22fdeb 100644 --- a/src/sfizz/Synth.h +++ b/src/sfizz/Synth.h @@ -725,8 +725,31 @@ private: fs::file_time_type checkModificationTime(); + /** + * @brief Check all regions and start voices for note on events + * + * @param delay + * @param noteNumber + * @param velocity + */ void noteOnDispatch(int delay, int noteNumber, float velocity) noexcept; + + /** + * @brief Check all regions and start voices for note off events + * + * @param delay + * @param noteNumber + * @param velocity + */ void noteOffDispatch(int delay, int noteNumber, float velocity) noexcept; + + /** + * @brief Check all regions and start voices for cc events + * + * @param delay + * @param ccNumber + * @param value + */ void ccDispatch(int delay, int ccNumber, float value) noexcept; template @@ -781,14 +804,75 @@ private: VoiceViewVector voiceViewArray; VoiceStealing stealer; + /** + * @brief Check the region polyphony, releasing voices if necessary + * + * @param region + * @param delay + */ void checkRegionPolyphony(const Region* region, int delay) noexcept; + + /** + * @brief Check the note polyphony, releasing voices if necessary + * + * @param region + * @param delay + * @param triggerEvent + */ void checkNotePolyphony(const Region* region, int delay, const TriggerEvent& triggerEvent) noexcept; + + /** + * @brief Check the group polyphony, releasing voices if necessary + * + * @param region + * @param delay + */ void checkGroupPolyphony(const Region* region, int delay) noexcept; + + /** + * @brief Check the region set polyphony at all levels, releasing voices if necessary + * + * @param region + * @param delay + */ void checkSetPolyphony(const Region* region, int delay) noexcept; + + /** + * @brief Start a voice for a specific region. + * This will do the needed polyphony checks and voice stealing. + * + * @param region + * @param delay + * @param triggerEvent + * @param ring + */ void startVoice(Region* region, int delay, const TriggerEvent& triggerEvent, SisterVoiceRingBuilder& ring) noexcept; + + /** + * @brief Check the off groups of all playing voices, releasing if necessary + * + * @param region + * @param delay + */ void checkOffGroups(Region* region, int delay) noexcept; + + /** + * @brief Start all delayed release voices of the region if necessary + * + * @param region + * @param delay + * @param ring + */ void startDelayedReleaseVoices(Region* region, int delay, SisterVoiceRingBuilder& ring) noexcept; - bool matchAttackRegion(const Region* region) noexcept; + + /** + * @brief Check if a playing voice matches the release region + * + * @param releaseRegion + * @return true + * @return false + */ + bool playingAttackVoice(const Region* releaseRegion) noexcept; std::array noteActivationLists; std::array ccActivationLists;