From 7ff0bf0659eac3e827322a1a5654b90e8aeb9f97 Mon Sep 17 00:00:00 2001 From: Gordon JC Pearce Date: Tue, 6 Jan 2026 20:20:30 +0000 Subject: [PATCH] better LFO and PW --- plugin/module.cpp | 24 ++++++++++++++++-------- plugin/module.hpp | 4 +++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/plugin/module.cpp b/plugin/module.cpp index a6350a9..c2405b0 100644 --- a/plugin/module.cpp +++ b/plugin/module.cpp @@ -70,15 +70,23 @@ void Module::runLFO() { lfoDelay = 0x3fff; } - lfoPhase += lfoRateTable[patchRam.lfoRate]; - if (lfoPhase & 0x4000) - lfo = 0x1fff - (lfoPhase & 0x3fff); - else - lfo = (lfoPhase & 0x3fff) - 0x1fff; + lfoRate = lfoRateTable[patchRam.lfoRate]; // FIXME move to parameters - pw = 0x3fff - (((0x2000 + lfo) * patchRam.pwmLfo) >> 7); - pw = (patchRam.switch2 & 0x01) ? 0x3fff - (patchRam.pwmLfo << 7) : pw; - lfo = (lfo * lfoDelay) >> 14; + lfoPhase += (lfoState & 0x01) ? -lfoRate : lfoRate; + if (lfoPhase > 0x1fff) { + lfoPhase = 0x1fff; + lfoState++; + } + if (lfoPhase < 0x0000) { + lfoPhase = 0x0000; + lfoState++; + } + lfo = (lfoState & 0x02) ? -lfoPhase : lfoPhase; + + pw = (lfoState & 0x02) ? lfoPhase + 0x2000 : 0x2000 - lfoPhase; // PW LFO is unipolar + pw = (patchRam.switch2 & 0x01) ? 0x3fff : pw; // either LFO or "all on" + pw = 0x3fff - ((pw * patchRam.pwmLfo) >> 7); // scaled by PWM pot + // lfo = (lfo * lfoDelay) >> 14; } void Module::run(Voice* voices, uint32_t blockSize) { diff --git a/plugin/module.hpp b/plugin/module.hpp index cce369c..3f75a8c 100644 --- a/plugin/module.hpp +++ b/plugin/module.hpp @@ -130,7 +130,9 @@ class Module { float pwmRC = 0, subRC = 0, vcaRC = 0; int16_t lfo, pw; - uint32_t lfoPhase; + int16_t lfoPhase; + uint8_t lfoState = 0; + uint16_t lfoRate; uint32_t noiseRNG = 1;