From 0da5c43bb50c333000f8833657c92ac0f36df592 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Mon, 30 Mar 2020 19:58:32 +0200 Subject: [PATCH] Remove the helpers in the midi class and be explicit in the process --- src/sfizz/MidiState.h | 20 ---------------- src/sfizz/Voice.cpp | 55 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/src/sfizz/MidiState.h b/src/sfizz/MidiState.h index 9b028527..0d14e41c 100644 --- a/src/sfizz/MidiState.h +++ b/src/sfizz/MidiState.h @@ -154,26 +154,6 @@ public: return returnedValue; } - template)> - void additiveModifiers(const CCMap& modifiers, absl::Span output, absl::Span temp, F&& lambda = gainModifier) - { - fill(output, 0.0f); - for (auto& mod : modifiers) { - linearEnvelope(mod, temp, lambda); - add(temp, output); - } - } - - template)> - void multiplicativeModifiers(const CCMap& modifiers, absl::Span output, absl::Span temp, F&& lambda = gainModifier) - { - for (auto& mod : modifiers) { - linearEnvelope(mod, temp, lambda); - applyGain(temp, output); - } - } - - const EventVector& getEvents(int ccIdx) const noexcept; template diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 6444aecf..2cb771f6 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -275,15 +275,23 @@ void sfz::Voice::ampStageMono(AudioSpan buffer) noexcept // Amplitude envelope fill(*modulationSpan, baseGain); - resources.midiState.multiplicativeModifiers(region->amplitudeCC, *modulationSpan, *tempSpan); + for (auto& mod : region->amplitudeCC) { + resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier); + applyGain(*tempSpan, *modulationSpan); + } DBG("Final gain: " << modulationSpan->back()); applyGain(*modulationSpan, leftBuffer); // Crossfade envelopes - // crossfadeEnvelope.getBlock(modulationSpan); fill(*modulationSpan, 1.0f); - resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind); - resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind); + for (auto& mod : region->crossfadeCCInRange) { + resources.midiState.linearEnvelope(mod, *tempSpan, xfinBind); + applyGain(*tempSpan, *modulationSpan); + } + for (auto& mod : region->crossfadeCCOutRange) { + resources.midiState.linearEnvelope(mod, *tempSpan, xfoutBind); + applyGain(*tempSpan, *modulationSpan); + } DBG("XF: " << modulationSpan->back()); applyGain(*modulationSpan, leftBuffer); @@ -311,15 +319,28 @@ void sfz::Voice::ampStageStereo(AudioSpan buffer) noexcept const auto xfinBind = std::bind(crossfadeIn, _1, _2, region->crossfadeCCCurve); const auto xfoutBind = std::bind(crossfadeIn, _1, _2, region->crossfadeCCCurve); + // Amplitude envelope fill(*modulationSpan, baseGain); - resources.midiState.multiplicativeModifiers(region->amplitudeCC, *modulationSpan, *tempSpan); + for (auto& mod : region->amplitudeCC) { + resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier); + applyGain(*tempSpan, *modulationSpan); + } + DBG("Final gain: " << modulationSpan->back()); buffer.applyGain(*modulationSpan); + // Crossfade envelopes fill(*modulationSpan, 1.0f); - resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind); - resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind); + for (auto& mod : region->crossfadeCCInRange) { + resources.midiState.linearEnvelope(mod, *tempSpan, xfinBind); + applyGain(*tempSpan, *modulationSpan); + } + for (auto& mod : region->crossfadeCCOutRange) { + resources.midiState.linearEnvelope(mod, *tempSpan, xfoutBind); + applyGain(*tempSpan, *modulationSpan); + } + DBG("XF: " << modulationSpan->back()); buffer.applyGain(*modulationSpan); // Volume envelope @@ -349,7 +370,10 @@ void sfz::Voice::panStageMono(AudioSpan buffer) noexcept // Apply panning fill(*modulationSpan, region->pan); - resources.midiState.additiveModifiers(region->panCC, *modulationSpan, *tempSpan); + for (auto& mod : region->panCC) { + resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier); + add(*tempSpan, *modulationSpan); + } DBG("Pan: " << modulationSpan->back()); pan(*modulationSpan, leftBuffer, rightBuffer); } @@ -369,18 +393,27 @@ void sfz::Voice::panStageStereo(AudioSpan buffer) noexcept // Apply panning // panningModulation(*modulationSpan); fill(*modulationSpan, region->pan); - resources.midiState.additiveModifiers(region->panCC, *modulationSpan, *tempSpan); + for (auto& mod : region->panCC) { + resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier); + add(*tempSpan, *modulationSpan); + } pan(*modulationSpan, leftBuffer, rightBuffer); // Apply the width/position process // widthModulation(*modulationSpan); fill(*modulationSpan, region->width); - resources.midiState.additiveModifiers(region->widthCC, *modulationSpan, *tempSpan); + for (auto& mod : region->widthCC) { + resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier); + add(*tempSpan, *modulationSpan); + } width(*modulationSpan, leftBuffer, rightBuffer); // positionModulation(*modulationSpan); fill(*modulationSpan, region->position); - resources.midiState.additiveModifiers(region->positionCC, *modulationSpan, *tempSpan); + for (auto& mod : region->positionCC) { + resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier); + add(*tempSpan, *modulationSpan); + } pan(*modulationSpan, leftBuffer, rightBuffer); }