[SCM] calf/master: Minor bugs, sidechain frequency display

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


The following commit has been merged in the master branch:
commit e98ecb9e0a71af6295499877dafe22d2bae5cc89
Author: Markus Schmidt <schmidt at boomshop.net>
Date:   Mon Oct 26 07:12:26 2009 +0100

    Minor bugs, sidechain frequency display

diff --git a/gui/gui-sidechaincompressor.xml b/gui/gui-sidechaincompressor.xml
index e2ff2d0..37bbc0c 100644
--- a/gui/gui-sidechaincompressor.xml
+++ b/gui/gui-sidechaincompressor.xml
@@ -85,8 +85,8 @@
     
     <if cond="directlink">
       <frame label="Compression">
-        <vbox spacing="20">
-            <vbox>
+        <vbox spacing="12">
+            <vbox spacing="8">
                 <label param="compression"/>
                 <vumeter param="compression" mode="2" hold="1.5" attach-w="2" expand="0" fill="0"/>
             </vbox>
@@ -100,16 +100,12 @@
         <if cond="directlink">
             <frame label="Sidechain">
                 <vbox spacing="0">
-                    <hbox spacing="5" expand="0" fill="0">
-                        <vbox expand="0">
-                            <label param="sc_mode" expand="0" fill="0" />
-                            <combo param="sc_mode" />
-                        </vbox>
-                        <vbox expand="0">
-                             <label param="sc_listen" expand="0" fill="0"/>
-                             <toggle param="sc_listen" size="2"/>
-                        </vbox>
-                    </hbox>
+                    <table rows="2" cols="2" expand="0" fill="0">
+                        <label attach-x="0" attach-y="0" param="sc_mode" expand-y="0" fill-y="0" />
+                        <combo attach-x="0" attach-y="1" param="sc_mode" fill-y="0" expand-y="0"/>
+                        <label attach-x="1" attach-y="0" param="sc_listen" expand-y="0" fill-y="0" />
+                        <toggle attach-x="1" attach-y="1" param="sc_listen" size="2" expand-y="0" fill-y="0"/>
+                    </table>
                     <line-graph refresh="1" width="235" height="100" param="f1_freq" expand="1" fill="1" />
                 </vbox>
             </frame>
@@ -117,10 +113,10 @@
         <hbox spacing="5">
             <frame label="Filter 1">
                 <vbox>
-                    <hbox spacing="5">
-                        <label param="f1_active" expand="1" fill="1"/>
-                        <led param="f1_active" mode="7" expand="1" fill="1"/>
-                    </hbox>
+                    <table rows="1" cols="2">
+                        <label attach-x="0" attach-y="0" param="f1_active" expand-x="1" fill-x="1"/>
+                        <led attach-x="1" attach-y="0" param="f1_active" mode="7" fill-x="0" expand-y="0" fill-y="0"/>
+                    </table>
                     
                     <hbox homogeneous="1">
                         <vbox>
@@ -138,10 +134,10 @@
             </frame>
             <frame label="Filter 2">
                 <vbox>
-                    <hbox spacing="5">
-                        <label param="f2_active" expand="1" fill="1"/>
-                        <led param="f2_active" mode="7" expand="1" fill="1"/>
-                    </hbox>
+                    <table rows="1" cols="2">
+                        <label attach-x="0" attach-y="0" param="f2_active" expand-x="1" fill-x="1"/>
+                        <led attach-x="1" attach-y="0" param="f2_active" mode="7" fill-x="0" expand-y="0" fill-y="0"/>
+                    </table>
                     
                     <hbox homogeneous="1">
                         <vbox>
diff --git a/src/calf/modules.h b/src/calf/modules.h
index 7933aa0..f80e683 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -966,7 +966,8 @@ private:
         BANDPASS_2
     };
     float f1_freq_old, f2_freq_old, f1_level_old, f2_level_old;
-    CalfScModes sc_mode;
+    float f1_freq_old1, f2_freq_old1, f1_level_old1, f2_level_old1;
+    CalfScModes sc_mode, sc_mode_old, sc_mode_old1;
     float f1_active, f2_active;
     uint32_t clip_in, clip_out;
     float meter_in, meter_out;
@@ -979,6 +980,7 @@ public:
     float *params[param_count];
     uint32_t srate;
     bool is_active;
+    volatile int last_generation, last_calculated_generation;
     sidechaincompressor_audio_module();
     void activate();
     void deactivate();
@@ -998,6 +1000,8 @@ public:
                 return f1L.h_z(z) * f2L.h_z(z);
                 break;
             case DEESSER_SPLIT:
+                return f2L.h_z(z);
+                break;
             case DERUMBLER_SPLIT:
             case BANDPASS_1:
                 return f1L.h_z(z);
@@ -1015,10 +1019,10 @@ public:
     }
     void set_sample_rate(uint32_t sr);
     uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask);
-    virtual bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context);
-    virtual bool get_dot(int index, int subindex, float &x, float &y, int &size, cairo_iface *context);
-    virtual bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context);
-    virtual int  get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline);
+    bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context);
+    bool get_dot(int index, int subindex, float &x, float &y, int &size, cairo_iface *context);
+    bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context);
+    int  get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline);
 };
 
 /// Multibandcompressor by Markus Schmidt
diff --git a/src/custom_ctl.cpp b/src/custom_ctl.cpp
index 414ba42..90f60ac 100644
--- a/src/custom_ctl.cpp
+++ b/src/custom_ctl.cpp
@@ -567,7 +567,7 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
     // get microseconds
     timeval tv;
     gettimeofday(&tv, 0);
-    long time = (long)tv.tv_sec * 1000 * 1000 + (long)tv.tv_usec;
+    long time = tv.tv_sec * 1000 * 1000 + tv.tv_usec;
     
     // limit to 1.f
     float value_orig = vu->value > 1.f ? 1.f : vu->value;
@@ -689,14 +689,9 @@ calf_vumeter_init (CalfVUMeter *self)
     //GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
     widget->requisition.width = 50;
     widget->requisition.height = 18;
-    self->value = 0.5;
-    self->last_hold = (long)0;
-    self->last_value = 0.f;
-    self->holding = false;
     self->cache_surface = NULL;
-    self->vumeter_falloff = 0.f;
-    self->last_falloff = (long)0;
     self->falling = false;
+    self->holding = false;
 }
 
 GtkWidget *
@@ -760,6 +755,16 @@ extern void calf_vumeter_set_mode(CalfVUMeter *meter, CalfVUMeterMode mode)
     if (mode != meter->mode)
     {
         meter->mode = mode;
+        if(mode == VU_MONOCHROME_REVERSE) {
+            meter->value = 1.f;
+            meter->last_value = 1.f;
+        } else {
+            meter->value = 0.f;
+            meter->last_value = 0.f;
+        }
+        meter->vumeter_falloff = 0.f;
+        meter->last_falloff = (long)0;
+        meter->last_hold = (long)0;
         gtk_widget_queue_draw(GTK_WIDGET(meter));
     }
 }
diff --git a/src/modules.cpp b/src/modules.cpp
index 43338f4..dd2d7b5 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -212,6 +212,171 @@ CALF_PLUGIN_INFO(multichorus) = { 0x8501, "MultiChorus", "Calf MultiChorus", "Kr
 
 ////////////////////////////////////////////////////////////////////////////
 
+CALF_PORT_NAMES(equalizer5band) = {"In L", "In R", "Out L", "Out R"};
+const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"};
+
+CALF_PORT_PROPS(equalizer5band) = {
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" },
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_in", "Input" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_out", "Output" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_in", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_out", "0dB" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" },
+    { 200,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "ls_freq", "Freq" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" },
+    { 4000,        0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hs_freq", "Freq" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level" },
+    { 60,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p1_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level" },
+    { 120,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level" },
+    { 250,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q" },
+};
+
+CALF_PLUGIN_INFO(equalizer5band) = { 0x8501, "Equalizer5Band", "Calf Equalizer 5 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" };
+
+////////////////////////////////////////////////////////////////////////////
+
+CALF_PORT_NAMES(equalizer8band) = {"In L", "In R", "Out L", "Out R"};
+const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"};
+
+CALF_PORT_PROPS(equalizer8band) = {
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" },
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inL", "Input L" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inR", "Input R" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outL", "Output L" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outR", "Output R" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inL", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB" },
+
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hp_active", "active" },
+    { 30,          0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hf_rolloff", "Rolloff" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" },
+    { 18000,       0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "lp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lf_rolloff", "Rolloff" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" },
+    { 200,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "ls_freq", "Freq" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" },
+    { 4000,        0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hs_freq", "Freq" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level" },
+    { 60,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p1_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level" },
+    { 120,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level" },
+    { 250,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p4_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p4_level", "Level" },
+    { 500,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q" },
+};
+
+CALF_PLUGIN_INFO(equalizer8band) = { 0x8501, "Equalizer8Band", "Calf Equalizer 8 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" };
+
+////////////////////////////////////////////////////////////////////////////
+
+CALF_PORT_NAMES(equalizer12band) = {"In L", "In R", "Out L", "Out R"};
+const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"};
+
+CALF_PORT_PROPS(equalizer12band) = {
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" },
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inL", "Input L" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inR", "Input R" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outL", "Output L" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outR", "Output R" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inL", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB" },
+
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hp_active", "active" },
+    { 30,          0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hf_rolloff", "Rolloff" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" },
+    { 18000,       0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "lp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lf_rolloff", "Rolloff" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" },
+    { 200,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "ls_freq", "Freq" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" },
+    { 4000,        0,           20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hs_freq", "Freq" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level" },
+    { 60,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p1_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level" },
+    { 120,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level" },
+    { 250,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p4_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p4_level", "Level" },
+    { 500,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p5_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p5_level", "Level" },
+    { 1000,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p5_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p5_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p6_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p6_level", "Level" },
+    { 2500,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p6_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p6_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p7_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p7_level", "Level" },
+    { 4000,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p7_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p7_q", "Q" },
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "p8_active", "active" },
+    { 1,           0.015625,    64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p8_level", "Level" },
+    { 6000,         0,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p8_freq", "Freq" },
+    { 1,           0,           100,   1,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p8_q", "Q" },
+};
+
+CALF_PLUGIN_INFO(equalizer12band) = { 0x8501, "Equalizer12Band", "Calf Equalizer 12 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" };
+
+////////////////////////////////////////////////////////////////////////////
+
 CALF_PORT_NAMES(compressor) = {"In L", "In R", "Out L", "Out R"};
 
 const char *compressor_detection_names[] = { "RMS", "Peak" };
@@ -246,15 +411,17 @@ CALF_PORT_NAMES(sidechaincompressor) = {"In L", "In R", "Out L", "Out R"};
 const char *sidechaincompressor_detection_names[] = { "RMS", "Peak" };
 const char *sidechaincompressor_stereo_link_names[] = { "Average", "Maximum" };
 const char *sidechaincompressor_mode_names[] = {"Wideband (F1:off / F2:off)",
-                                                "Deesser wide (F1:HP / F2:Bell)",
-                                                "Deesser split (F1:HP / F2:off)",
-                                                "Derumbler wide (F1:Bell / F2:LP)",
-                                                "Derumbler split (F1:off / F2:LP)",
+                                                "Deesser wide (F1:Bell / F2:HP)",
+                                                "Deesser split (F1:off / F2:HP)",
+                                                "Derumbler wide (F1:LP / F2:Bell)",
+                                                "Derumbler split (F1:LP / F2:off)",
                                                 "Weighted #1 (F1:Shelf / F2:Shelf)",
                                                 "Weighted #2 (F1:Shelf / F2:Bell)",
                                                 "Weighted #3 (F1:Bell / F2:Shelf)",
                                                 "Bandpass #1 (F1:BP / F2:off)",
                                                 "Bandpass #2 (F1:HP / F2:LP)"};
+const char *sidechaincompressor_filter_choices[] = { "12dB", "24dB", "36dB"};
+
 
 CALF_PORT_PROPS(sidechaincompressor) = {
     { 0,      0,  1,    0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
@@ -273,8 +440,8 @@ CALF_PORT_PROPS(sidechaincompressor) = {
     { 0,      0,  1,    0, PF_ENUM | PF_CTL_COMBO, sidechaincompressor_stereo_link_names, "stereo_link", "Stereo Link" },
     { 0, 0.03125, 1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_CTLO_REVERSE | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL| PF_PROP_GRAPH, NULL, "compression", "Gain Reduction" },
     { 0,      0,  9,    0, PF_ENUM | PF_CTL_COMBO, sidechaincompressor_mode_names, "sc_mode", "Sidechain Mode" },
-    { 200,    10,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "f1_freq", "Freq" },
-    { 4000,   10,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "f2_freq", "Freq" },
+    { 250,    30,15000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "f1_freq", "Freq" },
+    { 4500,   30,15000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "f2_freq", "Freq" },
     { 1,      0.0625,  16, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "f1_level", "Level" },
     { 1,      0.0625,  16, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "f2_level", "Level" },
     { 0,      0,  1,    0, PF_BOOL | PF_CTL_TOGGLE, NULL, "sc_listen", "S/C-Listen" },
diff --git a/src/modules_dsp.cpp b/src/modules_dsp.cpp
index b8fedfd..67c3e9b 100644
--- a/src/modules_dsp.cpp
+++ b/src/modules_dsp.cpp
@@ -688,27 +688,27 @@ void multibandcompressor_audio_module::params_changed()
     // set the params of all filters
     if(*params[param_freq0] != freq_old[0] or *params[param_sep0] != sep_old[0] or *params[param_q0] != q_old[0]) {
         lpL0.set_lp_rbj((float)(*params[param_freq0] * (1 - *params[param_sep0])), *params[param_q0], (float)srate);
-        lpR0.set_lp_rbj((float)(*params[param_freq0] * (1 - *params[param_sep0])), *params[param_q0], (float)srate);
+        lpR0.copy_coeffs(lpL0);
         hpL0.set_hp_rbj((float)(*params[param_freq0] * (1 + *params[param_sep0])), *params[param_q0], (float)srate);
-        hpR0.set_hp_rbj((float)(*params[param_freq0] * (1 + *params[param_sep0])), *params[param_q0], (float)srate);
+        hpR0.copy_coeffs(hpL0);
         freq_old[0] = *params[param_freq0];
         sep_old[0]  = *params[param_sep2];
         q_old[0]    = *params[param_q2];
     }
     if(*params[param_freq1] != freq_old[1] or *params[param_sep1] != sep_old[1] or *params[param_q1] != q_old[1]) {
         lpL1.set_lp_rbj((float)(*params[param_freq1] * (1 - *params[param_sep1])), *params[param_q1], (float)srate);
-        lpR1.set_lp_rbj((float)(*params[param_freq1] * (1 - *params[param_sep1])), *params[param_q1], (float)srate);
+        lpR1.copy_coeffs(lpL1);
         hpL1.set_hp_rbj((float)(*params[param_freq1] * (1 + *params[param_sep1])), *params[param_q1], (float)srate);
-        hpR1.set_hp_rbj((float)(*params[param_freq1] * (1 + *params[param_sep1])), *params[param_q1], (float)srate);
+        hpR1.copy_coeffs(hpL1);
         freq_old[1] = *params[param_freq1];
         sep_old[1]  = *params[param_sep2];
         q_old[1]    = *params[param_q2];
     }
     if(*params[param_freq2] != freq_old[2] or *params[param_sep2] != sep_old[2] or *params[param_q2] != q_old[2]) {
         lpL2.set_lp_rbj((float)(*params[param_freq2] * (1 - *params[param_sep2])), *params[param_q2], (float)srate);
-        lpR2.set_lp_rbj((float)(*params[param_freq2] * (1 - *params[param_sep2])), *params[param_q2], (float)srate);
+        lpR2.copy_coeffs(lpL2);
         hpL2.set_hp_rbj((float)(*params[param_freq2] * (1 + *params[param_sep2])), *params[param_q2], (float)srate);
-        hpR2.set_hp_rbj((float)(*params[param_freq2] * (1 + *params[param_sep2])), *params[param_q2], (float)srate);
+        hpR2.copy_coeffs(hpL2);
         freq_old[2] = *params[param_freq2];
         sep_old[2]  = *params[param_sep2];
         q_old[2]    = *params[param_q2];
@@ -1062,6 +1062,7 @@ sidechaincompressor_audio_module::sidechaincompressor_audio_module()
 {
     is_active = false;
     srate = 0;
+    last_generation = 0;
 }
 
 void sidechaincompressor_audio_module::activate()
@@ -1084,87 +1085,89 @@ void sidechaincompressor_audio_module::deactivate()
 void sidechaincompressor_audio_module::params_changed()
 {
     // set the params of all filters
-    if(*params[param_f1_freq] != f1_freq_old or *params[param_f1_level] != f1_level_old or *params[param_sc_mode] != sc_mode
-        or *params[param_f2_freq] != f2_freq_old or *params[param_f2_level] != f2_level_old) {
+    if(*params[param_f1_freq] != f1_freq_old or *params[param_f1_level] != f1_level_old
+        or *params[param_f2_freq] != f2_freq_old or *params[param_f2_level] != f2_level_old
+        or *params[param_sc_mode] != sc_mode) {
+        float q = 0.707;
         switch ((int)*params[param_sc_mode]) {
             default:
             case WIDEBAND:
-                f1L.set_hp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f1R.set_hp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f2L.set_lp_rbj((float)*params[param_f2_freq], 0.707, (float)srate);
-                f2R.set_lp_rbj((float)*params[param_f2_freq], 0.707, (float)srate);
+                f1L.set_hp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]);
+                f1R.copy_coeffs(f1L);
+                f2L.set_lp_rbj((float)*params[param_f2_freq], q, (float)srate, *params[param_f2_level]);
+                f2R.copy_coeffs(f2L);
                 f1_active = 0.f;
                 f2_active = 0.f;
                 break;
             case DEESSER_WIDE:
-                f1L.set_hp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f1R.set_hp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f2L.set_peakeq_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f2R.set_peakeq_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
+                f1L.set_hp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]);
+                f1R.copy_coeffs(f1L);
+                f2L.set_peakeq_rbj((float)*params[param_f2_freq], q, *params[param_f2_level], (float)srate);
+                f2R.copy_coeffs(f2L);
                 f1_active = 1.f;
                 f2_active = 0.5f;
                 break;
             case DEESSER_SPLIT:
-                f1L.set_hp_rbj((float)*params[param_f1_freq] * (1 - 0.17), 0.707, (float)srate);
-                f1R.set_hp_rbj((float)*params[param_f1_freq] * (1 - 0.17), 0.707, (float)srate);
-                f2L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), 0.707, (float)srate);
-                f2R.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), 0.707, (float)srate);
-                f1_active = 1.f;
-                f2_active = 0.f;
+                f2L.set_hp_rbj((float)*params[param_f2_freq] * (1 - 0.17), q, (float)srate, *params[param_f1_level]);
+                f2R.copy_coeffs(f1L);
+                f1L.set_lp_rbj((float)*params[param_f2_freq] * (1 + 0.17), q, (float)srate);
+                f1R.copy_coeffs(f2L);
+                f2_active = 1.f;
+                f1_active = 0.f;
                 break;
             case DERUMBLER_WIDE:
-                f1L.set_lp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f1R.set_lp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f2L.set_peakeq_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f2R.set_peakeq_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f1_active = 1.f;
-                f2_active = 0.5f;
+                f1L.set_peakeq_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate);
+                f1R.copy_coeffs(f1L);
+                f2L.set_lp_rbj((float)*params[param_f2_freq], q, (float)srate, *params[param_f2_level]);
+                f2R.copy_coeffs(f2L);
+                f1_active = 0.5f;
+                f2_active = 1.f;
                 break;
             case DERUMBLER_SPLIT:
-                f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), 0.707, (float)srate);
-                f1R.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), 0.707, (float)srate);
-                f2L.set_hp_rbj((float)*params[param_f1_freq] * (1 - 0.17), 0.707, (float)srate);
-                f2R.set_hp_rbj((float)*params[param_f1_freq] * (1 - 0.17), 0.707, (float)srate);
-                f1_active = 1.f;
+                f2L.set_hp_rbj((float)*params[param_f1_freq] * (1 - 0.17), q, (float)srate);
+                f2R.copy_coeffs(f1L);
+                f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), q, (float)srate, *params[param_f2_level]);
+                f1R.copy_coeffs(f2L);
                 f2_active = 0.f;
+                f1_active = 1.f;
                 break;
             case WEIGHTED_1:
-                f1L.set_lowshelf_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f1R.set_lowshelf_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f2L.set_highshelf_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f2R.set_highshelf_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
+                f1L.set_lowshelf_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate);
+                f1R.copy_coeffs(f1L);
+                f2L.set_highshelf_rbj((float)*params[param_f2_freq], q, *params[param_f2_level], (float)srate);
+                f2R.copy_coeffs(f2L);
                 f1_active = 0.5f;
                 f2_active = 0.5f;
                 break;
             case WEIGHTED_2:
-                f1L.set_lowshelf_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f1R.set_lowshelf_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f2L.set_peakeq_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f2R.set_peakeq_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
+                f1L.set_lowshelf_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate);
+                f1R.copy_coeffs(f1L);
+                f2L.set_peakeq_rbj((float)*params[param_f2_freq], q, *params[param_f2_level], (float)srate);
+                f2R.copy_coeffs(f2L);
                 f1_active = 0.5f;
                 f2_active = 0.5f;
                 break;
             case WEIGHTED_3:
-                f1L.set_peakeq_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f1R.set_peakeq_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f2L.set_highshelf_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f2R.set_highshelf_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
+                f1L.set_peakeq_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate);
+                f1R.copy_coeffs(f1L);
+                f2L.set_highshelf_rbj((float)*params[param_f2_freq], q, *params[param_f2_level], (float)srate);
+                f2R.copy_coeffs(f2L);
                 f1_active = 0.5f;
                 f2_active = 0.5f;
                 break;
             case BANDPASS_1:
-                f1L.set_bp_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f1R.set_bp_rbj((float)*params[param_f1_freq], 0.707, *params[param_f1_level], (float)srate);
-                f2L.set_highshelf_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
-                f2R.set_highshelf_rbj((float)*params[param_f2_freq], 0.707, *params[param_f2_level], (float)srate);
+                f1L.set_bp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]);
+                f1R.copy_coeffs(f1L);
+                f2L.set_highshelf_rbj((float)*params[param_f2_freq], q, *params[param_f2_level], (float)srate);
+                f2R.copy_coeffs(f2L);
                 f1_active = 1.f;
                 f2_active = 0.f;
                 break;
             case BANDPASS_2:
-                f1L.set_hp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f1R.set_hp_rbj((float)*params[param_f1_freq], 0.707, (float)srate);
-                f2L.set_lp_rbj((float)*params[param_f2_freq], 0.707, (float)srate);
-                f2R.set_lp_rbj((float)*params[param_f2_freq], 0.707, (float)srate);
+                f1L.set_hp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]);
+                f1R.copy_coeffs(f1L);
+                f2L.set_lp_rbj((float)*params[param_f2_freq], q, (float)srate, *params[param_f2_level]);
+                f2R.copy_coeffs(f2L);
                 f1_active = 1.f;
                 f2_active = 1.f;
                 break;
@@ -1244,35 +1247,41 @@ uint32_t sidechaincompressor_audio_module::process(uint32_t offset, uint32_t num
                 case WEIGHTED_3:
                 case BANDPASS_2:
                     leftSC = f2L.process(f1L.process(leftSC));
-                    rightSC = f2L.process(f1L.process(rightSC));
+                    rightSC = f2R.process(f1R.process(rightSC));
                     leftMC = leftSC;
                     rightMC = rightSC;
                     compressor.process(leftAC, rightAC, leftSC, rightSC);
                     break;
                 case DEESSER_SPLIT:
+                    leftSC = f2L.process(leftSC);
+                    rightSC = f2R.process(rightSC);
+                    leftMC = leftSC;
+                    rightMC = rightSC;
+                    compressor.process(leftSC, rightSC, leftSC, rightSC);
+                    leftAC = f1L.process(leftAC);
+                    rightAC = f1R.process(rightAC);
+                    leftAC += leftSC;
+                    rightAC += rightSC;
+                    break;
                 case DERUMBLER_SPLIT:
                     leftSC = f1L.process(leftSC);
-                    rightSC = f1L.process(rightSC);
+                    rightSC = f1R.process(rightSC);
                     leftMC = leftSC;
                     rightMC = rightSC;
                     compressor.process(leftSC, rightSC, leftSC, rightSC);
                     leftAC = f2L.process(leftAC);
-                    rightAC = f2L.process(rightAC);
+                    rightAC = f2R.process(rightAC);
                     leftAC += leftSC;
                     rightAC += rightSC;
                     break;
                 case BANDPASS_1:
                     leftSC = f1L.process(leftSC);
-                    rightSC = f1L.process(rightSC);
+                    rightSC = f1R.process(rightSC);
                     leftMC = leftSC;
                     rightMC = rightSC;
                     compressor.process(leftAC, rightAC, leftSC, rightSC);
                     break;
             }
-            f1L.sanitize();
-            f1R.sanitize();
-            f2L.sanitize();
-            f2R.sanitize();
             
             if(*params[param_sc_listen] > 0.f) {
                 outL = leftMC;
@@ -1300,6 +1309,11 @@ uint32_t sidechaincompressor_audio_module::process(uint32_t offset, uint32_t num
             // next sample
             ++offset;
         } // cycle trough samples
+        f1L.sanitize();
+        f1R.sanitize();
+        f2L.sanitize();
+        f2R.sanitize();
+            
     }
     // draw meters
     if(params[param_clip_in] != NULL) {
@@ -1368,6 +1382,31 @@ int sidechaincompressor_audio_module::get_changed_offsets(int index, int generat
         return false;
     if(index == param_compression) {
         return compressor.get_changed_offsets(generation, subindex_graph, subindex_dot, subindex_gridline);
+    } else {
+        //  (fabs(inertia_cutoff.get_last() - old_cutoff) + 100 * fabs(inertia_resonance.get_last() - old_resonance) + fabs(*params[par_mode] - old_mode) > 0.1f)
+        if (*params[param_f1_freq] != f1_freq_old1
+            or *params[param_f2_freq] != f2_freq_old1
+            or *params[param_f1_level] != f1_level_old1
+            or *params[param_f2_level] != f2_level_old1
+            or *params[param_sc_mode] !=sc_mode_old1)
+        {
+            f1_freq_old1 = *params[param_f1_freq];
+            f2_freq_old1 = *params[param_f2_freq];
+            f1_level_old1 = *params[param_f1_level];
+            f2_level_old1 = *params[param_f2_level];
+            sc_mode_old1 = (CalfScModes)*params[param_sc_mode];
+            last_generation++;
+            subindex_graph = 0;
+            subindex_dot = INT_MAX;
+            subindex_gridline = INT_MAX;
+        }
+        else {
+            subindex_graph = 0;
+            subindex_dot = subindex_gridline = generation ? INT_MAX : 0;
+        }
+        if (generation == last_calculated_generation)
+            subindex_graph = INT_MAX;
+        return last_generation;
     }
     return false;
 }

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list