From d000890eafbc6cc715fa6e7da2db61db05a6f3e4 Mon Sep 17 00:00:00 2001 From: ozpv <39195175+ozpv@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:53:06 -0500 Subject: update ring mod --- Core/Src/Effects/ringmod.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'Core/Src/Effects/ringmod.c') diff --git a/Core/Src/Effects/ringmod.c b/Core/Src/Effects/ringmod.c index 732f68e..1b411dc 100755 --- a/Core/Src/Effects/ringmod.c +++ b/Core/Src/Effects/ringmod.c @@ -8,30 +8,34 @@ #include "cs4272.h" #include "ringmod.h" #include +#include -/* ring modulator */ -void ringmod(float *samples, size_t range_min, size_t range_max) { +/* MF-102S ring modulator */ +void ringmod(float *samples, const size_t range_min, const size_t range_max, const struct RingModParams *params) { static float lfo_phase = 0.0f; static float carrier_phase = 0.0f; - const float frequency = 156.0f; - const float amount = 0.67f; const float sample_rate = (float)SAMPLE_RATE; + const float inverse_sample_rate = 1.0f / sample_rate; - float lfo_increment = M_TWOPI * (0.18f / sample_rate); - - /* plus two because of */ + /* samples are interleaved */ for (size_t i = range_min; i < range_max; i += 2) { - lfo_phase = fmodf(lfo_phase + lfo_increment, M_TWOPI); + float frequency_lfo = 0.0f; - float lfo = sinf(lfo_phase); + if (params->square_lfo) { + frequency_lfo = (lfo_phase < 0.5f) ? params->lfo_amount : -params->lfo_amount; + } else { + frequency_lfo = params->lfo_amount * sinf(M_TWOPI * lfo_phase); + } - float carrier_increment = M_TWOPI * ((frequency + lfo * (frequency * 3.0f * amount)) / sample_rate); + float carrier = sinf(M_TWOPI * carrier_phase); - carrier_phase = fmodf(carrier_phase + carrier_increment, M_TWOPI); + samples[i] = (samples[i] * (1.0f - params->mix)) + (samples[i] * carrier * params->mix); - float carrier = sinf(carrier_phase); + lfo_phase += params->lfo_rate * inverse_sample_rate; + lfo_phase = fmod(lfo_phase, 1.0f); - samples[i] = (samples[i] * 0.50f) + (samples[i] * carrier * 0.50f); + carrier_phase += (params->frequency + frequency_lfo) * inverse_sample_rate; + carrier_phase = fmod(carrier_phase, 1.0f); } } -- cgit v1.2.3