41 lines
930 B
C
41 lines
930 B
C
/*
|
|
* Filename: fm_core.c
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
* Version:
|
|
* Created: Thu Oct 31 02:06:11 2019
|
|
* Revision: None
|
|
* Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws
|
|
*
|
|
*/
|
|
|
|
#include "../common.h"
|
|
#include "../utils/envelope.h"
|
|
#include "fm_core.h"
|
|
#include <math.h>
|
|
#include <stdlib.h>
|
|
|
|
float core_fm_run(Operator* self, EngineState * t,float phase) {
|
|
self->e.gate = self->gate;
|
|
float out = 0;
|
|
out = sin(2 * M_PI * t->t * (self->mul * self->freq) / 44100 + ((self->feedback_level > 0.0) ? self->feedback_buffer : phase));
|
|
out *= (self->level * self->e.process(&self->e,t));
|
|
self->feedback_buffer = out;
|
|
return out;
|
|
}
|
|
|
|
Operator* operator_new() {
|
|
Operator *o = malloc(sizeof(Operator));
|
|
Envelope e = *envelope_new();
|
|
o->level = 1.0;
|
|
o->e = e;
|
|
o->gate = false;
|
|
o->feedback_level = 0.0;
|
|
o->run = core_fm_run;
|
|
o->feedback_buffer = 0.0;
|
|
return o;
|
|
}
|
|
|