[SCM] calf/master: + Wavetable: parameters for envelopes (still only EG1 used), interpolation between wavetables, more wavetable tweaks

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


The following commit has been merged in the master branch:
commit 841c719dcef226156842d9e9369ab231ab98914b
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Sun Mar 1 10:12:51 2009 +0000

    + Wavetable: parameters for envelopes (still only EG1 used), interpolation between wavetables, more wavetable tweaks

diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 93ef2b7..c5568dc 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -217,6 +217,9 @@ struct wavetable_metadata: public plugin_metadata<wavetable_metadata>
     enum { 
         par_o1wave, par_o1offset, par_o1transpose, par_o1detune, par_o1level,
         par_o2wave, par_o2offset, par_o2transpose, par_o2detune, par_o2level,
+        par_eg1attack, par_eg1decay, par_eg1sustain, par_eg1release, par_eg1velscl,
+        par_eg2attack, par_eg2decay, par_eg2sustain, par_eg2release, par_eg2velscl,
+        par_eg3attack, par_eg3decay, par_eg3sustain, par_eg3release, par_eg3velscl,
         param_count };
     enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
     enum { step_size = 64 };
diff --git a/src/calf/wavetable.h b/src/calf/wavetable.h
index 34a0eab..4e6a2c5 100644
--- a/src/calf/wavetable.h
+++ b/src/calf/wavetable.h
@@ -20,20 +20,25 @@ struct wavetable_oscillator: public dsp::simple_oscillator
 {
     enum { SIZE = 1 << 8, MASK = SIZE - 1, SCALE = 1 << (32 - 8) };
     int16_t (*tables)[256];
-    inline float get(uint8_t slice)
+    inline float get(uint16_t slice)
     {
+        float fracslice = (slice & 255) * (1.0 / 256.0);
+        slice = slice >> 8;
         int16_t *waveform = tables[slice];
-        float value = 0.f;
+        int16_t *waveform2 = tables[slice + 1];
+        float value1 = 0.f, value2 = 0.f;
         uint32_t cphase = phase, cphasedelta = phasedelta >> 3;
         for (int j = 0; j < 8; j++)
         {
             uint32_t wpos = cphase >> (32 - 8);
-            value += dsp::lerp((float)waveform[wpos], (float)waveform[(wpos + 1) & MASK], (cphase & (SCALE - 1)) * (1.0f / SCALE));
+            uint32_t wpos2 = (wpos + 1) & MASK;
+            float frac = (cphase & (SCALE - 1)) * (1.0f / SCALE);
+            value1 += dsp::lerp((float)waveform[wpos], (float)waveform[wpos2], frac);
+            value2 += dsp::lerp((float)waveform2[wpos], (float)waveform2[wpos2], frac);
             cphase += cphasedelta;
         }
-        value = value * (1.0 / 8.0) * (1.0 / 32768.0);
         phase += phasedelta;
-        return value;
+        return dsp::lerp(value1, value2, fracslice) * (1.0 / 8.0) * (1.0 / 32768.0);;
     }
 };
 
@@ -83,7 +88,7 @@ public:
     float *ins[in_count]; 
     float *outs[out_count];
     float *params[param_count];
-    int16_t tables[128][256];
+    int16_t tables[129][256]; // one dummy level for interpolation
 
 public:
     wavetable_audio_module();
diff --git a/src/modules.cpp b/src/modules.cpp
index dc4f620..f00915b 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -524,6 +524,25 @@ CALF_PORT_PROPS(wavetable) = {
     { 0,        -48,   48, 48*2+1, PF_INT   | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_SEMITONES, NULL, "o2trans", "Osc2 Transpose" },
     { -6,     -100,  100,      0, PF_INT   | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "o2detune", "Osc2 Detune" },
     { 0.1,        0,   1,     0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "o2level", "Osc2 Level" },
+
+    { 1,          1,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_a", "EG1 Attack" },
+    { 350,       10,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_d", "EG1 Decay" },
+    { 0.5,        0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr_s", "EG1 Sustain" },
+    { 50,       10,20000,     0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_r", "EG1 Release" },
+    { 0,          0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr_v", "EG1 VelMod" },
+
+    { 1,          1,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr2_a", "EG2 Attack" },
+    { 350,       10,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr2_d", "EG2 Decay" },
+    { 0.5,        0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr2_s", "EG2 Sustain" },
+    { 50,       10,20000,     0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr2_r", "EG2 Release" },
+    { 0,          0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr2_v", "EG2 VelMod" },
+
+    { 1,          1,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr3_a", "EG3 Attack" },
+    { 350,       10,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr3_d", "EG3 Decay" },
+    { 0.5,        0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr3_s", "EG3 Sustain" },
+    { 50,       10,20000,     0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr3_r", "EG3 Release" },
+    { 0,          0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr3_v", "EG3 VelMod" },
+
 };
 
 ////////////////////////////////////////////////////////////////////////////
diff --git a/src/wavetable.cpp b/src/wavetable.cpp
index 8d17daf..e5960a7 100644
--- a/src/wavetable.cpp
+++ b/src/wavetable.cpp
@@ -81,9 +81,17 @@ void wavetable_voice::steal()
 
 void wavetable_voice::render_block()
 {
-    int spc = wavetable_metadata::par_o2level - wavetable_metadata::par_o1level;
+    typedef wavetable_metadata md;
+    
+    int ospc = md::par_o2level - md::par_o1level;
+    int espc = md::par_eg2attack - md::par_eg1attack;
     for (int j = 0; j < OscCount; j++)
-        oscs[j].set_freq(note_to_hz(note, *params[wavetable_metadata::par_o1transpose + j * spc] * 100+ *params[wavetable_metadata::par_o1detune + j * spc]), sample_rate);
+        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;
+    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); 
+    }
     
     float prev_value = envs[0].value;
     for (int i = 0; i < EnvCount; i++)
@@ -94,8 +102,9 @@ void wavetable_voice::render_block()
         float value = 0.f;
         
         float env = velocity * (prev_value + (cur_value - prev_value) * i * (1.0 / BlockSize));
-        for (int j = 0; j < OscCount; j++)
-            value += oscs[j].get(dsp::clip(fastf2i_drm((env + *params[wavetable_metadata::par_o1offset + j * spc]) * 127.0), 0, 127)) * *params[wavetable_metadata::par_o1level + j * spc];
+        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];
+        }
         
         output_buffer[i][0] = output_buffer[i][1] = value * env * env;
     }
@@ -114,13 +123,14 @@ wavetable_audio_module::wavetable_audio_module()
         {
             //tables[i][j] = i < j ? -32767 : 32767;
             float ph = j * 2 * M_PI / 256;
-            float ii = i / 128.0;
+            float ii = (i & ~3) / 128.0;
+            float ii2 = ((i & ~3) + 4) / 128.0;
             float peak = (32 * ii);
             float rezo1 = sin(floor(peak) * ph);
             float rezo2 = sin(floor(peak + 1) * ph);
             float v1 = sin (ph + 2 * ii * sin(2 * ph) + 2 * ii * ii * sin(4 * ph) + ii * ii * rezo1);
-            float v2 = sin (ph + 2 * ii * sin(2 * ph) + 2 * ii * ii * sin(4 * ph) + ii * ii * rezo2);
-            tables[i][j] = 32767 * lerp(v1, v2, peak - floor(peak));
+            float v2 = sin (ph + 2 * ii2 * sin(2 * ph) + 2 * ii2 * ii2 * sin(4 * ph) + ii2 * ii2 * rezo2);
+            tables[i][j] = 32767 * lerp(v1, v2, (i & 3) / 4.0);
         }
     }
 }

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list