summaryrefslogtreecommitdiff
path: root/libs/plugins/reasonablesynth.lv2
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-01-20 21:42:47 +0100
committerRobin Gareus <robin@gareus.org>2014-01-22 15:30:38 +0100
commit114997b7e65c4c4fdab7870d6bac411752f6875a (patch)
treebcdf92ebc5ba9479fab65a6694045b1e7c99b7b7 /libs/plugins/reasonablesynth.lv2
parent224b44c6e225a683a6ba18eef85e2798fdda514e (diff)
tweak reasonable synth:
* prevent denormals / cut low volume * reduce default amplitude of fundamental
Diffstat (limited to 'libs/plugins/reasonablesynth.lv2')
-rw-r--r--libs/plugins/reasonablesynth.lv2/rsynth.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/libs/plugins/reasonablesynth.lv2/rsynth.c b/libs/plugins/reasonablesynth.lv2/rsynth.c
index a6c74aa26c..3f3db579b8 100644
--- a/libs/plugins/reasonablesynth.lv2/rsynth.c
+++ b/libs/plugins/reasonablesynth.lv2/rsynth.c
@@ -185,23 +185,26 @@ static void synthesize_sineP (RSSynthChannel* sc,
for (i=0; i < n_samples; ++i) {
float env = adsr_env(sc, note);
if (sc->adsr_cnt[note] == 0) break;
- const float amp = vol * env;
-
- left[i] += amp * sinf(2.0 * M_PI * phase);
- left[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
- left[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
- left[i] += .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
- //left[i] -= .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
- //left[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
- left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
- phase += fq;
- right[i] += amp * sinf(2.0 * M_PI * phase);
- right[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
- right[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
- right[i] -= .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
- //right[i] += .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
- //right[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
- right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
+ const float amp = vol * env * .6;
+ if (amp > 1e-10) {
+ left[i] += amp * sinf(2.0 * M_PI * phase);
+ left[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
+ left[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
+ left[i] += .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
+ //left[i] -= .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
+ //left[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
+ left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
+ phase += fq;
+ right[i] += amp * sinf(2.0 * M_PI * phase);
+ right[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
+ right[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
+ right[i] -= .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
+ //right[i] += .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
+ //right[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
+ right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
+ } else {
+ phase += fq;
+ }
if (phase > 1.0) phase -= 2.0;
}
sc->phase[note] = phase;