[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