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.c30
1 files changed, 17 insertions, 13 deletions
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 <math.h>
+#include <float.h>
-/* 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);
}
}