From 60fd399e444910af5f6b86221e8f3f77c8c29f98 Mon Sep 17 00:00:00 2001 From: "Rachel Fae Fox (foxiepaws)" Date: Thu, 31 Oct 2019 18:59:57 -0400 Subject: [PATCH] lots of mods.: --- src/synths/fm_2op.c | 4 ++-- src/synths/fm_core.c | 2 +- src/synththing.c | 42 +++++++++++++++++++++++++++++++++++------- src/utils/envelope.c | 8 +++++++- src/utils/envelope.h | 2 +- src/utils/seq.c | 39 +++++++++++++++++++++++++++++++++++++++ src/utils/seq.h | 32 ++++++++++++++++++++++++++++++++ 7 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 src/utils/seq.c create mode 100644 src/utils/seq.h diff --git a/src/synths/fm_2op.c b/src/synths/fm_2op.c index 32fb101..c6602df 100644 --- a/src/synths/fm_2op.c +++ b/src/synths/fm_2op.c @@ -16,8 +16,8 @@ #include float fm2_process(struct FM2 *self, EngineState *t) { - self->Carrier.gate=self->gate; - self->Modulator.gate=self->gate; + self->Carrier.freq=self->Modulator.freq=self->freq; + self->Carrier.gate=self->Modulator.gate=self->gate; switch (self->Algorithm) { case _fm2_0: __asm ("nop"); diff --git a/src/synths/fm_core.c b/src/synths/fm_core.c index 49e262d..07534e7 100644 --- a/src/synths/fm_core.c +++ b/src/synths/fm_core.c @@ -33,7 +33,7 @@ Operator* operator_new() { o->e = e; o->gate = false; o->feedback_level = 0.0; - o->run = core_fm_run + o->run = core_fm_run; o->feedback_buffer = 0.0; return o; } diff --git a/src/synththing.c b/src/synththing.c index 445a5c7..6b7d891 100644 --- a/src/synththing.c +++ b/src/synththing.c @@ -21,10 +21,12 @@ #include #include "common.h" #include "synths/basic.h" +#include "synths/fm_2op.h" #include "filters/svf.h" #include "utils/envelope.h" #include "utils/lfo.h" - +#include "utils/seq.h" +#include #define SAMPLE_RATE (44100) @@ -35,6 +37,8 @@ Basic saw; SVF filt; LFO lfo; static EngineState data; +FM2 fm2; +Seq s; int mycallback( const void *input, void *output, @@ -51,7 +55,9 @@ int mycallback( const void *input, { //filt.process(&filt, (saw.process(&saw,data))); //float a = filt.low; - float a = 0.5 * saw.process(&saw,data); + fm2.freq = s.out; + s.run(&s); + float a = 0.5 * fm2.process(&fm2,data); //filt.process(&filt,a); //a = filt.low; *out++ = a; @@ -84,18 +90,37 @@ int main(int argc, char**argv) { "max channels\tin: %d\tout: %d\n" "samplerate: %f",deviceInfo->name,deviceInfo->maxInputChannels,deviceInfo->maxOutputChannels,deviceInfo->defaultSampleRate); } - + s = *seq_new(); + s.steps = 3; + midinote m[] = {60, 64, 67}; + s.notes = malloc(sizeof(char) * 3); + memcpy(s.notes,m,3); + s.wait = 22050; + Envelope c = *envelope_new(); + c.sustain = true; + c.ar = true; + c.release = 44100*3; Envelope b = *envelope_new(); - b.attack = 44100*2; + b.attack = 44100; b.release = 44100/2; b.ar = true; b.sustain = true; + fm2 = *fm2_new(); + fm2.Carrier.level = 1.0; + fm2.Carrier.mul = 1.0; + fm2.Carrier.e = c; + fm2.Modulator.level = 1.0; + fm2.Modulator.mul = 0.5; + fm2.Modulator.e = b; + fm2.freq = 440; + + /* saw = *basic_new(_waveform_sine, b); saw.amp = 1.0f; saw.pwm = 0.5; saw.freq = 440; saw.gate = false; - filt = *svf_new(7000.0f, 0.5f); + filt = *svf_new(7000.0f, 0.5f); */ //data.sample_rate=SAMPLE_RATE; PaStream *stream; /* Open an audio I/O stream. */ @@ -112,11 +137,14 @@ int main(int argc, char**argv) { err = Pa_StartStream( stream ); if( err != paNoError ) goto error; /* start anything intersting */ - saw.gate = true; + /* saw.gate = true; sleep(5); saw.gate = false; + sleep(5);*/ + fm2.gate = true; + sleep(6); + fm2.gate=false; sleep(5); - /* more crap */ error: printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) ); diff --git a/src/utils/envelope.c b/src/utils/envelope.c index 818d64b..5b8aec3 100644 --- a/src/utils/envelope.c +++ b/src/utils/envelope.c @@ -13,6 +13,7 @@ #include "../common.h" #include #include +#include typedef enum EnvState {_e_off,_e_attack, _e_attackrelease, _e_decay, _e_sustain,_e_release, _e_finished} EnvState; @@ -26,7 +27,7 @@ typedef struct Envelope { float min_level; float level; bool gate; - unsigned int t; + unsigned long int t; EnvState envstate; bool ar; bool sustain; @@ -59,6 +60,7 @@ typedef struct Envelope { float envelope_process(Envelope *self, EngineState *t) { switch (self->envstate) { case _e_off: + //printf("_off\n"); if (self->gate) { self->t = 0; self->envstate = _e_attack; @@ -66,6 +68,7 @@ float envelope_process(Envelope *self, EngineState *t) { } break; case _e_attack: + //printf("_attack: %i\n", self->t); if (self->gate) { if ( self->t < self->attack ) { float stepsize = (self->max_level - self->min_level) / self->attack; @@ -88,6 +91,7 @@ float envelope_process(Envelope *self, EngineState *t) { } break; case _e_decay: + // printf("_decay: %i\n", self->t); if (self->gate) { if (self->t < self->decay) { float stepsize = (self->max_level - self->sustain_level) / self->decay; @@ -104,6 +108,7 @@ float envelope_process(Envelope *self, EngineState *t) { } break; case _e_sustain: + //printf("_sustain\n", self->t); if (!self->sustain) { self->envstate = _e_release; self->t = 0; @@ -121,6 +126,7 @@ float envelope_process(Envelope *self, EngineState *t) { return self->sustain_level; break; case _e_release: + // printf("_release: %i\n", self->t); if (self->gate && self->sustain) { // reset envelope. self->envstate=_e_off; diff --git a/src/utils/envelope.h b/src/utils/envelope.h index d5c91b6..dadd7e4 100644 --- a/src/utils/envelope.h +++ b/src/utils/envelope.h @@ -27,7 +27,7 @@ typedef struct Envelope { float min_level; float level; bool gate; - unsigned int t; + unsigned long t; EnvState envstate; bool ar; bool sustain; diff --git a/src/utils/seq.c b/src/utils/seq.c new file mode 100644 index 0000000..d7168dd --- /dev/null +++ b/src/utils/seq.c @@ -0,0 +1,39 @@ +/* + * Filename: seq.h + * + * Description: + * + * + * Version: + * Created: Thu Oct 31 15:39:38 2019 + * Revision: None + * Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws + * + */ + +#include "seq.h" +#include +#include + + +float get_freq(midinote n) { + return pow(2.0,(((float)n-69.0)/12.0)) * 440.0; +} +Seq* seq_new() { + Seq *s = malloc(sizeof(Seq)); + s->step = 0; + s->run = seq_run; + s->t = 0; + return s; +} +void seq_run(Seq *self) { + __asm("nop"); + if (self->t < self->wait) { + self->t++; + } else { + self->t = 0; + self->step = (self->step < self->steps) ? self->step+1 : 0; + } + self->out = get_freq(self->notes[self->step]); +} + diff --git a/src/utils/seq.h b/src/utils/seq.h new file mode 100644 index 0000000..c391c8c --- /dev/null +++ b/src/utils/seq.h @@ -0,0 +1,32 @@ +/* + * Filename: seq.h + * + * Description: + * + * + * Version: + * Created: Thu Oct 31 15:39:38 2019 + * Revision: None + * Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws + * + */ + +#ifndef _H_SEQ +#define _H_SEQ +#include + +typedef char midinote; +typedef struct Seq { + unsigned int steps; + unsigned long t; + unsigned int step; + unsigned int wait; + float out; + void(*run)(struct Seq*); + midinote *notes; +} Seq; + +Seq* seq_new(); +void seq_run(Seq*); + +#endif