[SCM] calf/master: + Monosynth: inertia for cutoff knob (1/30s ought to be enough for everybody)

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:39:17 UTC 2013


The following commit has been merged in the master branch:
commit ca5d56cc7c641a86c0267f0226279c104bcd44ce
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Wed Feb 4 00:07:14 2009 +0000

    + Monosynth: inertia for cutoff knob (1/30s ought to be enough for everybody)

diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index 712434d..9bf2349 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -64,7 +64,9 @@ public:
     dsp::adsr envelope;
     dsp::keystack stack;
     dsp::gain_smoothing master;
+    dsp::inertia<dsp::exponential_ramp> inertia_cutoff;
     
+    monosynth_audio_module();
     static void precalculate_waves(progress_report_iface *reporter);
     void set_sample_rate(uint32_t sr);
     void delayed_note_on();
diff --git a/src/monosynth.cpp b/src/monosynth.cpp
index 81b6a5c..d835d9a 100644
--- a/src/monosynth.cpp
+++ b/src/monosynth.cpp
@@ -34,6 +34,11 @@ using namespace std;
 
 float silence[4097];
 
+monosynth_audio_module::monosynth_audio_module()
+: inertia_cutoff(exponential_ramp(1))
+{
+}
+
 void monosynth_audio_module::activate() {
     running = false;
     output_pos = 0;
@@ -229,7 +234,7 @@ void monosynth_audio_module::calculate_buffer_oscs(float lfo)
     {
         float osc1val = osc1.get_phaseshifted(shift1, mix1);
         float osc2val = osc2.get_phaseshifted(shift2, mix2);
-        float wave = fgain * (osc1val + (osc2val - osc1val) * xfade);
+        float wave = osc1val + (osc2val - osc1val) * xfade;
         buffer[i] = wave;
         shift1 += shift_delta;
         shift2 += shift_delta;
@@ -241,7 +246,7 @@ void monosynth_audio_module::calculate_buffer_ser()
 {
     for (uint32_t i = 0; i < step_size; i++) 
     {
-        float wave = buffer[i];
+        float wave = buffer[i] * fgain;
         wave = filter.process(wave);
         wave = filter2.process(wave);
         buffer[i] = wave;
@@ -253,7 +258,7 @@ void monosynth_audio_module::calculate_buffer_single()
 {
     for (uint32_t i = 0; i < step_size; i++) 
     {
-        float wave = buffer[i];
+        float wave = buffer[i] * fgain;
         wave = filter.process(wave);
         buffer[i] = wave;
         fgain += fgain_delta;
@@ -264,7 +269,7 @@ void monosynth_audio_module::calculate_buffer_stereo()
 {
     for (uint32_t i = 0; i < step_size; i++) 
     {
-        float wave1 = buffer[i];
+        float wave1 = buffer[i] * fgain;
         float wave2 = phaseshifter.process_ap(wave1);
         buffer[i] = fgain * filter.process(wave1);
         buffer2[i] = fgain * filter2.process(wave2);
@@ -341,6 +346,7 @@ void monosynth_audio_module::set_sample_rate(uint32_t sr) {
     phaseshifter.set_ap(1000.f, sr);
     fgain = 0.f;
     fgain_delta = 0.f;
+    inertia_cutoff.ramp.set_length(crate / 30); // 1/30s
 }
 
 void monosynth_audio_module::calculate_step()
@@ -378,7 +384,8 @@ void monosynth_audio_module::calculate_step()
     set_frequency();
     envelope.advance();
     float env = envelope.value;
-    cutoff = *params[par_cutoff] * pow(2.0f, (lfov * *params[par_lfofilter] + env * fltctl * *params[par_envmod]) * (1.f / 1200.f));
+    inertia_cutoff.set_inertia(*params[par_cutoff]);
+    cutoff = inertia_cutoff.get() * pow(2.0f, (lfov * *params[par_lfofilter] + env * fltctl * *params[par_envmod]) * (1.f / 1200.f));
     if (*params[par_keyfollow] > 0.01f)
         cutoff *= pow(freq / 264.f, *params[par_keyfollow]);
     cutoff = dsp::clip(cutoff , 10.f, 18000.f);

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list