summaryrefslogtreecommitdiffstats
path: root/src/synth_engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth_engine.c')
-rw-r--r--src/synth_engine.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/synth_engine.c b/src/synth_engine.c
index fc0a53d..6bd6bf6 100644
--- a/src/synth_engine.c
+++ b/src/synth_engine.c
@@ -127,10 +127,10 @@ gen1(float f, unsigned long long phase, float x, unsigned int sample_rate)
float
gen2(float f, unsigned long long phase, float x, unsigned int sample_rate)
{
- return sin_sample(0.5, f * sqrt(2) , phase, sample_rate)
- + sin_sample(0.5, f, phase, sample_rate);
+ /* return sin_sample(0.5, f * sqrt(2) , phase, sample_rate) */
+ /* + sin_sample(0.5, f, phase, sample_rate); */
- /* sawX_sample(1, synth->freq, 5, phase, sample_rate); */
+ return sawX_sample(1, f, 5, phase, sample_rate);
}
float
@@ -151,10 +151,14 @@ make_sample(unsigned long long phase, void *synthData, unsigned int sample_rate,
//LFO!
//if (synth->adsr.elapsed > SAMPLE_RATE / 2) synth->adsr.elapsed = 0;
-
- int n = 1;
- for (int i = 0; i < n; i++) {
- sample += (1.0 / n) * synth->gen[synth->geni](synth->n.freq + synth->freq_offset, phase, synth->x, sample_rate);
+
+ if (synth->poly) {
+ int n = synth->notes_active;
+ for (int i = 0; i < n; i++) {
+ sample += (1.0 / n) * synth->gen[synth->geni](synth->freq[i] + synth->freq_offset, synth->freq_count[i], synth->x, sample_rate);
+ }
+ } else {
+ sample = synth->gen[synth->geni](synth->n.freq + synth->freq_offset, phase, synth->x, sample_rate);
}
if (!viz && synth->filter) {
@@ -202,7 +206,7 @@ sound_gen(const void *inputBuffer, void *outputBuffer,
continue;
}
if (adsr_amplitude(synth, synth->adsr.elapsed) == 0 && synth->n.noteOff != 0) {
- printf("SYNTH OPFF\n");
+ //printf("SYNTH OPFF\n");
synth->active = 0;
*out++ = 0.0f;
*out++ = 0.0f;
@@ -213,7 +217,13 @@ sound_gen(const void *inputBuffer, void *outputBuffer,
*out++ = s;
synth->adsr.elapsed++;
synth->n.elapsed++;
+ for (int j = 0; j < synth->notes_active; j++) {
+ synth->freq_count[j]++;
+ }
if (!synth->multi) {
+ for (int j = 0; j < synth->notes_active; j++) {
+ if (synth->freq_count[j] >= (1.0 / synth->freq[i]) * SAMPLE_RATE) synth->freq_count[j] = 0;
+ }
if (synth->n.elapsed >= (1.0 / synth->n.freq) * SAMPLE_RATE) synth->n.elapsed = 0;
} else {
@@ -230,13 +240,18 @@ init_synth(synth_t * synth)
synth->gain = 1;
synth->x = 1;
+ synth->notes_active = 0;
+ for (int i = 0; i<100;i++) {
+ synth->freq[i] = 0;
+ synth->freq_count[i] = 0;
+ }
+
synth->n.freq = 0;
synth->n.noteOn = 0;
synth->n.noteOff = 1;
synth->n.key = 0;
synth->n.elapsed = 0;
-
synth->adsr.a = 0.0;
synth->adsr.peak = 1.0f;
synth->adsr.d = 0.3;
@@ -246,6 +261,7 @@ init_synth(synth_t * synth)
synth->octave = 3;
+ synth->poly = 0;
synth->multi = 0;
synth->filter = 0;
synth->cutoff = 22000.0f;