From bdd8c21fcfff8041ea94a972903ce42e58c2a5c2 Mon Sep 17 00:00:00 2001 From: ozpv <39195175+ozpv@users.noreply.github.com> Date: Sat, 29 Aug 2026 23:04:49 -0500 Subject: add retain --- Core/Src/Effects/ringmod.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'Core/Src/Effects/ringmod.c') diff --git a/Core/Src/Effects/ringmod.c b/Core/Src/Effects/ringmod.c index 1b411dc..be58c11 100755 --- a/Core/Src/Effects/ringmod.c +++ b/Core/Src/Effects/ringmod.c @@ -7,11 +7,17 @@ #include "cs4272.h" #include "ringmod.h" -#include -#include +#include "arm_math.h" /* MF-102S ring modulator */ -void ringmod(float *samples, const size_t range_min, const size_t range_max, const struct RingModParams *params) { +void ringmod( + const struct RingModParams *params, + const int32_t *samples_in, + int32_t *samples_out, + const size_t range_min, + const size_t range_max, + const enum Channel channel +) { static float lfo_phase = 0.0f; static float carrier_phase = 0.0f; @@ -19,23 +25,30 @@ void ringmod(float *samples, const size_t range_min, const size_t range_max, con const float inverse_sample_rate = 1.0f / sample_rate; /* samples are interleaved */ - for (size_t i = range_min; i < range_max; i += 2) { + for (size_t i = range_min + channel; i < range_max; i += 2) { + float sample = int24_t_to_f32(samples_in[i]); + float frequency_lfo = 0.0f; 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); + frequency_lfo = params->lfo_amount * arm_sin_f32(M_TWOPI * lfo_phase); } - float carrier = sinf(M_TWOPI * carrier_phase); + float carrier = arm_sin_f32(M_TWOPI * carrier_phase); - samples[i] = (samples[i] * (1.0f - params->mix)) + (samples[i] * carrier * params->mix); + float output_sample = (sample * (1.0f - params->mix)) + (sample * carrier * params->mix); + samples_out[i] = f32_to_int24_t(output_sample); lfo_phase += params->lfo_rate * inverse_sample_rate; - lfo_phase = fmod(lfo_phase, 1.0f); + while (lfo_phase >= 1.0f) { + lfo_phase -= 1.0f; + } carrier_phase += (params->frequency + frequency_lfo) * inverse_sample_rate; - carrier_phase = fmod(carrier_phase, 1.0f); + while (carrier_phase >= 1.0f) { + carrier_phase -= 1.0f; + } } } -- cgit v1.2.3