[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