lots of mods.:
parent
80d58f65b6
commit
60fd399e44
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ) );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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]);
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue