summaryrefslogtreecommitdiffstats
path: root/src/generator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/generator.h')
-rw-r--r--src/generator.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/generator.h b/src/generator.h
new file mode 100644
index 0000000..df90578
--- /dev/null
+++ b/src/generator.h
@@ -0,0 +1,69 @@
+#ifndef GENERATOR_H
+#define GENERATOR_H
+
+#include "adsr.h"
+#include "osc.h"
+#include "synth_engine.h"
+
+#define MAX_CMP 64
+
+enum osc_enum {
+ SIN,
+ SAW,
+ DIGISAW,
+ TRI,
+ SQR
+};
+
+enum adsr_type {
+ LINEAR,
+ CUBIC
+};
+
+enum target_enum {
+ OSC_FREQ,
+ OSC_AMP,
+ ADSR_AMP,
+ OUTPUT
+};
+
+// ints are:
+// negative if false
+// the id of the component if true
+typedef struct sound_node {
+ int osc;
+ enum osc_enum osc_type;
+ int lfo;
+ enum adsr_enum adsr_type;
+ int adsr;
+ float target_amp;
+ enum target_enum target;
+
+ struct sound_node ** children;
+ int n;
+} sound_node;
+
+struct generator {
+ // list of indexes for oscilators, lfos and adsrs
+ float osc[MAX_CMP];
+ float lfo[MAX_CMP];
+ float adsr[MAX_CMP];
+
+ // need to include some info about the wiring of the oscs lfos and adsrs
+ // e.g. :
+ // adsr 0 -> osc 0 frequency
+ // lfo 0 -> osc 0 frequency
+ // lfo 1 -> lfo 0 frequency
+ // osc 0 -> output
+
+ //o0-saw:l0-sin:l1-sin:a0-linear
+ //a0-o0/frequency:l0-o0/frequency:l1-l0/frequency:o0-1
+};
+
+int sound_tree_add_node(sound_node * root, const char * cmp);
+
+// needs to "play" the wiring defined in the struct
+// using sounds from `s` and the midi note `i`
+float generate(generator * g, synth_t * s, int i);
+
+#endif /* GENERATOR_H */