lots of mods.:

master
Rachel Fae Fox (foxiepaws) 2019-10-31 18:59:57 -04:00
parent 80d58f65b6
commit 60fd399e44
7 changed files with 117 additions and 12 deletions

View File

@ -16,8 +16,8 @@
#include <stdlib.h> #include <stdlib.h>
float fm2_process(struct FM2 *self, EngineState *t) { float fm2_process(struct FM2 *self, EngineState *t) {
self->Carrier.gate=self->gate; self->Carrier.freq=self->Modulator.freq=self->freq;
self->Modulator.gate=self->gate; self->Carrier.gate=self->Modulator.gate=self->gate;
switch (self->Algorithm) { switch (self->Algorithm) {
case _fm2_0: case _fm2_0:
__asm ("nop"); __asm ("nop");

View File

@ -33,7 +33,7 @@ Operator* operator_new() {
o->e = e; o->e = e;
o->gate = false; o->gate = false;
o->feedback_level = 0.0; o->feedback_level = 0.0;
o->run = core_fm_run o->run = core_fm_run;
o->feedback_buffer = 0.0; o->feedback_buffer = 0.0;
return o; return o;
} }

View File

@ -21,10 +21,12 @@
#include <unistd.h> #include <unistd.h>
#include "common.h" #include "common.h"
#include "synths/basic.h" #include "synths/basic.h"
#include "synths/fm_2op.h"
#include "filters/svf.h" #include "filters/svf.h"
#include "utils/envelope.h" #include "utils/envelope.h"
#include "utils/lfo.h" #include "utils/lfo.h"
#include "utils/seq.h"
#include <string.h>
#define SAMPLE_RATE (44100) #define SAMPLE_RATE (44100)
@ -35,6 +37,8 @@ Basic saw;
SVF filt; SVF filt;
LFO lfo; LFO lfo;
static EngineState data; static EngineState data;
FM2 fm2;
Seq s;
int mycallback( const void *input, int mycallback( const void *input,
void *output, void *output,
@ -51,7 +55,9 @@ int mycallback( const void *input,
{ {
//filt.process(&filt, (saw.process(&saw,data))); //filt.process(&filt, (saw.process(&saw,data)));
//float a = filt.low; //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); //filt.process(&filt,a);
//a = filt.low; //a = filt.low;
*out++ = a; *out++ = a;
@ -84,18 +90,37 @@ int main(int argc, char**argv) {
"max channels\tin: %d\tout: %d\n" "max channels\tin: %d\tout: %d\n"
"samplerate: %f",deviceInfo->name,deviceInfo->maxInputChannels,deviceInfo->maxOutputChannels,deviceInfo->defaultSampleRate); "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(); Envelope b = *envelope_new();
b.attack = 44100*2; b.attack = 44100;
b.release = 44100/2; b.release = 44100/2;
b.ar = true; b.ar = true;
b.sustain = 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 = *basic_new(_waveform_sine, b);
saw.amp = 1.0f; saw.amp = 1.0f;
saw.pwm = 0.5; saw.pwm = 0.5;
saw.freq = 440; saw.freq = 440;
saw.gate = false; saw.gate = false;
filt = *svf_new(7000.0f, 0.5f); filt = *svf_new(7000.0f, 0.5f); */
//data.sample_rate=SAMPLE_RATE; //data.sample_rate=SAMPLE_RATE;
PaStream *stream; PaStream *stream;
/* Open an audio I/O stream. */ /* Open an audio I/O stream. */
@ -112,11 +137,14 @@ int main(int argc, char**argv) {
err = Pa_StartStream( stream ); err = Pa_StartStream( stream );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
/* start anything intersting */ /* start anything intersting */
saw.gate = true; /* saw.gate = true;
sleep(5); sleep(5);
saw.gate = false; saw.gate = false;
sleep(5);*/
fm2.gate = true;
sleep(6);
fm2.gate=false;
sleep(5); sleep(5);
/* more crap */ /* more crap */
error: error:
printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) ); printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) );

View File

@ -13,6 +13,7 @@
#include "../common.h" #include "../common.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
typedef enum EnvState {_e_off,_e_attack, _e_attackrelease, _e_decay, _e_sustain,_e_release, _e_finished} EnvState; 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 min_level;
float level; float level;
bool gate; bool gate;
unsigned int t; unsigned long int t;
EnvState envstate; EnvState envstate;
bool ar; bool ar;
bool sustain; bool sustain;
@ -59,6 +60,7 @@ typedef struct Envelope {
float envelope_process(Envelope *self, EngineState *t) { float envelope_process(Envelope *self, EngineState *t) {
switch (self->envstate) { switch (self->envstate) {
case _e_off: case _e_off:
//printf("_off\n");
if (self->gate) { if (self->gate) {
self->t = 0; self->t = 0;
self->envstate = _e_attack; self->envstate = _e_attack;
@ -66,6 +68,7 @@ float envelope_process(Envelope *self, EngineState *t) {
} }
break; break;
case _e_attack: case _e_attack:
//printf("_attack: %i\n", self->t);
if (self->gate) { if (self->gate) {
if ( self->t < self->attack ) { if ( self->t < self->attack ) {
float stepsize = (self->max_level - self->min_level) / self->attack; float stepsize = (self->max_level - self->min_level) / self->attack;
@ -88,6 +91,7 @@ float envelope_process(Envelope *self, EngineState *t) {
} }
break; break;
case _e_decay: case _e_decay:
// printf("_decay: %i\n", self->t);
if (self->gate) { if (self->gate) {
if (self->t < self->decay) { if (self->t < self->decay) {
float stepsize = (self->max_level - self->sustain_level) / self->decay; float stepsize = (self->max_level - self->sustain_level) / self->decay;
@ -104,6 +108,7 @@ float envelope_process(Envelope *self, EngineState *t) {
} }
break; break;
case _e_sustain: case _e_sustain:
//printf("_sustain\n", self->t);
if (!self->sustain) { if (!self->sustain) {
self->envstate = _e_release; self->envstate = _e_release;
self->t = 0; self->t = 0;
@ -121,6 +126,7 @@ float envelope_process(Envelope *self, EngineState *t) {
return self->sustain_level; return self->sustain_level;
break; break;
case _e_release: case _e_release:
// printf("_release: %i\n", self->t);
if (self->gate && self->sustain) { if (self->gate && self->sustain) {
// reset envelope. // reset envelope.
self->envstate=_e_off; self->envstate=_e_off;

View File

@ -27,7 +27,7 @@ typedef struct Envelope {
float min_level; float min_level;
float level; float level;
bool gate; bool gate;
unsigned int t; unsigned long t;
EnvState envstate; EnvState envstate;
bool ar; bool ar;
bool sustain; bool sustain;

39
src/utils/seq.c Normal file
View File

@ -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 <math.h>
#include <stdlib.h>
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]);
}

32
src/utils/seq.h Normal file
View File

@ -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 <stdbool.h>
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