[SCM] calf/master: Work in progress on rotary speaker. May contain bugs.
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:40:34 UTC 2013
The following commit has been merged in the master branch:
commit 7df2bf5a83ce140a84a9ea035307c49a3071ea23
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Sun Jan 16 12:57:08 2011 +0000
Work in progress on rotary speaker. May contain bugs.
The atan waveshaping is not meant to stay there.
diff --git a/gui/gui-rotaryspeaker.xml b/gui/gui-rotaryspeaker.xml
index 4e2529c..5416945 100644
--- a/gui/gui-rotaryspeaker.xml
+++ b/gui/gui-rotaryspeaker.xml
@@ -1,54 +1,66 @@
<table rows="1" cols="3">
- <frame attach-x="2" attach-y="0" label="Manual">
- <table rows="2" cols="2">
- <vbox attach-x="1" attach-y="0" fill-x="1" fill-y="1" border="10">
- <label param="treble_speed" />
- <led param="meter_h" mode="2" />
- <value param="treble_speed" />
- </vbox>
- <knob param="treble_speed" size="3" attach-x="0" attach-y="0" pad-x="10" />
- <vbox attach-x="1" attach-y="1" fill-x="1" fill-y="1" border="10">
- <label param="bass_speed" />
- <led param="meter_l" mode="3" border="10" />
- <value param="bass_speed" />
- </vbox>
- <knob param="bass_speed" size="3" attach-x="0" attach-y="1" pad-x="10" />
- </table>
+ <frame attach-x="2" attach-y="0" label="Manual">
+ <table rows="2" cols="2">
+ <vbox attach-x="1" attach-y="0" fill-x="1" fill-y="1" border="10">
+ <label param="treble_speed" />
+ <led param="meter_h" mode="2" />
+ <value param="treble_speed" />
+ </vbox>
+ <knob param="treble_speed" size="3" attach-x="0" attach-y="0" pad-x="10" />
+ <vbox attach-x="1" attach-y="1" fill-x="1" fill-y="1" border="10">
+ <label param="bass_speed" />
+ <led param="meter_l" mode="3" border="10" />
+ <value param="bass_speed" />
+ </vbox>
+ <knob param="bass_speed" size="3" attach-x="0" attach-y="1" pad-x="10" />
+ </table>
</frame>
<vbox expand-y="0" attach-x="0" attach-y="0" pad-x="20">
- <label param="mod_depth" fill-x="0" expand-x="0" align-y="1.0" />
- <knob param="mod_depth" size="5" />
- <value param="mod_depth" align-y="0.0" />
+ <vbox spacing="3" fill="0">
+ <label param="mod_depth" fill-x="0" expand-x="0" align-y="1.0" />
+ <knob param="mod_depth" size="3" />
+ <value param="mod_depth" align-y="0.0" />
+ </vbox>
+ <vbox spacing="3" fill="0">
+ <label param="am_depth" />
+ <knob param="am_depth" size="3" />
+ <value param="am_depth" />
+ </vbox>
</vbox>
<vbox attach-x="1" attach-y="0" pad-x="8">
- <frame label="Cabinet">
- <hbox homogeneous="1">
- <vbox spacing="3" fill="0">
- <label param="shift" />
- <knob param="shift" size="2" />
- <value param="shift" />
- </vbox>
- <vbox spacing="3" fill="0">
- <label param="spacing" />
- <knob param="spacing" size="2" />
- <value param="spacing" />
- </vbox>
- <vbox spacing="3" fill="0">
- <label param="mic_distance"/>
- <knob param="mic_distance" size="2" />
- <value param="mic_distance" />
- </vbox>
- <vbox spacing="3" fill="0">
- <label param="reflection" />
- <knob param="reflection" size="2" />
- <value param="reflection" />
- </vbox>
- </hbox>
- </frame>
- <frame label="Controller">
- <vbox>
- <combo param="vib_speed" border="5" />
- </vbox>
- </frame>
- </vbox>
+ <frame label="Cabinet">
+ <hbox homogeneous="1">
+ <vbox spacing="3" fill="0">
+ <label param="shift" />
+ <knob param="shift" size="2" />
+ <value param="shift" />
+ </vbox>
+ <vbox spacing="3" fill="0">
+ <label param="spacing" />
+ <knob param="spacing" size="2" />
+ <value param="spacing" />
+ </vbox>
+ <vbox spacing="3" fill="0">
+ <label param="mic_distance"/>
+ <knob param="mic_distance" size="2" />
+ <value param="mic_distance" />
+ </vbox>
+ <vbox spacing="3" fill="0">
+ <label param="reflection" />
+ <knob param="reflection" size="2" />
+ <value param="reflection" />
+ </vbox>
+ <vbox spacing="3" fill="0">
+ <label param="test" />
+ <knob param="test" size="2" />
+ <value param="test" />
+ </vbox>
+ </hbox>
+ </frame>
+ <frame label="Controller">
+ <vbox>
+ <combo param="vib_speed" border="5" />
+ </vbox>
+ </frame>
+ </vbox>
</table>
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 75505e4..1606c9f 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -81,7 +81,7 @@ struct vintage_delay_metadata: public plugin_metadata<vintage_delay_metadata>
struct rotary_speaker_metadata: public plugin_metadata<rotary_speaker_metadata>
{
public:
- enum { par_speed, par_spacing, par_shift, par_moddepth, par_treblespeed, par_bassspeed, par_micdistance, par_reflection, par_meter_l, par_meter_h, param_count };
+ enum { par_speed, par_spacing, par_shift, par_moddepth, par_treblespeed, par_bassspeed, par_micdistance, par_reflection, par_am_depth, par_test, par_meter_l, par_meter_h, param_count };
enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = false, rt_capable = true };
PLUGIN_NAME_ID_LABEL("rotary_speaker", "rotaryspeaker", "Rotary Speaker")
};
diff --git a/src/calf/modules_mod.h b/src/calf/modules_mod.h
index 6b57b0b..bee6d37 100644
--- a/src/calf/modules_mod.h
+++ b/src/calf/modules_mod.h
@@ -91,7 +91,7 @@ public:
/// Current phases and phase deltas for bass and treble rotors
uint32_t phase_l, dphase_l, phase_h, dphase_h;
dsp::simple_delay<1024, float> delay;
- dsp::biquad_d2<float> crossover1l, crossover1r, crossover2l, crossover2r;
+ dsp::biquad_d2<float> crossover1l, crossover1r, crossover2l, crossover2r, damper1l, damper1r;
dsp::simple_delay<8, float> phaseshift;
uint32_t srate;
int vibrato_mode;
diff --git a/src/metadata.cpp b/src/metadata.cpp
index 5bd37eb..e6d5d36 100644
--- a/src/metadata.cpp
+++ b/src/metadata.cpp
@@ -181,11 +181,13 @@ CALF_PORT_PROPS(rotary_speaker) = {
{ 5, 0, 5, 1.01, PF_ENUM | PF_CTL_COMBO, rotary_speaker_speed_names, "vib_speed", "Speed Mode" },
{ 0.5, 0, 1, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "spacing", "Tap Spacing" },
{ 0.5, 0, 1, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "shift", "Tap Offset" },
- { 0.10, 0, 1, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "mod_depth", "Mod Depth" },
+ { 0.45, 0, 1, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "mod_depth", "FM Depth" },
{ 36, 10, 600, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_LOG | PF_UNIT_RPM, NULL, "treble_speed", "Treble Motor" },
{ 30, 10, 600, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_LOG | PF_UNIT_RPM, NULL, "bass_speed", "Bass Motor" },
{ 0.7, 0, 1, 101, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "mic_distance", "Mic Distance" },
{ 0.3, 0, 1, 101, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "reflection", "Reflection" },
+ { 0.45, 0, 1, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "am_depth", "AM Depth" },
+ { 0, 0, 1, 0, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "test", "Test" },
{ 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_l", "Low rotor" },
{ 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_h", "High rotor" },
{}
@@ -926,7 +928,7 @@ CALF_PORT_PROPS(organ) = {
{ 0, 0, 2, 0, PF_ENUM | PF_SCALE_LINEAR | PF_CTL_COMBO, organ_routing_names, "routing8", "Routing 8" },
{ 0, 0, 2, 0, PF_ENUM | PF_SCALE_LINEAR | PF_CTL_COMBO, organ_routing_names, "routing9", "Routing 9" },
- { 96, 0, 127, 128, PF_INT | PF_CTL_KNOB | PF_UNIT_NOTE, NULL, "foldnote", "Foldover" },
+ { 96 + 12, 0, 127, 128, PF_INT | PF_CTL_KNOB | PF_UNIT_NOTE, NULL, "foldnote", "Foldover" },
{ 200, 10, 3000, 100, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "perc_decay", "P: Carrier Decay" },
{ 0.25, 0, 1, 100, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB, NULL, "perc_level", "P: Level" },
diff --git a/src/modules_mod.cpp b/src/modules_mod.cpp
index 063027e..91c50df 100644
--- a/src/modules_mod.cpp
+++ b/src/modules_mod.cpp
@@ -321,14 +321,27 @@ inline bool rotary_speaker_audio_module::incr_towards(float &aspeed, float raspe
uint32_t rotary_speaker_audio_module::process(uint32_t offset, uint32_t nsamples, uint32_t inputs_mask, uint32_t outputs_mask)
{
+ if (true)
+ {
+ crossover2l.set_bp_rbj(2000.f, 0.7, (float)srate);
+ crossover2r.copy_coeffs(crossover2l);
+ damper1l.set_bp_rbj(1000.f*pow(4.0, *params[par_test]), 0.7, (float)srate);
+ damper1r.copy_coeffs(damper1l);
+ }
+ else
+ {
+ crossover2l.set_hp_rbj(800.f, 0.7, (float)srate);
+ crossover2r.copy_coeffs(crossover2l);
+ }
int shift = (int)(300000 * (*params[par_shift])), pdelta = (int)(300000 * (*params[par_spacing]));
int md = (int)(100 * (*params[par_moddepth]));
float mix = 0.5 * (1.0 - *params[par_micdistance]);
float mix2 = *params[par_reflection];
float mix3 = mix2 * mix2;
+ float am_depth = *params[par_am_depth];
for (unsigned int i = 0; i < nsamples; i++) {
float in_l = ins[0][i + offset], in_r = ins[1][i + offset];
- float in_mono = 0.5f * (in_l + in_r);
+ float in_mono = atan(0.5f * (in_l + in_r));
int xl = pseudo_sine_scl(phase_l), yl = pseudo_sine_scl(phase_l + 0x40000000);
int xh = pseudo_sine_scl(phase_h), yh = pseudo_sine_scl(phase_h + 0x40000000);
@@ -337,11 +350,13 @@ uint32_t rotary_speaker_audio_module::process(uint32_t offset, uint32_t nsamples
meter_h = xh;
// float out_hi_l = in_mono - delay.get_interp_1616(shift + md * xh) + delay.get_interp_1616(shift + md * 65536 + pdelta - md * yh) - delay.get_interp_1616(shift + md * 65536 + pdelta + pdelta - md * xh);
// float out_hi_r = in_mono + delay.get_interp_1616(shift + md * 65536 - md * yh) - delay.get_interp_1616(shift + pdelta + md * xh) + delay.get_interp_1616(shift + pdelta + pdelta + md * yh);
- float out_hi_l = in_mono + delay.get_interp_1616(shift + md * xh) - mix2 * delay.get_interp_1616(shift + md * 65536 + pdelta - md * yh) + mix3 * delay.get_interp_1616(shift + md * 65536 + pdelta + pdelta - md * xh);
- float out_hi_r = in_mono + delay.get_interp_1616(shift + md * 65536 - md * yh) - mix2 * delay.get_interp_1616(shift + pdelta + md * xh) + mix3 * delay.get_interp_1616(shift + pdelta + pdelta + md * yh);
+ float fm_hi_l = delay.get_interp_1616(shift + md * xh) - mix2 * delay.get_interp_1616(shift + md * 65536 + pdelta - md * yh) + mix3 * delay.get_interp_1616(shift + md * 65536 + pdelta + pdelta - md * xh);
+ float fm_hi_r = delay.get_interp_1616(shift + md * 65536 - md * yh) - mix2 * delay.get_interp_1616(shift + pdelta + md * xh) + mix3 * delay.get_interp_1616(shift + pdelta + pdelta + md * yh);
+ float out_hi_l = lerp(in_mono, damper1l.process(fm_hi_l), lerp(0.5, xh * 1.0 / 65536.0, am_depth));
+ float out_hi_r = lerp(in_mono, damper1r.process(fm_hi_r), lerp(0.5, yh * 1.0 / 65536.0, am_depth));
- float out_lo_l = in_mono + delay.get_interp_1616(shift + md * xl); // + delay.get_interp_1616(shift + md * 65536 + pdelta - md * yl);
- float out_lo_r = in_mono + delay.get_interp_1616(shift + md * yl); // - delay.get_interp_1616(shift + pdelta + md * yl);
+ float out_lo_l = lerp(in_mono, delay.get_interp_1616(shift + (md * xl >> 2)), lerp(0.5, yl * 1.0 / 65536.0, am_depth)); // + delay.get_interp_1616(shift + md * 65536 + pdelta - md * yl);
+ float out_lo_r = lerp(in_mono, delay.get_interp_1616(shift + (md * yl >> 2)), lerp(0.5, xl * 1.0 / 65536.0, am_depth)); // + delay.get_interp_1616(shift + md * 65536 + pdelta - md * yl);
out_hi_l = crossover2l.process(out_hi_l); // sanitize(out_hi_l);
out_hi_r = crossover2r.process(out_hi_r); // sanitize(out_hi_r);
@@ -354,8 +369,8 @@ uint32_t rotary_speaker_audio_module::process(uint32_t offset, uint32_t nsamples
float mic_l = out_l + mix * (out_r - out_l);
float mic_r = out_r + mix * (out_l - out_r);
- outs[0][i + offset] = mic_l * 0.5f;
- outs[1][i + offset] = mic_r * 0.5f;
+ outs[0][i + offset] = mic_l;
+ outs[1][i + offset] = mic_r;
delay.put(in_mono);
phase_l += dphase_l;
phase_h += dphase_h;
@@ -364,6 +379,8 @@ uint32_t rotary_speaker_audio_module::process(uint32_t offset, uint32_t nsamples
crossover1r.sanitize();
crossover2l.sanitize();
crossover2r.sanitize();
+ damper1l.sanitize();
+ damper1r.sanitize();
float delta = nsamples * 1.0 / srate;
if (vibrato_mode == 5)
update_speed_manual(delta);
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list