[SCM] calf/master: Sidechain compressor bugs/settings, 3 equalizer

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 657a80ae2f423cb7f21b8fadcc2bc9cbd8e2c55f
Author: Markus Schmidt <schmidt at boomshop.net>
Date:   Tue Oct 27 06:29:27 2009 +0100

    Sidechain compressor bugs/settings, 3 equalizer

diff --git a/gui/gui-equalizer12band.xml b/gui/gui-equalizer12band.xml
new file mode 100644
index 0000000..7ac8380
--- /dev/null
+++ b/gui/gui-equalizer12band.xml
@@ -0,0 +1,271 @@
+<table rows="2" cols="3">
+    <vbox attach-x="0" attach-y="0">
+        <frame label="Input">
+            <vbox spacing="5">
+                <table rows="2" cols="3">
+                    <label param="meter_inL" attach-x="0" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_inL" hold="1.5" falloff="2.5"  attach-x="1" attach-y="0" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_inL" attach-x="2" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0" />
+                    
+                    <label param="meter_inR" attach-x="0" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_inR" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_inR" attach-x="2" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                </table>
+                <hbox>
+                    <vbox>
+                        <label />
+                        <toggle param="bypass" size="2" />
+                        <label param="bypass" />
+                    </vbox>
+                    <vbox>
+                        <knob param="level_in" size="3" />
+                        <value param="level_in" />
+                    </vbox>
+                </hbox>
+            </vbox>
+        </frame>
+        <frame label="Highpass">
+            <table cols="2" rows="2">
+                <vbox attach-x="0" attach-y="0" fill-y="0">
+                    <label param="hp_active" expand="0" fill="0"/>
+                    <toggle size="1" param="hp_active" expand="0" fill="0"/>
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="hp_freq" />
+                    <knob param="hp_freq" />
+                    <value param="hp_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1" attach-w="2">
+                    <label param="hp_mode" />
+                    <combo param="hp_mode" />
+                </vbox>
+            </table>
+        </frame>
+    </vbox>
+    
+    <hbox attach-x="0" attach-y="1">
+        <frame label="Lowshelf">
+            <table rows="3" cols="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="ls_freq" />
+                    <knob param="ls_freq" />
+                    <value param="ls_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="ls_level" />
+                    <knob param="ls_level" />
+                    <value param="ls_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="2">
+                    <label param="ls_active" />
+                    <toggle size="1" param="ls_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+    
+    <if cond="directlink">
+        <frame label="Frequency Response" attach-x="1" attach-y="0">
+            <line-graph refresh="1" param="p1_freq" expand="1" fill="1"/>
+        </frame>
+    </if>
+    
+    <frame label="Parametrics" attach-x="1" attach-y="1">
+        <table rows="5" cols="9">
+            <label text="Freq" attach-x="0" attach-y="1" />
+            <label text="Level" attach-x="0" attach-y="2" />
+            <label text="Q" attach-x="0" attach-y="3" />
+            <label text="Active" attach-x="0" attach-y="4" />
+            
+            <label text="I" attach-x="1" attach-y="0" />
+            <label text="II" attach-x="2" attach-y="0" />
+            <label text="III" attach-x="3" attach-y="0" />
+            <label text="IV" attach-x="4" attach-y="0" />
+            <label text="V" attach-x="5" attach-y="0" />
+            <label text="VI" attach-x="6" attach-y="0" />
+            <label text="VII" attach-x="7" attach-y="0" />
+            <label text="VIII" attach-x="8" attach-y="0" />
+            
+            <vbox attach-x="1" attach-y="1">
+                <knob param="p1_freq" />
+                <value param="p1_freq" />
+            </vbox>
+            <vbox attach-x="1" attach-y="2">
+                <knob param="p1_level" />
+                <value param="p1_level" />
+            </vbox>
+            <vbox attach-x="1" attach-y="3">
+                <knob param="p1_q" />
+                <value param="p1_q" />
+            </vbox>
+            <vbox attach-x="1" attach-y="4">
+                <toggle size="1" param="p1_active" />
+            </vbox>
+            <vbox attach-x="2" attach-y="1">
+                <knob param="p2_freq" />
+                <value param="p2_freq" />
+            </vbox>
+            <vbox attach-x="2" attach-y="2">
+                <knob param="p2_level" />
+                <value param="p2_level" />
+            </vbox>
+            <vbox attach-x="2" attach-y="3">
+                <knob param="p2_q" />
+                <value param="p2_q" />
+            </vbox>
+            <vbox attach-x="2" attach-y="4">
+                <toggle size="1" param="p2_active" />
+            </vbox>
+            <vbox attach-x="3" attach-y="1">
+                <knob param="p3_freq" />
+                <value param="p3_freq" />
+            </vbox>
+            <vbox attach-x="3" attach-y="2">
+                <knob param="p3_level" />
+                <value param="p3_level" />
+            </vbox>
+            <vbox attach-x="3" attach-y="3">
+                <knob param="p3_q" />
+                <value param="p3_q" />
+            </vbox>
+            <vbox attach-x="3" attach-y="4">
+                <toggle size="1" param="p3_active" />
+            </vbox>
+            <vbox attach-x="4" attach-y="1">
+                <knob param="p4_freq" />
+                <value param="p4_freq" />
+            </vbox>
+            <vbox attach-x="4" attach-y="2">
+                <knob param="p4_level" />
+                <value param="p4_level" />
+            </vbox>
+            <vbox attach-x="4" attach-y="3">
+                <knob param="p4_q" />
+                <value param="p4_q" />
+            </vbox>
+            <vbox  attach-x="4" attach-y="4">
+                <toggle size="1" param="p4_active" />
+            </vbox>
+            <vbox attach-x="5" attach-y="1">
+                <knob param="p5_freq" />
+                <value param="p5_freq" />
+            </vbox>
+            <vbox attach-x="5" attach-y="2">
+                <knob param="p5_level" />
+                <value param="p5_level" />
+            </vbox>
+            <vbox attach-x="5" attach-y="3">
+                <knob param="p5_q" />
+                <value param="p5_q" />
+            </vbox>
+            <vbox  attach-x="5" attach-y="4">
+                <toggle size="1" param="p5_active" />
+            </vbox>
+            <vbox attach-x="6" attach-y="1">
+                <knob param="p6_freq" />
+                <value param="p6_freq" />
+            </vbox>
+            <vbox attach-x="6" attach-y="2">
+                <knob param="p6_level" />
+                <value param="p6_level" />
+            </vbox>
+            <vbox attach-x="6" attach-y="3">
+                <knob param="p6_q" />
+                <value param="p6_q" />
+            </vbox>
+            <vbox  attach-x="6" attach-y="4">
+                <toggle size="1" param="p6_active" />
+            </vbox>
+            <vbox attach-x="7" attach-y="1">
+                <knob param="p7_freq" />
+                <value param="p7_freq" />
+            </vbox>
+            <vbox attach-x="7" attach-y="2">
+                <knob param="p7_level" />
+                <value param="p7_level" />
+            </vbox>
+            <vbox attach-x="7" attach-y="3">
+                <knob param="p7_q" />
+                <value param="p7_q" />
+            </vbox>
+            <vbox  attach-x="7" attach-y="4">
+                <toggle size="1" param="p7_active" />
+            </vbox>
+            <vbox attach-x="8" attach-y="1">
+                <knob param="p8_freq" />
+                <value param="p8_freq" />
+            </vbox>
+            <vbox attach-x="8" attach-y="2">
+                <knob param="p8_level" />
+                <value param="p8_level" />
+            </vbox>
+            <vbox attach-x="8" attach-y="3">
+                <knob param="p8_q" />
+                <value param="p8_q" />
+            </vbox>
+            <vbox  attach-x="8" attach-y="4">
+                <toggle size="1" param="p8_active" />
+            </vbox>
+        </table>
+    </frame>
+    
+    <vbox attach-x="2" attach-y="0">
+        <frame label="Output">
+            <vbox spacing="5">
+                <table rows="2" cols="3">
+                    <label param="meter_outL"  attach-x="0" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_outL" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_outL" mode="1" attach-x="2" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0" />
+                    
+                    <label param="meter_outR"  attach-x="0" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_outR" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_outR" mode="1" attach-x="2" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                </table>
+                <hbox>
+                    <vbox>
+                        <knob param="level_out" size="3" />
+                        <value param="level_out" />
+                    </vbox>
+                </hbox>
+            </vbox>
+        </frame>
+        <frame label="Lowpass">
+            <table cols="2" rows="2">
+                <vbox attach-x="0" attach-y="0" fill-y="0">
+                    <label param="lp_active" />
+                    <toggle size="1" param="lp_active" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="lp_freq" />
+                    <knob param="lp_freq" />
+                    <value param="lp_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1" attach-w="2">
+                    <label param="lp_mode" />
+                    <combo param="lp_mode" />
+                </vbox>
+            </table>
+        </frame>
+    </vbox>
+    
+    <hbox attach-x="2" attach-y="1">
+        <frame label="Highshelf">
+            <table rows="3" cols="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="hs_freq" />
+                    <knob param="hs_freq" />
+                    <value param="hs_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="hs_level" />
+                    <knob param="hs_level" />
+                    <value param="hs_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="2">
+                    <label param="hs_active" />
+                    <toggle size="1" param="hs_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+</table>
diff --git a/gui/gui-equalizer5band.xml b/gui/gui-equalizer5band.xml
new file mode 100644
index 0000000..4d41df9
--- /dev/null
+++ b/gui/gui-equalizer5band.xml
@@ -0,0 +1,159 @@
+<table rows="2" cols="3">
+    <vbox attach-x="0" attach-y="0">
+        <frame label="Input">
+            <vbox spacing="15">
+                <table rows="1" cols="3">
+                    <vumeter param="meter_in" hold="1.5" falloff="2.5"  attach-x="1" attach-y="0" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_in" attach-x="2" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0" />
+                </table>
+                <hbox>
+                    <vbox expand="0">
+                        <toggle param="bypass" size="2" />
+                        <label param="bypass" />
+                    </vbox>
+                    <vbox>
+                        <knob param="level_in" size="5" />
+                        <value param="level_in" />
+                    </vbox>
+                </hbox>
+            </vbox>
+        </frame>
+    </vbox>
+    
+    <hbox attach-x="0" attach-y="1">
+        <frame label="Lowshelf">
+            <table rows="2" cols="2" homogeneous="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="ls_freq" />
+                    <knob param="ls_freq" />
+                    <value param="ls_freq" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="ls_level" />
+                    <knob param="ls_level" />
+                    <value param="ls_level" />
+                </vbox>
+                <vbox attach-x="1" attach-y="1" fill-y="0">
+                    <label param="ls_active"/>
+                    <toggle size="1" param="ls_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+    
+    <if cond="directlink">
+        <frame label="Frequency Response" attach-x="1" attach-y="0" pad-x="8">
+            <line-graph refresh="1" param="p1_freq" expand="1" fill="1"/>
+        </frame>
+    </if>
+    
+    <hbox attach-x="1" attach-y="1" spacing="8" pad-x="8">
+        <frame label="Parametric 1">
+            <table rows="2" cols="2" homogeneous="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="p1_freq" />
+                    <knob param="p1_freq" />
+                    <value param="p1_freq" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="p1_level" />
+                    <knob param="p1_level" />
+                    <value param="p1_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="p1_q" />
+                    <knob param="p1_q" />
+                    <value param="p1_q" />
+                </vbox>
+                <vbox attach-x="1" attach-y="1" fill-y="0">
+                    <label param="p1_active" />
+                    <toggle size="1" param="p1_active" />
+                </vbox>
+            </table>
+        </frame>
+        <frame label="Parametric 2">
+            <table rows="2" cols="2" homogeneous="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="p2_freq" />
+                    <knob param="p2_freq" />
+                    <value param="p2_freq" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="p2_level" />
+                    <knob param="p2_level" />
+                    <value param="p2_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="p2_q" />
+                    <knob param="p2_q" />
+                    <value param="p2_q" />
+                </vbox>
+                <vbox attach-x="1" attach-y="1" fill-y="0">
+                    <label param="p2_active" />
+                    <toggle size="1" param="p2_active" />
+                </vbox>
+            </table>
+        </frame>
+        <frame label="Parametric 3">
+            <table rows="2" cols="2" homogeneous="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="p3_freq" />
+                    <knob param="p3_freq" />
+                    <value param="p3_freq" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="p3_level" />
+                    <knob param="p3_level" />
+                    <value param="p3_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="p3_q" />
+                    <knob param="p3_q" />
+                    <value param="p3_q" />
+                </vbox>
+                <vbox attach-x="1" attach-y="1" fill-y="0">
+                    <label param="p3_active" />
+                    <toggle size="1" param="p3_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+    
+    <vbox attach-x="2" attach-y="0">
+        <frame label="Output">
+            <vbox spacing="15">
+                <table rows="2" cols="3">
+                    <vumeter param="meter_out" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_out" mode="1" attach-x="2" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0" />
+                </table>
+                <hbox>
+                    <vbox>
+                        <knob param="level_out" size="5" />
+                        <value param="level_out" />
+                    </vbox>
+                </hbox>
+            </vbox>
+        </frame>
+    </vbox>
+    
+    <hbox attach-x="2" attach-y="1">
+        <frame label="Highshelf">
+            <table rows="2" cols="2" homogeneous="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="hs_freq" />
+                    <knob param="hs_freq" />
+                    <value param="hs_freq" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="hs_level" />
+                    <knob param="hs_level" />
+                    <value param="hs_level" />
+                </vbox>
+                <vbox attach-x="1" attach-y="1" fill-y="0">
+                    <label param="hs_active" />
+                    <toggle size="1" param="hs_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+</table>
diff --git a/gui/gui-equalizer8band.xml b/gui/gui-equalizer8band.xml
new file mode 100644
index 0000000..0091d8d
--- /dev/null
+++ b/gui/gui-equalizer8band.xml
@@ -0,0 +1,207 @@
+<table rows="2" cols="3">
+    <vbox attach-x="0" attach-y="0">
+        <frame label="Input">
+            <vbox spacing="5">
+                <table rows="2" cols="3">
+                    <label param="meter_inL" attach-x="0" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_inL" hold="1.5" falloff="2.5"  attach-x="1" attach-y="0" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_inL" attach-x="2" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0" />
+                    
+                    <label param="meter_inR" attach-x="0" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_inR" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_inR" attach-x="2" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                </table>
+                <hbox>
+                    <vbox>
+                        <label />
+                        <toggle param="bypass" size="2" />
+                        <label param="bypass" />
+                    </vbox>
+                    <vbox>
+                        <knob param="level_in" size="3" />
+                        <value param="level_in" />
+                    </vbox>
+                </hbox>
+            </vbox>
+        </frame>
+        <frame label="Highpass">
+            <table cols="2" rows="2">
+                <vbox attach-x="0" attach-y="0" fill-y="0">
+                    <label param="hp_active" expand="0" fill="0"/>
+                    <toggle size="1" param="hp_active" expand="0" fill="0"/>
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="hp_freq" />
+                    <knob param="hp_freq" />
+                    <value param="hp_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1" attach-w="2">
+                    <label param="hp_mode" />
+                    <combo param="hp_mode" />
+                </vbox>
+            </table>
+        </frame>
+    </vbox>
+    
+    <hbox attach-x="0" attach-y="1">
+        <frame label="Lowshelf">
+            <table rows="3" cols="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="ls_freq" />
+                    <knob param="ls_freq" />
+                    <value param="ls_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="ls_level" />
+                    <knob param="ls_level" />
+                    <value param="ls_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="2">
+                    <label param="ls_active" />
+                    <toggle size="1" param="ls_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+    
+    <if cond="directlink">
+        <frame label="Frequency Response" attach-x="1" attach-y="0" pad-x="8">
+            <line-graph refresh="1" param="p1_freq" expand="1" fill="1"/>
+        </frame>
+    </if>
+    
+    <frame label="Parametrics" attach-x="1" attach-y="1" pad-x="8">
+        <table rows="5" cols="5">
+            <label text="Freq" attach-x="0" attach-y="1" />
+            <label text="Level" attach-x="0" attach-y="2" />
+            <label text="Q" attach-x="0" attach-y="3" />
+            <label text="Active" attach-x="0" attach-y="4" />
+            
+            <label text="I" attach-x="1" attach-y="0" />
+            <label text="II" attach-x="2" attach-y="0" />
+            <label text="III" attach-x="3" attach-y="0" />
+            <label text="IV" attach-x="4" attach-y="0" />
+            
+            <vbox attach-x="1" attach-y="1">
+                <knob param="p1_freq" />
+                <value param="p1_freq" />
+            </vbox>
+            <vbox attach-x="1" attach-y="2">
+                <knob param="p1_level" />
+                <value param="p1_level" />
+            </vbox>
+            <vbox attach-x="1" attach-y="3">
+                <knob param="p1_q" />
+                <value param="p1_q" />
+            </vbox>
+            <vbox attach-x="1" attach-y="4">
+                <toggle size="1" param="p1_active" />
+            </vbox>
+            <vbox attach-x="2" attach-y="1">
+                <knob param="p2_freq" />
+                <value param="p2_freq" />
+            </vbox>
+            <vbox attach-x="2" attach-y="2">
+                <knob param="p2_level" />
+                <value param="p2_level" />
+            </vbox>
+            <vbox attach-x="2" attach-y="3">
+                <knob param="p2_q" />
+                <value param="p2_q" />
+            </vbox>
+            <vbox attach-x="2" attach-y="4">
+                <toggle size="1" param="p2_active" />
+            </vbox>
+            <vbox attach-x="3" attach-y="1">
+                <knob param="p3_freq" />
+                <value param="p3_freq" />
+            </vbox>
+            <vbox attach-x="3" attach-y="2">
+                <knob param="p3_level" />
+                <value param="p3_level" />
+            </vbox>
+            <vbox attach-x="3" attach-y="3">
+                <knob param="p3_q" />
+                <value param="p3_q" />
+            </vbox>
+            <vbox attach-x="3" attach-y="4">
+                <toggle size="1" param="p3_active" />
+            </vbox>
+            <vbox attach-x="4" attach-y="1">
+                <knob param="p4_freq" />
+                <value param="p4_freq" />
+            </vbox>
+            <vbox attach-x="4" attach-y="2">
+                <knob param="p4_level" />
+                <value param="p4_level" />
+            </vbox>
+            <vbox attach-x="4" attach-y="3">
+                <knob param="p4_q" />
+                <value param="p4_q" />
+            </vbox>
+            <vbox  attach-x="4" attach-y="4">
+                <toggle size="1" param="p4_active" />
+            </vbox>
+        </table>
+    </frame>
+    
+    <vbox attach-x="2" attach-y="0">
+        <frame label="Output">
+            <vbox spacing="5">
+                <table rows="2" cols="3">
+                    <label param="meter_outL"  attach-x="0" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_outL" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_outL" mode="1" attach-x="2" attach-y="0" fill-x="0" expand-x="0" fill-y="0" expand-y="0" />
+                    
+                    <label param="meter_outR"  attach-x="0" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                    <vumeter param="meter_outR" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" fill-x="1" expand-x="1" fill-y="0" expand-y="0"/>
+                    <led param="clip_outR" mode="1" attach-x="2" attach-y="1" fill-x="0" expand-x="0" fill-y="0" expand-y="0"/>
+                </table>
+                <hbox>
+                    <vbox>
+                        <knob param="level_out" size="3" />
+                        <value param="level_out" />
+                    </vbox>
+                </hbox>
+            </vbox>
+        </frame>
+        <frame label="Lowpass">
+            <table cols="2" rows="2">
+                <vbox attach-x="0" attach-y="0" fill-y="0">
+                    <label param="lp_active" />
+                    <toggle size="1" param="lp_active" />
+                </vbox>
+                <vbox attach-x="1" attach-y="0">
+                    <label param="lp_freq" />
+                    <knob param="lp_freq" />
+                    <value param="lp_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1" attach-w="2">
+                    <label param="lp_mode" />
+                    <combo param="lp_mode" />
+                </vbox>
+            </table>
+        </frame>
+    </vbox>
+    
+    <hbox attach-x="2" attach-y="1">
+        <frame label="Highshelf">
+            <table rows="3" cols="1">
+                <vbox attach-x="0" attach-y="0">
+                    <label param="hs_freq" />
+                    <knob param="hs_freq" />
+                    <value param="hs_freq" />
+                </vbox>
+                <vbox attach-x="0" attach-y="1">
+                    <label param="hs_level" />
+                    <knob param="hs_level" />
+                    <value param="hs_level" />
+                </vbox>
+                <vbox attach-x="0" attach-y="2">
+                    <label param="hs_active" />
+                    <toggle size="1" param="hs_active" />
+                </vbox>
+            </table>
+        </frame>
+    </hbox>
+</table>
diff --git a/gui/gui-sidechaincompressor.xml b/gui/gui-sidechaincompressor.xml
index 37bbc0c..c9ba341 100644
--- a/gui/gui-sidechaincompressor.xml
+++ b/gui/gui-sidechaincompressor.xml
@@ -83,17 +83,18 @@
         </frame>
     </vbox>
     
-    <if cond="directlink">
+    
       <frame label="Compression">
         <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>
-            <line-graph refresh="1" width="255" height="255" param="compression" square="1" expand="1" fill="1"/>
+            <if cond="directlink">
+                <line-graph refresh="1" width="255" height="255" param="compression" square="1" expand="1" fill="1"/>
+            </if>
         </vbox>
       </frame>
-    </if>
     
     <vbox spacing="5">
         
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 79d4401..6ba14fb 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -126,7 +126,7 @@ struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
     };
     PLUGIN_NAME_ID_LABEL("monosynth", "monosynth", "Monosynth")
 };
-    
+
 /// Thor's compressor - metadata
 struct compressor_metadata: public plugin_metadata<compressor_metadata>
 {
@@ -168,6 +168,59 @@ struct multibandcompressor_metadata: public plugin_metadata<multibandcompressor_
     PLUGIN_NAME_ID_LABEL("multiband_compressor", "multibandcompressor", "Multiband Compressor")
 };
 
+/// Markus's 5-band EQ - metadata
+struct equalizer5band_metadata: public plugin_metadata<equalizer5band_metadata>
+{
+    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { param_bypass, param_level_in, param_level_out, param_meter_in,
+           param_meter_out, param_clip_in, param_clip_out,
+           param_ls_active, param_ls_level, param_ls_freq,
+           param_hs_active, param_hs_level, param_hs_freq,
+           param_p1_active, param_p1_level, param_p1_freq, param_p1_q,
+           param_p2_active, param_p2_level, param_p2_freq, param_p2_q,
+           param_p3_active, param_p3_level, param_p3_freq, param_p3_q,
+           param_count };
+    PLUGIN_NAME_ID_LABEL("equalizer5band", "equalizer5band", "Equalizer 5 Band")
+};
+/// Markus's 8-band EQ - metadata
+struct equalizer8band_metadata: public plugin_metadata<equalizer8band_metadata>
+{
+    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR,
+           param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR,
+           param_hp_active, param_hp_freq, param_hp_mode,
+           param_lp_active, param_lp_freq, param_lp_mode,
+           param_ls_active, param_ls_level, param_ls_freq,
+           param_hs_active, param_hs_level, param_hs_freq,
+           param_p1_active, param_p1_level, param_p1_freq, param_p1_q,
+           param_p2_active, param_p2_level, param_p2_freq, param_p2_q,
+           param_p3_active, param_p3_level, param_p3_freq, param_p3_q,
+           param_p4_active, param_p4_level, param_p4_freq, param_p4_q,
+           param_count };
+    PLUGIN_NAME_ID_LABEL("equalizer8band", "equalizer8band", "Equalizer 8 Band")
+};
+/// Markus's 12-band EQ - metadata
+struct equalizer12band_metadata: public plugin_metadata<equalizer12band_metadata>
+{
+    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR,
+           param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR,
+           param_hp_active, param_hp_freq, param_hp_mode,
+           param_lp_active, param_lp_freq, param_lp_mode,
+           param_ls_active, param_ls_level, param_ls_freq,
+           param_hs_active, param_hs_level, param_hs_freq,
+           param_p1_active, param_p1_level, param_p1_freq, param_p1_q,
+           param_p2_active, param_p2_level, param_p2_freq, param_p2_q,
+           param_p3_active, param_p3_level, param_p3_freq, param_p3_q,
+           param_p4_active, param_p4_level, param_p4_freq, param_p4_q,
+           param_p5_active, param_p5_level, param_p5_freq, param_p5_q,
+           param_p6_active, param_p6_level, param_p6_freq, param_p6_q,
+           param_p7_active, param_p7_level, param_p7_freq, param_p7_q,
+           param_p8_active, param_p8_level, param_p8_freq, param_p8_q,
+           param_count };
+    PLUGIN_NAME_ID_LABEL("equalizer12band", "equalizer12band", "Equalizer 12 Band")
+};
+
 /// Organ - enums for parameter IDs etc. (this mess is caused by organ split between plugin and generic class - which was
 /// a bad design decision and should be sorted out some day) XXXKF @todo
 struct organ_enums
diff --git a/src/calf/modulelist.h b/src/calf/modulelist.h
index 904e1b3..2fba14b 100644
--- a/src/calf/modulelist.h
+++ b/src/calf/modulelist.h
@@ -10,8 +10,11 @@
     PER_MODULE_ITEM(phaser, false, "phaser")
     PER_MODULE_ITEM(multichorus, false, "multichorus")
     PER_MODULE_ITEM(compressor, false, "compressor")
-    PER_MODULE_ITEM(multibandcompressor, false, "multibandcompressor")
     PER_MODULE_ITEM(sidechaincompressor, false, "sidechaincompressor")
+    PER_MODULE_ITEM(multibandcompressor, false, "multibandcompressor")
+    PER_MODULE_ITEM(equalizer5band, false, "equalizer5band")
+    PER_MODULE_ITEM(equalizer8band, false, "equalizer8band")
+    PER_MODULE_ITEM(equalizer12band, false, "equalizer12band")
 #ifdef ENABLE_EXPERIMENTAL
     PER_MODULE_ITEM(fluidsynth, true, "fluidsynth")
     PER_MODULE_ITEM(wavetable, true, "wavetable")
diff --git a/src/calf/modules.h b/src/calf/modules.h
index f80e683..5ba9fff 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -949,7 +949,6 @@ public:
     virtual int  get_changed_offsets(int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline);
 };
 
-
 /// Sidecain Compressor by Markus Schmidt (based on Thor's compressor and Krzysztof's filters)
 class sidechaincompressor_audio_module: public audio_module<sidechaincompressor_metadata>, public frequency_response_line_graph  {
 private:
@@ -1053,6 +1052,228 @@ public:
     virtual int  get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline);
 };
 
+/// Equalizer 12 Band by Markus Schmidt (based on Krzysztof's filters)
+class equalizer12band_audio_module: public audio_module<equalizer12band_metadata>, public frequency_response_line_graph  {
+private:
+    float hp_mode_old, hp_freq_old;
+    float lp_mode_old, lp_freq_old;
+    float ls_level_old, ls_freq_old;
+    float hs_level_old, hs_freq_old;
+    float p_level_old[8], p_freq_old[8], p_q_old[8];
+    float hp_mode_old1, hp_freq_old1, hp_active_old1;
+    float lp_mode_old1, lp_freq_old1, lp_active_old1;
+    float ls_level_old1, ls_freq_old1, ls_active_old1;
+    float hs_level_old1, hs_freq_old1, hs_active_old1;
+    float p_level_old1[8], p_freq_old1[8], p_q_old1[8], p_active_old1[8];
+    enum CalfEqModes {
+        MODE12DB,
+        MODE24DB,
+        MODE36DB
+    };
+    CalfEqModes eq_mode, eq_mode_old1[2];
+    uint32_t clip_inL, clip_outL, clip_inR, clip_outR;
+    float meter_inL, meter_outL, meter_inR, meter_outR;
+    biquad_d2<float> hpL[3], hpR[3], lpL[3], lpR[3];
+    biquad_d2<float> lsL, lsR, hsL, hsR;
+    biquad_d2<float> pL[8], pR[8];
+public:
+    typedef std::complex<double> cfloat;
+    float *ins[in_count];
+    float *outs[out_count];
+    float *params[param_count];
+    uint32_t srate;
+    bool is_active;
+    volatile int last_generation, last_calculated_generation;
+    equalizer12band_audio_module();
+    void activate();
+    void deactivate();
+    void params_changed();
+    float freq_gain(int index, double freq, uint32_t sr)
+    {
+        float ret = 1.f;
+        if(*params[param_hp_active] > 0.f) {
+            switch((int)*params[param_hp_mode]) {
+                case MODE12DB:
+                    ret *= hpL[0].freq_gain(freq, sr);
+                    ret *= hpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE24DB:
+                    ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr);
+                    ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE36DB:
+                    ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr);
+                    ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr);
+                    break;
+            }
+        }
+        if(*params[param_lp_active] > 0.f) {
+            switch((int)*params[param_lp_mode]) {
+                case MODE12DB:
+                    ret *= lpL[0].freq_gain(freq, sr);
+                    ret *= lpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE24DB:
+                    ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr);
+                    ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE36DB:
+                    ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr);
+                    ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr);
+                    break;
+            }
+        }
+        ret *= (*params[param_ls_active] > 0.f) ? lsL.freq_gain(freq, sr) : 1;
+        ret *= (*params[param_hs_active] > 0.f) ? hsL.freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p1_active] > 0.f) ? pL[0].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p2_active] > 0.f) ? pL[1].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p3_active] > 0.f) ? pL[2].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p4_active] > 0.f) ? pL[3].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p5_active] > 0.f) ? pL[4].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p6_active] > 0.f) ? pL[5].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p7_active] > 0.f) ? pL[6].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p8_active] > 0.f) ? pL[7].freq_gain(freq, sr) : 1;
+        return ret;
+    }
+    void set_sample_rate(uint32_t sr);
+    uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask);
+    bool get_graph(int index, int subindex, float *data, int points, 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);
+};
+
+/// Equalizer 8 Band by Markus Schmidt (based on Krzysztof's filters)
+class equalizer8band_audio_module: public audio_module<equalizer8band_metadata>, public frequency_response_line_graph  {
+private:
+    float hp_mode_old, hp_freq_old;
+    float lp_mode_old, lp_freq_old;
+    float ls_level_old, ls_freq_old;
+    float hs_level_old, hs_freq_old;
+    float p_level_old[4], p_freq_old[4], p_q_old[4];
+    float hp_mode_old1, hp_freq_old1, hp_active_old1;
+    float lp_mode_old1, lp_freq_old1, lp_active_old1;
+    float ls_level_old1, ls_freq_old1, ls_active_old1;
+    float hs_level_old1, hs_freq_old1, hs_active_old1;
+    float p_level_old1[4], p_freq_old1[4], p_q_old1[4], p_active_old1[4];
+    enum CalfEqModes {
+        MODE12DB,
+        MODE24DB,
+        MODE36DB
+    };
+    CalfEqModes eq_mode, eq_mode_old1[2];
+    uint32_t clip_inL, clip_outL, clip_inR, clip_outR;
+    float meter_inL, meter_outL, meter_inR, meter_outR;
+    biquad_d2<float> hpL[3], hpR[3], lpL[3], lpR[3];
+    biquad_d2<float> lsL, lsR, hsL, hsR;
+    biquad_d2<float> pL[4], pR[4];
+public:
+    typedef std::complex<double> cfloat;
+    float *ins[in_count];
+    float *outs[out_count];
+    float *params[param_count];
+    uint32_t srate;
+    bool is_active;
+    volatile int last_generation, last_calculated_generation;
+    equalizer8band_audio_module();
+    void activate();
+    void deactivate();
+    void params_changed();
+    float freq_gain(int index, double freq, uint32_t sr)
+    {
+        float ret = 1.f;
+        if(*params[param_hp_active] > 0.f) {
+            switch((int)*params[param_hp_mode]) {
+                case MODE12DB:
+                    ret *= hpL[0].freq_gain(freq, sr);
+                    ret *= hpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE24DB:
+                    ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr);
+                    ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE36DB:
+                    ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr);
+                    ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr);
+                    break;
+            }
+        }
+        if(*params[param_lp_active] > 0.f) {
+            switch((int)*params[param_lp_mode]) {
+                case MODE12DB:
+                    ret *= lpL[0].freq_gain(freq, sr);
+                    ret *= lpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE24DB:
+                    ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr);
+                    ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr);
+                    break;
+                case MODE36DB:
+                    ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr);
+                    ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr);
+                    break;
+            }
+        }
+        ret *= (*params[param_ls_active] > 0.f) ? lsL.freq_gain(freq, sr) : 1;
+        ret *= (*params[param_hs_active] > 0.f) ? hsL.freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p1_active] > 0.f) ? pL[0].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p2_active] > 0.f) ? pL[1].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p3_active] > 0.f) ? pL[2].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p4_active] > 0.f) ? pL[3].freq_gain(freq, sr) : 1;
+        return ret;
+    }
+    void set_sample_rate(uint32_t sr);
+    uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask);
+    bool get_graph(int index, int subindex, float *data, int points, 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);
+};
+
+/// Equalizer 5 Band by Markus Schmidt (based on Krzysztof's filters)
+class equalizer5band_audio_module: public audio_module<equalizer5band_metadata>, public frequency_response_line_graph  {
+private:
+    float hp_mode_old, hp_freq_old;
+    float lp_mode_old, lp_freq_old;
+    float ls_level_old, ls_freq_old;
+    float hs_level_old, hs_freq_old;
+    float p_level_old[3], p_freq_old[3], p_q_old[3];
+    float hp_mode_old1, hp_freq_old1, hp_active_old1;
+    float lp_mode_old1, lp_freq_old1, lp_active_old1;
+    float ls_level_old1, ls_freq_old1, ls_active_old1;
+    float hs_level_old1, hs_freq_old1, hs_active_old1;
+    float p_level_old1[3], p_freq_old1[3], p_q_old1[3], p_active_old1[3];
+    uint32_t clip_in, clip_out;
+    float meter_in, meter_out;
+    biquad_d2<float> lsL, lsR, hsL, hsR;
+    biquad_d2<float> pL[3], pR[3];
+public:
+    typedef std::complex<double> cfloat;
+    float *ins[in_count];
+    float *outs[out_count];
+    float *params[param_count];
+    uint32_t srate;
+    bool is_active;
+    volatile int last_generation, last_calculated_generation;
+    equalizer5band_audio_module();
+    void activate();
+    void deactivate();
+    void params_changed();
+    float freq_gain(int index, double freq, uint32_t sr)
+    {
+        float ret = 1.f;
+        ret *= (*params[param_ls_active] > 0.f) ? lsL.freq_gain(freq, sr) : 1;
+        ret *= (*params[param_hs_active] > 0.f) ? hsL.freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p1_active] > 0.f) ? pL[0].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p2_active] > 0.f) ? pL[1].freq_gain(freq, sr) : 1;
+        ret *= (*params[param_p3_active] > 0.f) ? pL[2].freq_gain(freq, sr) : 1;
+        return ret;
+    }
+    void set_sample_rate(uint32_t sr);
+    uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask);
+    bool get_graph(int index, int subindex, float *data, int points, 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);
+};
+
 /// Filterclavier --- MIDI controlled filter by Hans Baier
 class filterclavier_audio_module: 
         public audio_module<filterclavier_metadata>, 
diff --git a/src/custom_ctl.cpp b/src/custom_ctl.cpp
index 90f60ac..751810c 100644
--- a/src/custom_ctl.cpp
+++ b/src/custom_ctl.cpp
@@ -1129,7 +1129,8 @@ calf_toggle_expose (GtkWidget *widget, GdkEventExpose *event)
     CalfToggle *self = CALF_TOGGLE(widget);
     GdkWindow *window = widget->window;
 
-    int ox = widget->allocation.x, oy = widget->allocation.y;
+    int ox = widget->allocation.x + widget->allocation.width / 2 - self->size * 15;
+    int oy = widget->allocation.y + widget->allocation.height / 2 - self->size * 10;
     int width = self->size * 30, height = self->size * 20;
 
     gdk_draw_pixbuf(GDK_DRAWABLE(widget->window), widget->style->fg_gc[0], CALF_TOGGLE_CLASS(GTK_OBJECT_GET_CLASS(widget))->toggle_image[self->size - 1], 0, height * gtk_range_get_value(GTK_RANGE(widget)), ox, oy, width, height, GDK_RGB_DITHER_NORMAL, 0, 0);
diff --git a/src/modules.cpp b/src/modules.cpp
index dd2d7b5..7dff743 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -212,171 +212,6 @@ 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" };
@@ -440,8 +275,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" },
-    { 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" },
+    { 250,    10,18000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "f1_freq", "Freq" },
+    { 4500,   10,18000, 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" },
@@ -539,6 +374,166 @@ CALF_PLUGIN_INFO(multibandcompressor) = { 0x8502, "Multibandcompressor", "Calf M
 
 ////////////////////////////////////////////////////////////////////////////
 
+CALF_PORT_NAMES(equalizer5band) = {"In L", "In R", "Out L", "Out R"};
+
+CALF_PORT_PROPS(equalizer5band) = {
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
+    { 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,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "ls_freq", "Freq" },
+    
+    { 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,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hs_freq", "Freq" },
+    
+    { 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 1" },
+    { 250,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "p1_freq", "Freq 1" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q 1" },
+    { 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 2" },
+    { 1000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq 2" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q 2" },
+    { 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 3" },
+    { 2500,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq 3" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q 3" },
+};
+
+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) = {
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
+    { 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", "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", "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", "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", "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,          10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hp_mode", "Mode" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" },
+    { 18000,       10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "lp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lp_mode", "Mode" },
+    
+    { 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,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "ls_freq", "Freq" },
+    
+    { 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,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hs_freq", "Freq" },
+    
+    { 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 1" },
+    { 250,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "p1_freq", "Freq 1" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q 1" },
+    { 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 2" },
+    { 1000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq 2" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q 2" },
+    { 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 3" },
+    { 2500,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq 3" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q 3" },
+    { 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 4" },
+    { 5000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq 4" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q 4" },
+};
+
+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"};
+
+CALF_PORT_PROPS(equalizer12band) = {
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
+    { 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", "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", "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", "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", "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,          10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hp_mode", "Mode" },
+    
+    { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" },
+    { 18000,       10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "lp_freq", "Freq" },
+    { 1,           0,           2,     0,  PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lp_mode", "Mode" },
+    
+    { 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,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "ls_freq", "Freq" },
+    
+    { 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,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hs_freq", "Freq" },
+    
+    { 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 1" },
+    { 60,          10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "p1_freq", "Freq 1" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q 1" },
+    { 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 2" },
+    { 120,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq 2" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q 2" },
+    { 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 3" },
+    { 250,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq 3" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q 3" },
+    { 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 4" },
+    { 500,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq 4" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q 4" },
+    { 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 5" },
+    { 1000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p5_freq", "Freq 5" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p5_q", "Q 5" },
+    { 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 6" },
+    { 2500,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p6_freq", "Freq 6" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p6_q", "Q 6" },
+    { 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 7" },
+    { 4000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p7_freq", "Freq 7" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p7_q", "Q 7" },
+    { 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 8" },
+    { 6000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p8_freq", "Freq 8" },
+    { 1,           0.1,         100,   1,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p8_q", "Q 8" },
+};
+
+CALF_PLUGIN_INFO(equalizer12band) = { 0x8501, "Equalizer12Band", "Calf Equalizer 12 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" };
+
+////////////////////////////////////////////////////////////////////////////
+
 ////////////////////////////////////////////////////////////////////////////
 
 CALF_PORT_NAMES(monosynth) = {
diff --git a/src/modules_dsp.cpp b/src/modules_dsp.cpp
index 67c3e9b..131d036 100644
--- a/src/modules_dsp.cpp
+++ b/src/modules_dsp.cpp
@@ -1100,36 +1100,36 @@ void sidechaincompressor_audio_module::params_changed()
                 f2_active = 0.f;
                 break;
             case DEESSER_WIDE:
-                f1L.set_hp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]);
+                f1L.set_peakeq_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);
+                f2L.set_hp_rbj((float)*params[param_f2_freq], q, (float)srate, *params[param_f2_level]);
                 f2R.copy_coeffs(f2L);
-                f1_active = 1.f;
-                f2_active = 0.5f;
+                f1_active = 0.5f;
+                f2_active = 1.f;
                 break;
             case DEESSER_SPLIT:
-                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;
+                f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), q, (float)srate);
+                f1R.copy_coeffs(f1L);
+                f2L.set_hp_rbj((float)*params[param_f2_freq] * (1 - 0.17), q, (float)srate, *params[param_f2_level]);
+                f2R.copy_coeffs(f2L);
                 f1_active = 0.f;
+                f2_active = 1.f;
                 break;
             case DERUMBLER_WIDE:
-                f1L.set_peakeq_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate);
+                f1L.set_lp_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]);
+                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 = 1.f;
+                f1_active = 1.f;
+                f2_active = 0.5f;
                 break;
             case DERUMBLER_SPLIT:
-                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;
+                f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), q, (float)srate, *params[param_f1_level]);
+                f1R.copy_coeffs(f1L);
+                f2L.set_hp_rbj((float)*params[param_f2_freq] * (1 - 0.17), q, (float)srate);
+                f2R.copy_coeffs(f2L);
                 f1_active = 1.f;
+                f2_active = 0.f;
                 break;
             case WEIGHTED_1:
                 f1L.set_lowshelf_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate);
@@ -1631,3 +1631,1092 @@ int gain_reduction_audio_module::get_changed_offsets(int generation, int &subind
         subindex_graph = 2;
     return last_generation;
 }
+
+/// Equalizer 12 Band by Markus Schmidt
+///
+/// This module is based on Krzysztof's filters. It provides a couple
+/// of different chained filters.
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+equalizer12band_audio_module::equalizer12band_audio_module()
+{
+    is_active = false;
+    srate = 0;
+    last_generation = 0;
+    clip_inL    = 0.f;
+    clip_inR    = 0.f;
+    clip_outL   = 0.f;
+    clip_outR   = 0.f;
+    meter_inL  = 0.f;
+    meter_inR  = 0.f;
+    meter_outL = 0.f;
+    meter_outR = 0.f;
+}
+
+void equalizer12band_audio_module::activate()
+{
+    is_active = true;
+    // set all filters
+    params_changed();
+}
+void equalizer12band_audio_module::deactivate()
+{
+    is_active = false;
+}
+
+void equalizer12band_audio_module::params_changed()
+{
+    // set the params of all filters
+    if(*params[param_hp_freq] != hp_freq_old) {
+        hpL[0].set_hp_rbj(*params[param_hp_freq], 0.707, (float)srate, 1.0);
+        hpL[1].copy_coeffs(hpL[0]);
+        hpL[2].copy_coeffs(hpL[0]);
+        hpR[0].copy_coeffs(hpL[0]);
+        hpR[1].copy_coeffs(hpL[0]);
+        hpR[2].copy_coeffs(hpL[0]);
+        hp_freq_old = *params[param_hp_freq];
+    }
+    if(*params[param_lp_freq] != lp_freq_old) {
+        lpL[0].set_lp_rbj(*params[param_lp_freq], 0.707, (float)srate, 1.0);
+        lpL[1].copy_coeffs(lpL[0]);
+        lpL[2].copy_coeffs(lpL[0]);
+        lpR[0].copy_coeffs(lpL[0]);
+        lpR[1].copy_coeffs(lpL[0]);
+        lpR[2].copy_coeffs(lpL[0]);
+        lp_freq_old = *params[param_lp_freq];
+    }
+    if(*params[param_ls_freq] != ls_freq_old or *params[param_ls_level] != ls_level_old) {
+        lsL.set_lowshelf_rbj(*params[param_ls_freq], 0.707, *params[param_ls_level], (float)srate);
+        lsR.copy_coeffs(lsL);
+        ls_level_old = *params[param_ls_level];
+        ls_freq_old = *params[param_ls_freq];
+    }
+    if(*params[param_hs_freq] != hs_freq_old or *params[param_hs_level] != hs_level_old) {
+        hsL.set_highshelf_rbj(*params[param_hs_freq], 0.707, *params[param_hs_level], (float)srate);
+        hsR.copy_coeffs(hsL);
+        hs_level_old = *params[param_hs_level];
+        hs_freq_old = *params[param_hs_freq];
+    }
+    if(*params[param_p1_freq] != p_freq_old[0] or *params[param_p1_level] != p_level_old[0] or *params[param_p1_q] != p_q_old[0]) {
+        pL[0].set_peakeq_rbj((float)*params[param_p1_freq], *params[param_p1_q], *params[param_p1_level], (float)srate);
+        pR[0].copy_coeffs(pL[0]);
+        p_freq_old[0] = *params[param_p1_freq];
+        p_level_old[0] = *params[param_p1_level];
+        p_q_old[0] = *params[param_p1_q];
+    }
+    if(*params[param_p2_freq] != p_freq_old[1] or *params[param_p2_level] != p_level_old[1] or *params[param_p2_q] != p_q_old[1]) {
+        pL[1].set_peakeq_rbj((float)*params[param_p2_freq], *params[param_p2_q], *params[param_p2_level], (float)srate);
+        pR[1].copy_coeffs(pL[1]);
+        p_freq_old[1] = *params[param_p2_freq];
+        p_level_old[1] = *params[param_p2_level];
+        p_q_old[1] = *params[param_p2_q];
+    }
+    if(*params[param_p3_freq] != p_freq_old[2] or *params[param_p3_level] != p_level_old[2] or *params[param_p3_q] != p_q_old[2]) {
+        pL[2].set_peakeq_rbj((float)*params[param_p3_freq], *params[param_p3_q], *params[param_p3_level], (float)srate);
+        pR[2].copy_coeffs(pL[2]);
+        p_freq_old[2] = *params[param_p3_freq];
+        p_level_old[2] = *params[param_p3_level];
+        p_q_old[2] = *params[param_p3_q];
+    }
+    if(*params[param_p4_freq] != p_freq_old[3] or *params[param_p4_level] != p_level_old[3] or *params[param_p4_q] != p_q_old[3]) {
+        pL[3].set_peakeq_rbj((float)*params[param_p4_freq], *params[param_p4_q], *params[param_p4_level], (float)srate);
+        pR[3].copy_coeffs(pL[3]);
+        p_freq_old[3] = *params[param_p4_freq];
+        p_level_old[3] = *params[param_p4_level];
+        p_q_old[3] = *params[param_p4_q];
+    }
+    if(*params[param_p5_freq] != p_freq_old[4] or *params[param_p5_level] != p_level_old[4] or *params[param_p5_q] != p_q_old[4]) {
+        pL[4].set_peakeq_rbj((float)*params[param_p5_freq], *params[param_p5_q], *params[param_p5_level], (float)srate);
+        pR[4].copy_coeffs(pL[4]);
+        p_freq_old[4] = *params[param_p5_freq];
+        p_level_old[4] = *params[param_p5_level];
+        p_q_old[4] = *params[param_p5_q];
+    }
+    if(*params[param_p6_freq] != p_freq_old[5] or *params[param_p6_level] != p_level_old[5] or *params[param_p6_q] != p_q_old[5]) {
+        pL[5].set_peakeq_rbj((float)*params[param_p6_freq], *params[param_p6_q], *params[param_p6_level], (float)srate);
+        pR[5].copy_coeffs(pL[5]);
+        p_freq_old[5] = *params[param_p6_freq];
+        p_level_old[5] = *params[param_p6_level];
+        p_q_old[5] = *params[param_p6_q];
+    }
+    if(*params[param_p7_freq] != p_freq_old[6] or *params[param_p7_level] != p_level_old[6] or *params[param_p7_q] != p_q_old[6]) {
+        pL[6].set_peakeq_rbj((float)*params[param_p7_freq], *params[param_p7_q], *params[param_p7_level], (float)srate);
+        pR[6].copy_coeffs(pL[6]);
+        p_freq_old[6] = *params[param_p7_freq];
+        p_level_old[6] = *params[param_p7_level];
+        p_q_old[6] = *params[param_p7_q];
+    }
+    if(*params[param_p8_freq] != p_freq_old[7] or *params[param_p8_level] != p_level_old[7] or *params[param_p8_q] != p_q_old[7]) {
+        pL[7].set_peakeq_rbj((float)*params[param_p8_freq], *params[param_p8_q], *params[param_p8_level], (float)srate);
+        pR[7].copy_coeffs(pL[7]);
+        p_freq_old[7] = *params[param_p8_freq];
+        p_level_old[7] = *params[param_p8_level];
+        p_q_old[7] = *params[param_p8_q];
+    }
+}
+
+void equalizer12band_audio_module::set_sample_rate(uint32_t sr)
+{
+    srate = sr;
+}
+
+uint32_t equalizer12band_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask)
+{
+    bool bypass = *params[param_bypass] > 0.5f;
+    numsamples += offset;
+    if(bypass) {
+        // everything bypassed
+        while(offset < numsamples) {
+            outs[0][offset] = ins[0][offset];
+            outs[1][offset] = ins[1][offset];
+            ++offset;
+        }
+        // displays, too
+        clip_inL    = 0.f;
+        clip_inR    = 0.f;
+        clip_outL   = 0.f;
+        clip_outR   = 0.f;
+        meter_inL  = 0.f;
+        meter_inR  = 0.f;
+        meter_outL = 0.f;
+        meter_outR = 0.f;
+    } else {
+        
+        clip_inL    -= std::min(clip_inL,  numsamples);
+        clip_inR    -= std::min(clip_inR,  numsamples);
+        clip_outL   -= std::min(clip_outL, numsamples);
+        clip_outR   -= std::min(clip_outR, numsamples);
+        meter_inL = 0.f;
+        meter_inR = 0.f;
+        meter_outL = 0.f;
+        meter_outR = 0.f;
+        
+        // process
+        while(offset < numsamples) {
+            // cycle through samples
+            float outL = 0.f;
+            float outR = 0.f;
+            float inL = ins[0][offset];
+            float inR = ins[1][offset];
+            // in level
+            inR *= *params[param_level_in];
+            inL *= *params[param_level_in];
+            
+            float procL = inL;
+            float procR = inR;
+            
+            // all filters in chain
+            if(*params[param_hp_active] > 0.f) {
+                switch((int)*params[param_hp_mode]) {
+                    case MODE12DB:
+                        procL = hpL[0].process(procL);
+                        procR = hpR[0].process(procR);
+                        break;
+                    case MODE24DB:
+                        procL = hpL[1].process(hpL[0].process(procL));
+                        procR = hpR[1].process(hpR[0].process(procR));
+                        break;
+                    case MODE36DB:
+                        procL = hpL[2].process(hpL[1].process(hpL[0].process(procL)));
+                        procR = hpR[2].process(hpR[1].process(hpR[0].process(procR)));
+                        break;
+                }
+            }
+            if(*params[param_lp_active] > 0.f) {
+                switch((int)*params[param_lp_mode]) {
+                    case MODE12DB:
+                        procL = lpL[0].process(procL);
+                        procR = lpR[0].process(procR);
+                        break;
+                    case MODE24DB:
+                        procL = lpL[1].process(lpL[0].process(procL));
+                        procR = lpR[1].process(lpR[0].process(procR));
+                        break;
+                    case MODE36DB:
+                        procL = lpL[2].process(lpL[1].process(lpL[0].process(procL)));
+                        procR = lpR[2].process(lpR[1].process(lpR[0].process(procR)));
+                        break;
+                }
+            }
+            if(*params[param_ls_active] > 0.f) {
+                procL = lsL.process(procL);
+                procR = lsR.process(procR);
+            }
+            if(*params[param_hs_active] > 0.f) {
+                procL = hsL.process(procL);
+                procR = hsR.process(procR);
+            }
+            if(*params[param_p1_active] > 0.f) {
+                procL = pL[0].process(procL);
+                procR = pR[0].process(procR);
+            }
+            if(*params[param_p2_active] > 0.f) {
+                procL = pL[1].process(procL);
+                procR = pR[1].process(procR);
+            }
+            if(*params[param_p3_active] > 0.f) {
+                procL = pL[2].process(procL);
+                procR = pR[2].process(procR);
+            }
+            if(*params[param_p4_active] > 0.f) {
+                procL = pL[3].process(procL);
+                procR = pR[3].process(procR);
+            }
+            if(*params[param_p5_active] > 0.f) {
+                procL = pL[4].process(procL);
+                procR = pR[4].process(procR);
+            }
+            if(*params[param_p6_active] > 0.f) {
+                procL = pL[5].process(procL);
+                procR = pR[5].process(procR);
+            }
+            if(*params[param_p7_active] > 0.f) {
+                procL = pL[6].process(procL);
+                procR = pR[6].process(procR);
+            }
+            if(*params[param_p8_active] > 0.f) {
+                procL = pL[7].process(procL);
+                procR = pR[7].process(procR);
+            }
+            
+            outL = procL * *params[param_level_out];
+            outR = procR * *params[param_level_out];
+            
+            // send to output
+            outs[0][offset] = outL;
+            outs[1][offset] = outR;
+            
+            // clip LED's
+            if(inL > 1.f) {
+                clip_inL  = srate >> 3;
+            }
+            if(inR > 1.f) {
+                clip_inR  = srate >> 3;
+            }
+            if(outL > 1.f) {
+                clip_outL = srate >> 3;
+            }
+            if(outR > 1.f) {
+                clip_outR = srate >> 3;
+            }
+            // set up in / out meters
+            if(inL > meter_inL) {
+                meter_inL = inL;
+            }
+            if(inR > meter_inR) {
+                meter_inR = inR;
+            }
+            if(outL > meter_outL) {
+                meter_outL = outL;
+            }
+            if(outR > meter_outR) {
+                meter_outR = outR;
+            }
+            
+            // next sample
+            ++offset;
+        } // cycle trough samples
+        // clean up
+        for(int i = 0; i < 3; ++i) {
+            hpL[i].sanitize();
+            hpR[i].sanitize();
+            lpL[i].sanitize();
+            lpR[i].sanitize();
+        }
+        lsL.sanitize();
+        hsR.sanitize();
+        for(int i = 0; i < 8; ++i) {
+            pL[i].sanitize();
+            pR[i].sanitize();
+        }
+    }
+    // draw meters
+    if(params[param_clip_inL] != NULL) {
+        *params[param_clip_inL] = clip_inL;
+    }
+    if(params[param_clip_inR] != NULL) {
+        *params[param_clip_inR] = clip_inR;
+    }
+    if(params[param_clip_outL] != NULL) {
+        *params[param_clip_outL] = clip_outL;
+    }
+    if(params[param_clip_outR] != NULL) {
+        *params[param_clip_outR] = clip_outR;
+    }
+    
+    if(params[param_meter_inL] != NULL) {
+        *params[param_meter_inL] = meter_inL;
+    }
+    if(params[param_meter_inR] != NULL) {
+        *params[param_meter_inR] = meter_inR;
+    }
+    if(params[param_meter_outL] != NULL) {
+        *params[param_meter_outL] = meter_outL;
+    }
+    if(params[param_meter_outR] != NULL) {
+        *params[param_meter_outR] = meter_outR;
+    }
+    // whatever has to be returned x)
+    return outputs_mask;
+}
+bool equalizer12band_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context)
+{
+    if (!is_active)
+        return false;
+    if (index == param_p1_freq && !subindex) {
+        context->set_line_width(1.5);
+        return ::get_graph(*this, subindex, data, points);
+    }
+    return false;
+}
+
+bool equalizer12band_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context)
+{
+    if (!is_active) {
+        return false;
+    } else {
+        return get_freq_gridline(subindex, pos, vertical, legend, context);
+    }
+}
+
+int equalizer12band_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline)
+{
+    if (!is_active) {
+        return false;
+    } else {
+        if (*params[param_hp_freq] != hp_freq_old1
+            or *params[param_hp_mode] != hp_mode_old1
+            or *params[param_lp_freq] != lp_freq_old1
+            or *params[param_lp_mode] != lp_mode_old1
+            
+            or *params[param_ls_freq] != ls_freq_old1
+            or *params[param_ls_level] != ls_level_old1
+            or *params[param_hs_freq] != hs_freq_old1
+            or *params[param_hs_level] != hs_level_old1
+            
+            or *params[param_p1_freq] != p_freq_old1[0]
+            or *params[param_p1_level] != p_level_old1[0]
+            or *params[param_p1_q] != p_q_old1[0]
+            
+            or *params[param_p2_freq] != p_freq_old1[1]
+            or *params[param_p2_level] != p_level_old1[1]
+            or *params[param_p2_q] != p_q_old1[1]
+                        
+            or *params[param_p3_freq] != p_freq_old1[2]
+            or *params[param_p3_level] != p_level_old1[2]
+            or *params[param_p3_q] != p_q_old1[2]
+            
+            or *params[param_p4_freq] != p_freq_old1[3]
+            or *params[param_p4_level] != p_level_old1[3]
+            or *params[param_p4_q] != p_q_old1[3]
+            
+            or *params[param_p5_freq] != p_freq_old1[4]
+            or *params[param_p5_level] != p_level_old1[4]
+            or *params[param_p5_q] != p_q_old1[4]
+            
+            or *params[param_p6_freq] != p_freq_old1[5]
+            or *params[param_p6_level] != p_level_old1[5]
+            or *params[param_p6_q] != p_q_old1[5]
+            
+            or *params[param_p7_freq] != p_freq_old1[6]
+            or *params[param_p7_level] != p_level_old1[6]
+            or *params[param_p7_q] != p_q_old1[6]
+            
+            or *params[param_p8_freq] != p_freq_old1[7]
+            or *params[param_p8_level] != p_level_old1[7]
+            or *params[param_p8_q] != p_q_old1[7])
+        {
+            
+            hp_freq_old1 = *params[param_hp_freq];
+            hp_mode_old1 = *params[param_hp_mode];
+            lp_freq_old1 = *params[param_lp_freq];
+            lp_mode_old1 = *params[param_lp_mode];
+            
+            ls_freq_old1 = *params[param_ls_freq];
+            ls_level_old1 = *params[param_ls_level];
+            hs_freq_old1 = *params[param_hs_freq];
+            hs_level_old1 = *params[param_hs_level];
+            
+            p_freq_old1[0] = *params[param_p1_freq];
+            p_level_old1[0] = *params[param_p1_level];
+            p_q_old1[0] = *params[param_p1_q];
+            
+            p_freq_old1[1] = *params[param_p2_freq];
+            p_level_old1[1] = *params[param_p2_level];
+            p_q_old1[1] = *params[param_p2_q];
+            
+            p_freq_old1[2] = *params[param_p3_freq];
+            p_level_old1[2] = *params[param_p3_level];
+            p_q_old1[2] = *params[param_p3_q];
+            
+            p_freq_old1[3] = *params[param_p4_freq];
+            p_level_old1[3] = *params[param_p4_level];
+            p_q_old1[3] = *params[param_p4_q];
+            
+            p_freq_old1[4] = *params[param_p5_freq];
+            p_level_old1[4] = *params[param_p5_level];
+            p_q_old1[4] = *params[param_p5_q];
+            
+            p_freq_old1[5] = *params[param_p6_freq];
+            p_level_old1[5] = *params[param_p6_level];
+            p_q_old1[5] = *params[param_p6_q];
+            
+            p_freq_old1[6] = *params[param_p7_freq];
+            p_level_old1[6] = *params[param_p7_level];
+            p_q_old1[6] = *params[param_p7_q];
+            
+            p_freq_old1[7] = *params[param_p8_freq];
+            p_level_old1[7] = *params[param_p8_level];
+            p_q_old1[7] = *params[param_p8_q];
+            
+            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;
+}
+
+/// Equalizer 8 Band by Markus Schmidt
+///
+/// This module is based on Krzysztof's filters. It provides a couple
+/// of different chained filters.
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+equalizer8band_audio_module::equalizer8band_audio_module()
+{
+    is_active = false;
+    srate = 0;
+    last_generation = 0;
+    clip_inL    = 0.f;
+    clip_inR    = 0.f;
+    clip_outL   = 0.f;
+    clip_outR   = 0.f;
+    meter_inL  = 0.f;
+    meter_inR  = 0.f;
+    meter_outL = 0.f;
+    meter_outR = 0.f;
+}
+
+void equalizer8band_audio_module::activate()
+{
+    is_active = true;
+    // set all filters
+    params_changed();
+}
+void equalizer8band_audio_module::deactivate()
+{
+    is_active = false;
+}
+
+void equalizer8band_audio_module::params_changed()
+{
+    // set the params of all filters
+    if(*params[param_hp_freq] != hp_freq_old) {
+        hpL[0].set_hp_rbj(*params[param_hp_freq], 0.707, (float)srate, 1.0);
+        hpL[1].copy_coeffs(hpL[0]);
+        hpL[2].copy_coeffs(hpL[0]);
+        hpR[0].copy_coeffs(hpL[0]);
+        hpR[1].copy_coeffs(hpL[0]);
+        hpR[2].copy_coeffs(hpL[0]);
+        hp_freq_old = *params[param_hp_freq];
+    }
+    if(*params[param_lp_freq] != lp_freq_old) {
+        lpL[0].set_lp_rbj(*params[param_lp_freq], 0.707, (float)srate, 1.0);
+        lpL[1].copy_coeffs(lpL[0]);
+        lpL[2].copy_coeffs(lpL[0]);
+        lpR[0].copy_coeffs(lpL[0]);
+        lpR[1].copy_coeffs(lpL[0]);
+        lpR[2].copy_coeffs(lpL[0]);
+        lp_freq_old = *params[param_lp_freq];
+    }
+    if(*params[param_ls_freq] != ls_freq_old or *params[param_ls_level] != ls_level_old) {
+        lsL.set_lowshelf_rbj(*params[param_ls_freq], 0.707, *params[param_ls_level], (float)srate);
+        lsR.copy_coeffs(lsL);
+        ls_level_old = *params[param_ls_level];
+        ls_freq_old = *params[param_ls_freq];
+    }
+    if(*params[param_hs_freq] != hs_freq_old or *params[param_hs_level] != hs_level_old) {
+        hsL.set_highshelf_rbj(*params[param_hs_freq], 0.707, *params[param_hs_level], (float)srate);
+        hsR.copy_coeffs(hsL);
+        hs_level_old = *params[param_hs_level];
+        hs_freq_old = *params[param_hs_freq];
+    }
+    if(*params[param_p1_freq] != p_freq_old[0] or *params[param_p1_level] != p_level_old[0] or *params[param_p1_q] != p_q_old[0]) {
+        pL[0].set_peakeq_rbj((float)*params[param_p1_freq], *params[param_p1_q], *params[param_p1_level], (float)srate);
+        pR[0].copy_coeffs(pL[0]);
+        p_freq_old[0] = *params[param_p1_freq];
+        p_level_old[0] = *params[param_p1_level];
+        p_q_old[0] = *params[param_p1_q];
+    }
+    if(*params[param_p2_freq] != p_freq_old[1] or *params[param_p2_level] != p_level_old[1] or *params[param_p2_q] != p_q_old[1]) {
+        pL[1].set_peakeq_rbj((float)*params[param_p2_freq], *params[param_p2_q], *params[param_p2_level], (float)srate);
+        pR[1].copy_coeffs(pL[1]);
+        p_freq_old[1] = *params[param_p2_freq];
+        p_level_old[1] = *params[param_p2_level];
+        p_q_old[1] = *params[param_p2_q];
+    }
+    if(*params[param_p3_freq] != p_freq_old[2] or *params[param_p3_level] != p_level_old[2] or *params[param_p3_q] != p_q_old[2]) {
+        pL[2].set_peakeq_rbj((float)*params[param_p3_freq], *params[param_p3_q], *params[param_p3_level], (float)srate);
+        pR[2].copy_coeffs(pL[2]);
+        p_freq_old[2] = *params[param_p3_freq];
+        p_level_old[2] = *params[param_p3_level];
+        p_q_old[2] = *params[param_p3_q];
+    }
+    if(*params[param_p4_freq] != p_freq_old[3] or *params[param_p4_level] != p_level_old[3] or *params[param_p4_q] != p_q_old[3]) {
+        pL[3].set_peakeq_rbj((float)*params[param_p4_freq], *params[param_p4_q], *params[param_p4_level], (float)srate);
+        pR[3].copy_coeffs(pL[3]);
+        p_freq_old[3] = *params[param_p4_freq];
+        p_level_old[3] = *params[param_p4_level];
+        p_q_old[3] = *params[param_p4_q];
+    }
+}
+
+void equalizer8band_audio_module::set_sample_rate(uint32_t sr)
+{
+    srate = sr;
+}
+
+uint32_t equalizer8band_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask)
+{
+    bool bypass = *params[param_bypass] > 0.5f;
+    numsamples += offset;
+    if(bypass) {
+        // everything bypassed
+        while(offset < numsamples) {
+            outs[0][offset] = ins[0][offset];
+            outs[1][offset] = ins[1][offset];
+            ++offset;
+        }
+        // displays, too
+        clip_inL    = 0.f;
+        clip_inR    = 0.f;
+        clip_outL   = 0.f;
+        clip_outR   = 0.f;
+        meter_inL  = 0.f;
+        meter_inR  = 0.f;
+        meter_outL = 0.f;
+        meter_outR = 0.f;
+    } else {
+        
+        clip_inL    -= std::min(clip_inL,  numsamples);
+        clip_inR    -= std::min(clip_inR,  numsamples);
+        clip_outL   -= std::min(clip_outL, numsamples);
+        clip_outR   -= std::min(clip_outR, numsamples);
+        meter_inL = 0.f;
+        meter_inR = 0.f;
+        meter_outL = 0.f;
+        meter_outR = 0.f;
+        
+        // process
+        while(offset < numsamples) {
+            // cycle through samples
+            float outL = 0.f;
+            float outR = 0.f;
+            float inL = ins[0][offset];
+            float inR = ins[1][offset];
+            // in level
+            inR *= *params[param_level_in];
+            inL *= *params[param_level_in];
+            
+            float procL = inL;
+            float procR = inR;
+            
+            // all filters in chain
+            if(*params[param_hp_active] > 0.f) {
+                switch((int)*params[param_hp_mode]) {
+                    case MODE12DB:
+                        procL = hpL[0].process(procL);
+                        procR = hpR[0].process(procR);
+                        break;
+                    case MODE24DB:
+                        procL = hpL[1].process(hpL[0].process(procL));
+                        procR = hpR[1].process(hpR[0].process(procR));
+                        break;
+                    case MODE36DB:
+                        procL = hpL[2].process(hpL[1].process(hpL[0].process(procL)));
+                        procR = hpR[2].process(hpR[1].process(hpR[0].process(procR)));
+                        break;
+                }
+            }
+            if(*params[param_lp_active] > 0.f) {
+                switch((int)*params[param_lp_mode]) {
+                    case MODE12DB:
+                        procL = lpL[0].process(procL);
+                        procR = lpR[0].process(procR);
+                        break;
+                    case MODE24DB:
+                        procL = lpL[1].process(lpL[0].process(procL));
+                        procR = lpR[1].process(lpR[0].process(procR));
+                        break;
+                    case MODE36DB:
+                        procL = lpL[2].process(lpL[1].process(lpL[0].process(procL)));
+                        procR = lpR[2].process(lpR[1].process(lpR[0].process(procR)));
+                        break;
+                }
+            }
+            if(*params[param_ls_active] > 0.f) {
+                procL = lsL.process(procL);
+                procR = lsR.process(procR);
+            }
+            if(*params[param_hs_active] > 0.f) {
+                procL = hsL.process(procL);
+                procR = hsR.process(procR);
+            }
+            if(*params[param_p1_active] > 0.f) {
+                procL = pL[0].process(procL);
+                procR = pR[0].process(procR);
+            }
+            if(*params[param_p2_active] > 0.f) {
+                procL = pL[1].process(procL);
+                procR = pR[1].process(procR);
+            }
+            if(*params[param_p3_active] > 0.f) {
+                procL = pL[2].process(procL);
+                procR = pR[2].process(procR);
+            }
+            if(*params[param_p4_active] > 0.f) {
+                procL = pL[3].process(procL);
+                procR = pR[3].process(procR);
+            }
+            
+            outL = procL * *params[param_level_out];
+            outR = procR * *params[param_level_out];
+            
+            // send to output
+            outs[0][offset] = outL;
+            outs[1][offset] = outR;
+            
+            // clip LED's
+            if(inL > 1.f) {
+                clip_inL  = srate >> 3;
+            }
+            if(inR > 1.f) {
+                clip_inR  = srate >> 3;
+            }
+            if(outL > 1.f) {
+                clip_outL = srate >> 3;
+            }
+            if(outR > 1.f) {
+                clip_outR = srate >> 3;
+            }
+            // set up in / out meters
+            if(inL > meter_inL) {
+                meter_inL = inL;
+            }
+            if(inR > meter_inR) {
+                meter_inR = inR;
+            }
+            if(outL > meter_outL) {
+                meter_outL = outL;
+            }
+            if(outR > meter_outR) {
+                meter_outR = outR;
+            }
+            
+            // next sample
+            ++offset;
+        } // cycle trough samples
+        // clean up
+        for(int i = 0; i < 3; ++i) {
+            hpL[i].sanitize();
+            hpR[i].sanitize();
+            lpL[i].sanitize();
+            lpR[i].sanitize();
+        }
+        lsL.sanitize();
+        hsR.sanitize();
+        for(int i = 0; i < 4; ++i) {
+            pL[i].sanitize();
+            pR[i].sanitize();
+        }
+    }
+    // draw meters
+    if(params[param_clip_inL] != NULL) {
+        *params[param_clip_inL] = clip_inL;
+    }
+    if(params[param_clip_inR] != NULL) {
+        *params[param_clip_inR] = clip_inR;
+    }
+    if(params[param_clip_outL] != NULL) {
+        *params[param_clip_outL] = clip_outL;
+    }
+    if(params[param_clip_outR] != NULL) {
+        *params[param_clip_outR] = clip_outR;
+    }
+    
+    if(params[param_meter_inL] != NULL) {
+        *params[param_meter_inL] = meter_inL;
+    }
+    if(params[param_meter_inR] != NULL) {
+        *params[param_meter_inR] = meter_inR;
+    }
+    if(params[param_meter_outL] != NULL) {
+        *params[param_meter_outL] = meter_outL;
+    }
+    if(params[param_meter_outR] != NULL) {
+        *params[param_meter_outR] = meter_outR;
+    }
+    // whatever has to be returned x)
+    return outputs_mask;
+}
+bool equalizer8band_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context)
+{
+    if (!is_active)
+        return false;
+    if (index == param_p1_freq && !subindex) {
+        context->set_line_width(1.5);
+        return ::get_graph(*this, subindex, data, points);
+    }
+    return false;
+}
+
+bool equalizer8band_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context)
+{
+    if (!is_active) {
+        return false;
+    } else {
+        return get_freq_gridline(subindex, pos, vertical, legend, context);
+    }
+}
+
+int equalizer8band_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline)
+{
+    if (!is_active) {
+        return false;
+    } else {
+        if (*params[param_hp_freq] != hp_freq_old1
+            or *params[param_hp_mode] != hp_mode_old1
+            or *params[param_lp_freq] != lp_freq_old1
+            or *params[param_lp_mode] != lp_mode_old1
+            
+            or *params[param_ls_freq] != ls_freq_old1
+            or *params[param_ls_level] != ls_level_old1
+            or *params[param_hs_freq] != hs_freq_old1
+            or *params[param_hs_level] != hs_level_old1
+            
+            or *params[param_p1_freq] != p_freq_old1[0]
+            or *params[param_p1_level] != p_level_old1[0]
+            or *params[param_p1_q] != p_q_old1[0]
+            
+            or *params[param_p2_freq] != p_freq_old1[1]
+            or *params[param_p2_level] != p_level_old1[1]
+            or *params[param_p2_q] != p_q_old1[1]
+                        
+            or *params[param_p3_freq] != p_freq_old1[2]
+            or *params[param_p3_level] != p_level_old1[2]
+            or *params[param_p3_q] != p_q_old1[2]
+            
+            or *params[param_p4_freq] != p_freq_old1[3]
+            or *params[param_p4_level] != p_level_old1[3]
+            or *params[param_p4_q] != p_q_old1[3])
+        {
+            
+            hp_freq_old1 = *params[param_hp_freq];
+            hp_mode_old1 = *params[param_hp_mode];
+            lp_freq_old1 = *params[param_lp_freq];
+            lp_mode_old1 = *params[param_lp_mode];
+            
+            ls_freq_old1 = *params[param_ls_freq];
+            ls_level_old1 = *params[param_ls_level];
+            hs_freq_old1 = *params[param_hs_freq];
+            hs_level_old1 = *params[param_hs_level];
+            
+            p_freq_old1[0] = *params[param_p1_freq];
+            p_level_old1[0] = *params[param_p1_level];
+            p_q_old1[0] = *params[param_p1_q];
+            
+            p_freq_old1[1] = *params[param_p2_freq];
+            p_level_old1[1] = *params[param_p2_level];
+            p_q_old1[1] = *params[param_p2_q];
+            
+            p_freq_old1[2] = *params[param_p3_freq];
+            p_level_old1[2] = *params[param_p3_level];
+            p_q_old1[2] = *params[param_p3_q];
+            
+            p_freq_old1[3] = *params[param_p4_freq];
+            p_level_old1[3] = *params[param_p4_level];
+            p_q_old1[3] = *params[param_p4_q];
+            
+            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;
+}
+
+/// Equalizer 5 Band by Markus Schmidt
+///
+/// This module is based on Krzysztof's filters. It provides a couple
+/// of different chained filters.
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+equalizer5band_audio_module::equalizer5band_audio_module()
+{
+    is_active = false;
+    srate = 0;
+    last_generation = 0;
+    clip_in    = 0.f;
+    clip_out   = 0.f;
+    meter_in  = 0.f;
+    meter_out = 0.f;
+}
+
+void equalizer5band_audio_module::activate()
+{
+    is_active = true;
+    // set all filters
+    params_changed();
+}
+void equalizer5band_audio_module::deactivate()
+{
+    is_active = false;
+}
+
+void equalizer5band_audio_module::params_changed()
+{
+    // set the params of all filters
+    if(*params[param_ls_freq] != ls_freq_old or *params[param_ls_level] != ls_level_old) {
+        lsL.set_lowshelf_rbj(*params[param_ls_freq], 0.707, *params[param_ls_level], (float)srate);
+        lsR.copy_coeffs(lsL);
+        ls_level_old = *params[param_ls_level];
+        ls_freq_old = *params[param_ls_freq];
+    }
+    if(*params[param_hs_freq] != hs_freq_old or *params[param_hs_level] != hs_level_old) {
+        hsL.set_highshelf_rbj(*params[param_hs_freq], 0.707, *params[param_hs_level], (float)srate);
+        hsR.copy_coeffs(hsL);
+        hs_level_old = *params[param_hs_level];
+        hs_freq_old = *params[param_hs_freq];
+    }
+    if(*params[param_p1_freq] != p_freq_old[0] or *params[param_p1_level] != p_level_old[0] or *params[param_p1_q] != p_q_old[0]) {
+        pL[0].set_peakeq_rbj((float)*params[param_p1_freq], *params[param_p1_q], *params[param_p1_level], (float)srate);
+        pR[0].copy_coeffs(pL[0]);
+        p_freq_old[0] = *params[param_p1_freq];
+        p_level_old[0] = *params[param_p1_level];
+        p_q_old[0] = *params[param_p1_q];
+    }
+    if(*params[param_p2_freq] != p_freq_old[1] or *params[param_p2_level] != p_level_old[1] or *params[param_p2_q] != p_q_old[1]) {
+        pL[1].set_peakeq_rbj((float)*params[param_p2_freq], *params[param_p2_q], *params[param_p2_level], (float)srate);
+        pR[1].copy_coeffs(pL[1]);
+        p_freq_old[1] = *params[param_p2_freq];
+        p_level_old[1] = *params[param_p2_level];
+        p_q_old[1] = *params[param_p2_q];
+    }
+    if(*params[param_p3_freq] != p_freq_old[2] or *params[param_p3_level] != p_level_old[2] or *params[param_p3_q] != p_q_old[2]) {
+        pL[2].set_peakeq_rbj((float)*params[param_p3_freq], *params[param_p3_q], *params[param_p3_level], (float)srate);
+        pR[2].copy_coeffs(pL[2]);
+        p_freq_old[2] = *params[param_p3_freq];
+        p_level_old[2] = *params[param_p3_level];
+        p_q_old[2] = *params[param_p3_q];
+    }
+}
+
+void equalizer5band_audio_module::set_sample_rate(uint32_t sr)
+{
+    srate = sr;
+}
+
+uint32_t equalizer5band_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask)
+{
+    bool bypass = *params[param_bypass] > 0.5f;
+    numsamples += offset;
+    if(bypass) {
+        // everything bypassed
+        while(offset < numsamples) {
+            outs[0][offset] = ins[0][offset];
+            outs[1][offset] = ins[1][offset];
+            ++offset;
+        }
+        // displays, too
+        clip_in    = 0.f;
+        clip_out   = 0.f;
+        meter_in  = 0.f;
+        meter_out = 0.f;
+    } else {
+        
+        clip_in    -= std::min(clip_in,  numsamples);
+        clip_out   -= std::min(clip_out, numsamples);
+        meter_in = 0.f;
+        meter_out = 0.f;
+        
+        // process
+        while(offset < numsamples) {
+            // cycle through samples
+            float outL = 0.f;
+            float outR = 0.f;
+            float inL = ins[0][offset];
+            float inR = ins[1][offset];
+            // in level
+            inR *= *params[param_level_in];
+            inL *= *params[param_level_in];
+            
+            float procL = inL;
+            float procR = inR;
+            
+            // all filters in chain
+            if(*params[param_ls_active] > 0.f) {
+                procL = lsL.process(procL);
+                procR = lsR.process(procR);
+            }
+            if(*params[param_hs_active] > 0.f) {
+                procL = hsL.process(procL);
+                procR = hsR.process(procR);
+            }
+            if(*params[param_p1_active] > 0.f) {
+                procL = pL[0].process(procL);
+                procR = pR[0].process(procR);
+            }
+            if(*params[param_p2_active] > 0.f) {
+                procL = pL[1].process(procL);
+                procR = pR[1].process(procR);
+            }
+            if(*params[param_p3_active] > 0.f) {
+                procL = pL[2].process(procL);
+                procR = pR[2].process(procR);
+            }
+            
+            outL = procL * *params[param_level_out];
+            outR = procR * *params[param_level_out];
+            
+            // send to output
+            outs[0][offset] = outL;
+            outs[1][offset] = outR;
+            
+            // clip LED's
+            float maxIn = std::max(fabs(inL), fabs(inR));
+            float maxOut = std::max(fabs(outL), fabs(outR));
+            
+            if(maxIn > 1.f) {
+                clip_in  = srate >> 3;
+            }
+            if(maxOut > 1.f) {
+                clip_out = srate >> 3;
+            }
+            // set up in / out meters
+            if(maxIn > meter_in) {
+                meter_in = maxIn;
+            }
+            if(maxOut > meter_out) {
+                meter_out = maxOut;
+            }
+            
+            // next sample
+            ++offset;
+        } // cycle trough samples
+        // clean up
+        lsL.sanitize();
+        hsR.sanitize();
+        for(int i = 0; i < 3; ++i) {
+            pL[i].sanitize();
+            pR[i].sanitize();
+        }
+    }
+    // draw meters
+    if(params[param_clip_in] != NULL) {
+        *params[param_clip_in] = clip_in;
+    }
+    if(params[param_clip_out] != NULL) {
+        *params[param_clip_out] = clip_out;
+    }
+    
+    if(params[param_meter_in] != NULL) {
+        *params[param_meter_in] = meter_in;
+    }
+    if(params[param_meter_out] != NULL) {
+        *params[param_meter_out] = meter_out;
+    }
+    // whatever has to be returned x)
+    return outputs_mask;
+}
+bool equalizer5band_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context)
+{
+    if (!is_active)
+        return false;
+    if (index == param_p1_freq && !subindex) {
+        context->set_line_width(1.5);
+        return ::get_graph(*this, subindex, data, points);
+    }
+    return false;
+}
+
+bool equalizer5band_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context)
+{
+    if (!is_active) {
+        return false;
+    } else {
+        return get_freq_gridline(subindex, pos, vertical, legend, context);
+    }
+}
+
+int equalizer5band_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline)
+{
+    if (!is_active) {
+        return false;
+    } else {
+        if (*params[param_ls_freq] != ls_freq_old1
+            or *params[param_ls_level] != ls_level_old1
+            or *params[param_hs_freq] != hs_freq_old1
+            or *params[param_hs_level] != hs_level_old1
+            
+            or *params[param_p1_freq] != p_freq_old1[0]
+            or *params[param_p1_level] != p_level_old1[0]
+            or *params[param_p1_q] != p_q_old1[0]
+            
+            or *params[param_p2_freq] != p_freq_old1[1]
+            or *params[param_p2_level] != p_level_old1[1]
+            or *params[param_p2_q] != p_q_old1[1]
+                        
+            or *params[param_p3_freq] != p_freq_old1[2]
+            or *params[param_p3_level] != p_level_old1[2]
+            or *params[param_p3_q] != p_q_old1[2])
+        {
+            
+            ls_freq_old1 = *params[param_ls_freq];
+            ls_level_old1 = *params[param_ls_level];
+            hs_freq_old1 = *params[param_hs_freq];
+            hs_level_old1 = *params[param_hs_level];
+            
+            p_freq_old1[0] = *params[param_p1_freq];
+            p_level_old1[0] = *params[param_p1_level];
+            p_q_old1[0] = *params[param_p1_q];
+            
+            p_freq_old1[1] = *params[param_p2_freq];
+            p_level_old1[1] = *params[param_p2_level];
+            p_q_old1[1] = *params[param_p2_q];
+            
+            p_freq_old1[2] = *params[param_p3_freq];
+            p_level_old1[2] = *params[param_p3_level];
+            p_q_old1[2] = *params[param_p3_q];
+            
+            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