From 42271fd682562e729b6eaf643b58f0b2c0d002e0 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 1 Feb 2021 12:56:22 +0100 Subject: [PATCH] Match LFO behavior to ARIA: pulse and sine --- src/sfizz/LFO.cpp | 14 +++++++++----- src/sfizz/effects/CommonLFO.hpp | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/sfizz/LFO.cpp b/src/sfizz/LFO.cpp index 547e296c..053ef1b1 100644 --- a/src/sfizz/LFO.cpp +++ b/src/sfizz/LFO.cpp @@ -102,31 +102,35 @@ template <> inline float LFO::eval(float phase) { float x = phase + phase - 1; - return 4 * x * (1 - std::fabs(x)); + return -4 * x * (1 - std::fabs(x)); } +// Pulse and Square levels +static constexpr float loPulse = 0.0f; // 0 in ARIA, -1 in Cakewalk +static constexpr float hiPulse = 1.0f; + template <> inline float LFO::eval(float phase) { - return (phase < 0.75f) ? +1.0f : -1.0f; + return (phase < 0.75f) ? hiPulse : loPulse; } template <> inline float LFO::eval(float phase) { - return (phase < 0.5f) ? +1.0f : -1.0f; + return (phase < 0.5f) ? hiPulse : loPulse; } template <> inline float LFO::eval(float phase) { - return (phase < 0.25f) ? +1.0f : -1.0f; + return (phase < 0.25f) ? hiPulse : loPulse; } template <> inline float LFO::eval(float phase) { - return (phase < 0.125f) ? +1.0f : -1.0f; + return (phase < 0.125f) ? hiPulse : loPulse; } template <> diff --git a/src/sfizz/effects/CommonLFO.hpp b/src/sfizz/effects/CommonLFO.hpp index ef6eef36..d43c0e88 100644 --- a/src/sfizz/effects/CommonLFO.hpp +++ b/src/sfizz/effects/CommonLFO.hpp @@ -11,6 +11,10 @@ namespace sfz { namespace fx { namespace lfo { + // Pulse and Square levels + static constexpr float loPulse = 0.0f; // 0 in ARIA, -1 in Cakewalk + static constexpr float hiPulse = 1.0f; + template <> inline float evaluateAtPhase(float phase) { @@ -24,31 +28,31 @@ namespace lfo { inline float evaluateAtPhase(float phase) { float x = phase + phase - 1; - return 4 * x * (1 - std::fabs(x)); + return -4 * x * (1 - std::fabs(x)); } template <> inline float evaluateAtPhase(float phase) { - return (phase < 0.75f) ? +1.0f : -1.0f; + return (phase < 0.75f) ? hiPulse : loPulse; } template <> inline float evaluateAtPhase(float phase) { - return (phase < 0.5f) ? +1.0f : -1.0f; + return (phase < 0.5f) ? hiPulse : loPulse; } template <> inline float evaluateAtPhase(float phase) { - return (phase < 0.25f) ? +1.0f : -1.0f; + return (phase < 0.25f) ? hiPulse : loPulse; } template <> inline float evaluateAtPhase(float phase) { - return (phase < 0.125f) ? +1.0f : -1.0f; + return (phase < 0.125f) ? hiPulse : loPulse; } template <>