From 041b79c2021fedc5ff3a09f1483564b980f3778f Mon Sep 17 00:00:00 2001 From: chriskiefer Date: Sun, 29 Mar 2026 17:31:43 +0100 Subject: [PATCH] delay xfades --- modes/AudioApps/VerbFXAudioApp.hpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modes/AudioApps/VerbFXAudioApp.hpp b/modes/AudioApps/VerbFXAudioApp.hpp index c2ccb07..172c12b 100644 --- a/modes/AudioApps/VerbFXAudioApp.hpp +++ b/modes/AudioApps/VerbFXAudioApp.hpp @@ -20,7 +20,7 @@ -template +template class VerbFXAudioApp : public AudioAppBase { public: @@ -154,6 +154,9 @@ public: filterBankDelayXFade = smoothParams[45]; + delayMorph = smoothParams[46]; + delayBlend = smoothParams[47]; + //XFADE const float filterBankDelayFBLevel = sqrtf(filterBankDelayXFade); @@ -174,7 +177,7 @@ public: filterBankOut += filterBank6.bandpassChamberlain(filterBankIn, filterBankF6, filterBankRes6); filterBankOut += filterBank7.bandpassChamberlain(filterBankIn, filterBankF7, filterBankRes7); - filterBankOut *= 0.5f; + filterBankOut *= 0.125f; } ////////////// DELAYS @@ -189,7 +192,13 @@ public: float delayed2 = enableShortDelay ? ddelay2.read(ddelayTime2) : 0.f; ddelay2.write(delayIn + (ddelayFeedback2 * delayed2)); - float delaySum = delayed + delayed1 + delayed2; + float a = fminf(delayMorph * 2.f, 1.f); + float b = fmaxf(delayMorph * 2.f - 1.f, 0.f); + constexpr float kEqualMix = 0.57735f; // 1/sqrt(3), constant-power equal mix + float w_short = kEqualMix + delayBlend * (sqrtf(1.f - a) - kEqualMix); + float w_medium = kEqualMix + delayBlend * (sqrtf(a) * sqrtf(1.f - b) - kEqualMix); + float w_long = kEqualMix + delayBlend * (sqrtf(a) * sqrtf(b) - kEqualMix); + float delaySum = (w_short * delayed2) + (w_medium * delayed1) + (w_long * delayed); //////////////// VERB float verbIn = enableReverb ? filterBankOut : 0.f; @@ -226,7 +235,7 @@ public: // Mix dry - y = sqrtf(y * wetdry_mix_) + sqrtf(mix * (1.f - wetdry_mix_)); + y = (y * sqrtf(wetdry_mix_)) + (mix * sqrtf(1.f - wetdry_mix_)); stereosample_t ret { y, y }; @@ -344,6 +353,7 @@ protected: float ddelayTime1{0}, ddelayFeedback1{0}; float ddelayTime2{0}, ddelayFeedback2{0}; float verbVsDelayLevel{0}, delayToVerbLevel{0}, filterBankDelayXFade{0}; + float delayMorph{0.5f}, delayBlend{0.f}; OnePoleSmoother smoother{150.f, kSampleRate};