diff options
Diffstat (limited to 'Core/Src/Effects/ringmod.c')
| -rwxr-xr-x | Core/Src/Effects/ringmod.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Core/Src/Effects/ringmod.c b/Core/Src/Effects/ringmod.c new file mode 100755 index 0000000..732f68e --- /dev/null +++ b/Core/Src/Effects/ringmod.c @@ -0,0 +1,37 @@ +/*
+ * ringmod.c
+ *
+ * Created on: Aug 19, 2026
+ * Author: ozpv
+ */
+
+#include "cs4272.h"
+#include "ringmod.h"
+#include <math.h>
+
+/* ring modulator */
+void ringmod(float *samples, size_t range_min, size_t range_max) {
+ 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;
+
+ float lfo_increment = M_TWOPI * (0.18f / sample_rate);
+
+ /* plus two because of */
+ for (size_t i = range_min; i < range_max; i += 2) {
+ lfo_phase = fmodf(lfo_phase + lfo_increment, M_TWOPI);
+
+ float lfo = sinf(lfo_phase);
+
+ float carrier_increment = M_TWOPI * ((frequency + lfo * (frequency * 3.0f * amount)) / sample_rate);
+
+ carrier_phase = fmodf(carrier_phase + carrier_increment, M_TWOPI);
+
+ float carrier = sinf(carrier_phase);
+
+ samples[i] = (samples[i] * 0.50f) + (samples[i] * carrier * 0.50f);
+ }
+}
|
