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>
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");

View File

@ -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;
}

View File

@ -21,10 +21,12 @@
#include <unistd.h>
#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 <string.h>
#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 ) );

View File

@ -13,6 +13,7 @@
#include "../common.h"
#include <stdbool.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;
@ -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;

View File

@ -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;

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