summaryrefslogtreecommitdiff
path: root/Core/Src/Effects/ringmod.c
diff options
context:
space:
mode:
Diffstat (limited to 'Core/Src/Effects/ringmod.c')
-rwxr-xr-xCore/Src/Effects/ringmod.c31
1 files changed, 22 insertions, 9 deletions
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 <math.h>
-#include <float.h>
+#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;
+ }
}
}