[SCM] calf/master: + Reverb: more parameters, more modes (still not finished)

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:38:49 UTC 2013


The following commit has been merged in the master branch:
commit 72857861f11f5e58eed7bf9f8868a6be0e57e380
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Wed Jan 14 00:01:23 2009 +0000

    + Reverb: more parameters, more modes (still not finished)

diff --git a/gui/gui-reverb.xml b/gui/gui-reverb.xml
index 60d2a62..0850864 100644
--- a/gui/gui-reverb.xml
+++ b/gui/gui-reverb.xml
@@ -28,9 +28,24 @@
             <value param="diffusion" />
         </vbox>
         <vbox border="5">
-            <label param="room_size"  />
-            <combo param="room_size" />
+            <label param="predelay" />
+            <knob param="predelay" />
+            <value param="predelay" />
+        </vbox>
+        <vbox border="5">
+            <label param="bass_cut" />
+            <knob param="bass_cut" />
+            <value param="bass_cut" />
+        </vbox>
+        <vbox border="5">
+            <label param="treble_cut" />
+            <knob param="treble_cut" />
+            <value param="treble_cut" />
         </vbox>
     </hbox>
+    <vbox border="5">
+        <label param="room_size"  />
+        <combo param="room_size" />
+    </vbox>
 </vbox>
 
diff --git a/src/calf/audio_fx.h b/src/calf/audio_fx.h
index 3e67f66..fd9399c 100644
--- a/src/calf/audio_fx.h
+++ b/src/calf/audio_fx.h
@@ -463,12 +463,29 @@ public:
             tl[4] = 1075 << 16, tr[4] = 1099 << 16;
             tl[5] = 1003 << 16, tr[5] = 1073 << 16;
             break;
+        case 4:
+            tl[0] =  197 << 16, tr[0] =  133 << 16;
+            tl[1] =  357 << 16, tr[1] =  229 << 16;
+            tl[2] =  549 << 16, tr[2] =  431 << 16;
+            tl[3] =  949 << 16, tr[3] = 1277 << 16;
+            tl[4] = 1173 << 16, tr[4] = 1671 << 16;
+            tl[5] = 1477 << 16, tr[5] = 1881 << 16;
+            break;
+        case 5:
+            tl[0] =  197 << 16, tr[0] =  133 << 16;
+            tl[1] =  257 << 16, tr[1] =  179 << 16;
+            tl[2] =  549 << 16, tr[2] =  431 << 16;
+            tl[3] =  619 << 16, tr[3] =  497 << 16;
+            tl[4] = 1173 << 16, tr[4] = 1371 << 16;
+            tl[5] = 1577 << 16, tr[5] = 1881 << 16;
+            break;
         }
         
-        float fDec=1000 + 1400.f * diffusion;
-        for (int i = 0 ; i < 6; i++)
+        float fDec=1000 + 2400.f * diffusion;
+        for (int i = 0 ; i < 6; i++) {
             ldec[i]=exp(-float(tl[i] >> 16) / fDec), 
             rdec[i]=exp(-float(tr[i] >> 16) / fDec);
+        }
     }
     float get_time() {
         return time;
@@ -529,12 +546,7 @@ public:
         unsigned int ipart = phase.ipart();
         
         // the interpolated LFO might be an overkill here
-        int lfo = phase.lerp_by_fract_int<int, 14, int>(sine.data[ipart], sine.data[ipart+1]);
-        /*
-        static int tmp = 0;
-        if ((tmp++) % 10 == 0)
-            printf("lfo=%d\n", lfo);
-            */
+        int lfo = phase.lerp_by_fract_int<int, 14, int>(sine.data[ipart], sine.data[ipart+1]) >> 2;
         phase += dphase;
         
         left += old_right;
@@ -543,7 +555,7 @@ public:
         float out_left = left;
         left = apL3.process_allpass_comb_lerp16(left, tl[2] + 54*lfo, ldec[2]);
         left = apL4.process_allpass_comb_lerp16(left, tl[3] - 69*lfo, ldec[3]);
-        left = apL5.process_allpass_comb_lerp16(left, tl[4] - 69*lfo, ldec[4]);
+        left = apL5.process_allpass_comb_lerp16(left, tl[4] + 69*lfo, ldec[4]);
         left = apL6.process_allpass_comb_lerp16(left, tl[5] - 46*lfo, ldec[5]);
         old_left = lp_left.process(left * fb);
         sanitize(old_left);
@@ -554,7 +566,7 @@ public:
         float out_right = right;
         right = apR3.process_allpass_comb_lerp16(right, tr[2] + 54*lfo, rdec[2]);
         right = apR4.process_allpass_comb_lerp16(right, tr[3] - 69*lfo, rdec[3]);
-        right = apR5.process_allpass_comb_lerp16(right, tr[4] - 69*lfo, rdec[4]);
+        right = apR5.process_allpass_comb_lerp16(right, tr[4] + 69*lfo, rdec[4]);
         right = apR6.process_allpass_comb_lerp16(right, tr[5] - 46*lfo, rdec[5]);
         old_right = lp_right.process(right * fb);
         sanitize(old_right);
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 1b1273e..d0926a9 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -53,7 +53,7 @@ struct filter_metadata: public plugin_metadata<filter_metadata>
 
 struct reverb_metadata: public plugin_metadata<reverb_metadata>
 {
-    enum { par_decay, par_hfdamp, par_roomsize, par_diffusion, par_amount, par_dry, param_count };
+    enum { par_decay, par_hfdamp, par_roomsize, par_diffusion, par_amount, par_dry, par_predelay, par_basscut, par_treblecut, param_count };
     enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
     PLUGIN_NAME_ID_LABEL("reverb", "reverb", "Reverb")
 };
diff --git a/src/calf/modules.h b/src/calf/modules.h
index 3cc35bb..c47d04f 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -188,8 +188,11 @@ class reverb_audio_module: public audio_module<reverb_metadata>
 {
 public:    
     dsp::reverb<float> reverb;
+    dsp::simple_delay<16384, stereo_sample<float> > pre_delay;
+    dsp::onepole<float> left_lo, right_lo, left_hi, right_hi;
     uint32_t srate;
     gain_smoothing amount, dryamount;
+    int predelay_amt;
     float *ins[in_count]; 
     float *outs[out_count];
     float *params[param_count];
@@ -202,19 +205,33 @@ public:
         reverb.set_cutoff(*params[par_hfdamp]);
         amount.set_inertia(*params[par_amount]);
         dryamount.set_inertia(*params[par_dry]);
+        left_lo.set_lp(dsp::clip(*params[par_treblecut], 20.f, (float)(srate * 0.49f)), srate);
+        left_hi.set_hp(dsp::clip(*params[par_basscut], 20.f, (float)(srate * 0.49f)), srate);
+        right_lo.copy_coeffs(left_lo);
+        right_hi.copy_coeffs(left_hi);
+        predelay_amt = srate * (*params[par_predelay]) * (1.0f / 1000.0f) + 1;
     }
     uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) {
         numsamples += offset;
+        
         for (uint32_t i = offset; i < numsamples; i++) {
             float dry = dryamount.get();
             float wet = amount.get();
-            float l = ins[0][i], r = ins[1][i];
-            float rl = l, rr = r;
+            stereo_sample<float> s(ins[0][i], ins[1][i]);
+            stereo_sample<float> s2 = pre_delay.process(s, predelay_amt);
+            
+            float rl = s2.left, rr = s2.right;
+            rl = left_lo.process(left_hi.process(rl));
+            rr = right_lo.process(right_hi.process(rr));
             reverb.process(rl, rr);
-            outs[0][i] = dry*l + wet*rl;
-            outs[1][i] = dry*r + wet*rr;
+            outs[0][i] = dry*s.left + wet*rl;
+            outs[1][i] = dry*s.right + wet*rr;
         }
         reverb.extra_sanitize();
+        left_lo.sanitize();
+        left_hi.sanitize();
+        right_lo.sanitize();
+        right_hi.sanitize();
         return outputs_mask;
     }
     void activate();
diff --git a/src/modules.cpp b/src/modules.cpp
index feef0bc..4964174 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -71,15 +71,18 @@ CALF_PLUGIN_INFO(phaser) = { 0x8484, "Phaser", "Calf Phaser", "Krzysztof Foltman
 
 CALF_PORT_NAMES(reverb) = {"In L", "In R", "Out L", "Out R"};
 
-const char *reverb_room_sizes[] = { "Small", "Medium", "Large", "Tunnel-like" };
+const char *reverb_room_sizes[] = { "Small", "Medium", "Large", "Tunnel-like", "Large/smooth", "Experimental" };
 
 CALF_PORT_PROPS(reverb) = {
-    { 1.5,      0.5, 15.0,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_SEC, NULL, "decay_time", "Decay time" },
+    { 1.5,      0.4, 15.0,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_SEC, NULL, "decay_time", "Decay time" },
     { 5000,    2000,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hf_damp", "High Frq Damp" },
-    { 2,          0,    3,    0, PF_ENUM | PF_CTL_COMBO , reverb_room_sizes, "room_size", "Room size", },
+    { 2,          0,    5,    0, PF_ENUM | PF_CTL_COMBO , reverb_room_sizes, "room_size", "Room size", },
     { 0.5,        0,    1,    0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "diffusion", "Diffusion" },
     { 0.25,       0,    2,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "amount", "Wet Amount" },
     { 1.0,        0,    2,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "dry", "Dry Amount" },
+    { 0,          0,   50,    0, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "predelay", "Pre Delay" },
+    { 300,       20, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "bass_cut", "Bass Cut" },
+    { 5000,      20, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "treble_cut", "Treble Cut" },
 };
 
 CALF_PLUGIN_INFO(reverb) = { 0x847e, "Reverb", "Calf Reverb", "Krzysztof Foltman", calf_plugins::calf_copyright_info, "ReverbPlugin" };

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list