[SCM] calf/master: + Wavetable: implement velocity scaling, update presets

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


The following commit has been merged in the master branch:
commit b2d94bbae4549075f09f7eeefb8aaf542f3e7398
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Wed Mar 4 22:11:47 2009 +0000

    + Wavetable: implement velocity scaling, update presets

diff --git a/presets.xml b/presets.xml
index dbebfd7..945f4ee 100644
--- a/presets.xml
+++ b/presets.xml
@@ -3900,12 +3900,12 @@
   <param name="adsr_d" value="1274.22" />
   <param name="adsr_s" value="0.39" />
   <param name="adsr_r" value="50" />
-  <param name="adsr_v" value="0" />
+  <param name="adsr_v" value="1" />
   <param name="adsr2_a" value="1" />
   <param name="adsr2_d" value="60.93" />
   <param name="adsr2_s" value="0" />
   <param name="adsr2_r" value="50" />
-  <param name="adsr2_v" value="0" />
+  <param name="adsr2_v" value="1" />
   <param name="adsr3_a" value="1" />
   <param name="adsr3_d" value="350" />
   <param name="adsr3_s" value="0.5" />
@@ -3927,12 +3927,12 @@
   <param name="adsr_d" value="350" />
   <param name="adsr_s" value="0.5" />
   <param name="adsr_r" value="50" />
-  <param name="adsr_v" value="0" />
+  <param name="adsr_v" value="1" />
   <param name="adsr2_a" value="1" />
   <param name="adsr2_d" value="350" />
   <param name="adsr2_s" value="0.5" />
   <param name="adsr2_r" value="50" />
-  <param name="adsr2_v" value="0" />
+  <param name="adsr2_v" value="1" />
   <param name="adsr3_a" value="1" />
   <param name="adsr3_d" value="350" />
   <param name="adsr3_s" value="0.5" />
@@ -3954,12 +3954,12 @@
   <param name="adsr_d" value="1863.35" />
   <param name="adsr_s" value="0.03" />
   <param name="adsr_r" value="50" />
-  <param name="adsr_v" value="0" />
+  <param name="adsr_v" value="0.5" />
   <param name="adsr2_a" value="1" />
   <param name="adsr2_d" value="350" />
   <param name="adsr2_s" value="0.5" />
   <param name="adsr2_r" value="50" />
-  <param name="adsr2_v" value="0" />
+  <param name="adsr2_v" value="1" />
   <param name="adsr3_a" value="1" />
   <param name="adsr3_d" value="350" />
   <param name="adsr3_s" value="0.5" />
@@ -3981,12 +3981,12 @@
   <param name="adsr_d" value="350" />
   <param name="adsr_s" value="0.5" />
   <param name="adsr_r" value="50" />
-  <param name="adsr_v" value="0" />
+  <param name="adsr_v" value="1" />
   <param name="adsr2_a" value="1" />
   <param name="adsr2_d" value="350" />
   <param name="adsr2_s" value="0.5" />
   <param name="adsr2_r" value="50" />
-  <param name="adsr2_v" value="0" />
+  <param name="adsr2_v" value="1" />
   <param name="adsr3_a" value="1" />
   <param name="adsr3_d" value="350" />
   <param name="adsr3_s" value="0.5" />
@@ -4008,12 +4008,12 @@
   <param name="adsr_d" value="350" />
   <param name="adsr_s" value="0.5" />
   <param name="adsr_r" value="50" />
-  <param name="adsr_v" value="0" />
+  <param name="adsr_v" value="1" />
   <param name="adsr2_a" value="1" />
   <param name="adsr2_d" value="350" />
   <param name="adsr2_s" value="0.5" />
   <param name="adsr2_r" value="50" />
-  <param name="adsr2_v" value="0" />
+  <param name="adsr2_v" value="1" />
   <param name="adsr3_a" value="1" />
   <param name="adsr3_d" value="350" />
   <param name="adsr3_s" value="0.5" />
@@ -4062,12 +4062,12 @@
   <param name="adsr_d" value="350" />
   <param name="adsr_s" value="0.5" />
   <param name="adsr_r" value="50" />
-  <param name="adsr_v" value="0" />
+  <param name="adsr_v" value="1" />
   <param name="adsr2_a" value="1" />
   <param name="adsr2_d" value="350" />
   <param name="adsr2_s" value="0.5" />
   <param name="adsr2_r" value="50" />
-  <param name="adsr2_v" value="0" />
+  <param name="adsr2_v" value="1" />
   <param name="adsr3_a" value="1" />
   <param name="adsr3_d" value="350" />
   <param name="adsr3_s" value="0.5" />
diff --git a/src/calf/envelope.h b/src/calf/envelope.h
index a570347..a6fd843 100644
--- a/src/calf/envelope.h
+++ b/src/calf/envelope.h
@@ -55,6 +55,8 @@ public:
     /// Sustain level used for the current note (used to calculate release rate if sustain changed during release stage
     /// of the current note)
     double thiss;
+    /// Value from the time before advance() was called last time
+    double old_value;
     
     adsr()
     {
@@ -64,8 +66,8 @@ public:
     /// Stop (reset) the envelope
     inline void reset()
     {
-        value = 0.f;
-        thiss = 0.f;
+        old_value = value = 0.0;
+        thiss = 0.0;
         state = STOP;
     }
     /// Set the envelope parameters (updates rate member variables based on values passed)
@@ -129,6 +131,7 @@ public:
     /// Calculate next envelope value
     inline void advance()
     {
+        old_value = value;
         // XXXKF This may use a state array instead of a switch some day (at least for phases other than attack and possibly sustain)
         switch(state)
         {
@@ -176,6 +179,12 @@ public:
             break;
         }
     }
+    /// Return a value between old_value (previous step) and value (current step)
+    /// @param pos between 0 and 1
+    inline double interpolate(double pos)
+    {
+        return old_value + (value - old_value) * pos;
+    }
 };
 
 };
diff --git a/src/wavetable.cpp b/src/wavetable.cpp
index e698928..3e0db89 100644
--- a/src/wavetable.cpp
+++ b/src/wavetable.cpp
@@ -82,6 +82,8 @@ void wavetable_voice::render_block()
 {
     typedef wavetable_metadata md;
     
+    const float step = 1.f / BlockSize;
+
     int ospc = md::par_o2level - md::par_o1level;
     int espc = md::par_eg2attack - md::par_eg1attack;
     for (int j = 0; j < OscCount; j++) {
@@ -89,20 +91,22 @@ void wavetable_voice::render_block()
         oscs[j].set_freq(note_to_hz(note, *params[md::par_o1transpose + j * ospc] * 100+ *params[md::par_o1detune + j * ospc]), sample_rate);
     }
     float s = 0.001;
+    float scl[EnvCount];
     for (int j = 0; j < EnvCount; j++) {
         int o = j*espc;
         envs[j].set(*params[md::par_eg1attack + o] * s, *params[md::par_eg1decay + o] * s, *params[md::par_eg1sustain + o], *params[md::par_eg1release + o] * s, sample_rate / BlockSize); 
+        scl[j] = dsp::lerp(1.f, velocity, *params[md::par_eg1velscl + o]);; 
     }
     
-    float prev_value = envs[0].value + envs[1].value * 0.2;
     for (int i = 0; i < EnvCount; i++)
         envs[i].advance();    
-    float cur_value = envs[0].value + envs[1].value * 0.2;
     
+    float env_old = envs[0].old_value * scl[0] + 0.2 * envs[1].old_value * scl[1];
+    float env_new = envs[0].value * scl[0] + 0.2 * envs[1].value * scl[1];
     for (int i = 0; i < BlockSize; i++) {        
         float value = 0.f;
-        
-        float env = velocity * (prev_value + (cur_value - prev_value) * i * (1.0 / BlockSize));
+
+        float env = dsp::lerp(env_old, env_new, i * step);
         for (int j = 0; j < OscCount; j++) {
             value += oscs[j].get(dsp::clip(fastf2i_drm((env + *params[md::par_o1offset + j * ospc]) * 127.0 * 256), 0, 127 * 256)) * *params[md::par_o1level + j * ospc];
         }

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list