diff options
author | gramanas <anastasis.gramm2@gmail.com> | 2023-04-18 23:33:12 +0300 |
---|---|---|
committer | gramanas <anastasis.gramm2@gmail.com> | 2023-04-18 23:37:37 +0300 |
commit | 7cd2ef47ccf7730ada9a61deacfce6ea03b5516d (patch) | |
tree | 5fcb923d4143683450ca21af1ce7faca4a0960d8 /src/synth_engine.c | |
parent | 560356027650af8cd3dcc21888cdc3a76382ea5d (diff) | |
download | synth-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.c | 30 |
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; |