lots of mods.:
parent
80d58f65b6
commit
60fd399e44
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 ) );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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