summaryrefslogtreecommitdiffstats
path: root/src/synth_engine.c
diff options
context:
space:
mode:
authorgramanas <anastasis.gramm2@gmail.com>2023-04-18 23:33:12 +0300
committergramanas <anastasis.gramm2@gmail.com>2023-04-18 23:37:37 +0300
commit7cd2ef47ccf7730ada9a61deacfce6ea03b5516d (patch)
tree5fcb923d4143683450ca21af1ce7faca4a0960d8 /src/synth_engine.c
parent560356027650af8cd3dcc21888cdc3a76382ea5d (diff)
downloadsynth-project-7cd2ef47ccf7730ada9a61deacfce6ea03b5516d.tar.gz
synth-project-7cd2ef47ccf7730ada9a61deacfce6ea03b5516d.tar.bz2
synth-project-7cd2ef47ccf7730ada9a61deacfce6ea03b5516d.zip
Add adsr peak
Diffstat (limited to 'src/synth_engine.c')
-rw-r--r--src/synth_engine.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/synth_engine.c b/src/synth_engine.c
index 41756c7..fc0a53d 100644
--- a/src/synth_engine.c
+++ b/src/synth_engine.c
@@ -20,13 +20,21 @@ convole(float *signal, float *filter, size_t signal_size, size_t filter_size, fl
}
float
+clamp(float f)
+{
+ if (f <= -1) return -0.9999;
+ if (f >= 1) return 0.9999;
+ return f;
+}
+
+float
adsr_amplitude(void *synthData, unsigned long long elapsed)
{
synth_t *synth = (synth_t*)synthData;
float dAmplitude = 0.0;
float dReleaseAmplitude = 0.0;
- float dStartAmplitude = 1.0;
+ float dStartAmplitude = synth->adsr.peak;
float dLifeTime = (elapsed * (1.0 / (float)SAMPLE_RATE));
@@ -60,7 +68,7 @@ adsr_amplitude(void *synthData, unsigned long long elapsed)
if (dAmplitude <= 0.000)
dAmplitude = 0.0;
- return dAmplitude;
+ return clamp(dAmplitude);
}
@@ -128,18 +136,11 @@ gen2(float f, unsigned long long phase, float x, unsigned int sample_rate)
float
gen3(float f, unsigned long long phase, float x, unsigned int sample_rate)
{
- return sawX_sample(0.7, f, 5, phase, sample_rate)
- + sin_sample(0.3, 4.0/17.0*f, phase, sample_rate);
- /* return sawX_sample(0.5, f * (1 + sqrt(5)) / 2, 5, phase, sample_rate) */
- /* + sin_sample(0.3, f * x, phase, sample_rate) */
- /* + sqr_sample(0.2, f * x, 0.2 * x * x, phase, sample_rate); */
-}
-
-float
-clamp(float f)
-{
- if (f <= -1) return -0.9999;
- if (f >= 1) return 0.9999;
+ /* return sawX_sample(0.7, f, 5, phase, sample_rate) */
+ /* + sin_sample(0.3, 4.0/17.0*f, phase, sample_rate); */
+ return saw_sample(0.5, f * (1 + sqrt(5)) / 2, phase, sample_rate)
+ + sin_sample(0.3, f * x, phase, sample_rate)
+ + sqr_sample(0.2, f * x, 0.2 * x * x, phase, sample_rate);
}
float
@@ -237,6 +238,7 @@ init_synth(synth_t * synth)
synth->adsr.a = 0.0;
+ synth->adsr.peak = 1.0f;
synth->adsr.d = 0.3;
synth->adsr.s = 0.7;
synth->adsr.r = 0.4;