[SCM] calf/master: Rewrite of vumeters Vumeters with value label (not converted to string by now)

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


The following commit has been merged in the master branch:
commit aaab56aba7b3ea20ad92d6892fd4513176e55032
Author: Markus Schmidt <schmidt at boomshop.net>
Date:   Wed Nov 23 08:35:23 2011 +0100

    Rewrite of vumeters
    Vumeters with value label (not converted to string by now)

diff --git a/gui/gui-compressor.xml b/gui/gui-compressor.xml
index 0f9cdcc..2d6a54d 100644
--- a/gui/gui-compressor.xml
+++ b/gui/gui-compressor.xml
@@ -17,15 +17,15 @@
             <vbox spacing="5">
                 <table expand="0" fill="0" rows="3" cols="3">
                     <label param="meter_in" expand-x="0" fill-x="0" attach-x="0" attach-y="0" />
-                    <vumeter param="meter_in" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_in" mode="0" position="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
                     <led param="clip_in" mode="0" expand-x="0" fill-x="0" attach-x="2" attach-y="0" />
                     
                     <label param="meter_out" expand-x="0" fill-x="0" attach-x="0" attach-y="1" />
-                    <vumeter param="meter_out" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_out" mode="0" position="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
                     <led param="clip_out" mode="1" expand-x="0" fill-x="0" attach-x="2" attach-y="1" />
                     
                     <label param="compression" expand-x="0" fill-x="0" attach-x="0" attach-y="2" />
-                    <vumeter param="compression" mode="2" hold="1.5" expand-x="1" fill-x="1" attach-x="1" attach-y="2" attach-w="2" />
+                    <vumeter param="compression" mode="2" position="2" hold="1.5" expand-x="1" fill-x="1" attach-x="1" attach-y="2" attach-w="2" />
                 </table>
                 
                 <table expand="1" rows="2" cols="3" homogeneous="1">
diff --git a/gui/gui-deesser.xml b/gui/gui-deesser.xml
index 59ba5ee..96c70c0 100644
--- a/gui/gui-deesser.xml
+++ b/gui/gui-deesser.xml
@@ -5,8 +5,8 @@
             <toggle param="bypass" attach-x="0" attach-y="1" attach-h="2" expand-x="0" fill-x="0" />
             
             <label param="detected" attach-x="1" attach-y="0" />
-            <vumeter param="detected" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" />
-            <vumeter param="compression" mode="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="2" />
+            <vumeter param="detected" position="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" />
+            <vumeter param="compression" position="2" mode="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="2" />
             <label param="compression" attach-x="1" attach-y="3" />
             
             <label param="clip_out" attach-x="2" attach-y="0" expand-x="0" fill-x="0" />
diff --git a/gui/gui-eq12.xml b/gui/gui-eq12.xml
index 8afff48..21e209f 100644
--- a/gui/gui-eq12.xml
+++ b/gui/gui-eq12.xml
@@ -4,11 +4,11 @@
             <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" text="L"/>
-                    <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"/>
+                    <vumeter param="meter_inL" position="2" 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" text="R"/>
-                    <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"/>
+                    <vumeter param="meter_inR" position="2" 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>
@@ -214,11 +214,11 @@
             <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" text="L"/>
-                    <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"/>
+                    <vumeter param="meter_outL" position="2" 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" text="R"/>
-                    <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"/>
+                    <vumeter param="meter_outR" position="2" 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>
diff --git a/gui/gui-eq5.xml b/gui/gui-eq5.xml
index 5e06e35..d0e79d0 100644
--- a/gui/gui-eq5.xml
+++ b/gui/gui-eq5.xml
@@ -4,11 +4,11 @@
             <vbox spacing="15">
                 <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" text="L"/>
-                    <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"/>
+                    <vumeter param="meter_inL" position="2" 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" text="R"/>
-                    <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"/>
+                    <vumeter param="meter_inR" position="2" 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>
@@ -129,11 +129,11 @@
             <vbox spacing="15">
                 <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" text="L"/>
-                    <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"/>
+                    <vumeter param="meter_outL" position="2" 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" text="R"/>
-                    <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"/>
+                    <vumeter param="meter_outR" position="2" 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>
diff --git a/gui/gui-eq8.xml b/gui/gui-eq8.xml
index e7e0c0e..405eddd 100644
--- a/gui/gui-eq8.xml
+++ b/gui/gui-eq8.xml
@@ -4,11 +4,11 @@
             <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" text="L"/>
-                    <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"/>
+                    <vumeter param="meter_inL" position="2" 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" text="R"/>
-                    <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"/>
+                    <vumeter param="meter_inR" position="2" 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>
@@ -150,11 +150,11 @@
             <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" text="L"/>
-                    <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"/>
+                    <vumeter param="meter_outL" position="2" 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" text="R"/>
-                    <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"/>
+                    <vumeter param="meter_outR" position="2" 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>
diff --git a/gui/gui-gate.xml b/gui/gui-gate.xml
index 325e2b7..f75f1d4 100644
--- a/gui/gui-gate.xml
+++ b/gui/gui-gate.xml
@@ -20,15 +20,15 @@
             <vbox spacing="5">
                 <table expand="0" fill="0" rows="3" cols="3">
                     <label param="meter_in" expand-x="0" fill-x="0" attach-x="0" attach-y="0" />
-                    <vumeter param="meter_in" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_in" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
                     <led param="clip_in" mode="0" expand-x="0" fill-x="0" attach-x="2" attach-y="0" />
                     
                     <label param="meter_out" expand-x="0" fill-x="0" attach-x="0" attach-y="1" />
-                    <vumeter param="meter_out" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_out" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
                     <led param="clip_out" mode="1" expand-x="0" fill-x="0" attach-x="2" attach-y="1" />
                     
                     <label param="gating" expand-x="0" fill-x="0" attach-x="0" attach-y="2" />
-                    <vumeter param="gating" mode="2" hold="1.5" expand-x="1" fill-x="1" attach-x="1" attach-y="2" attach-w="2" />
+                    <vumeter param="gating" position="2" mode="2" hold="1.5" expand-x="1" fill-x="1" attach-x="1" attach-y="2" attach-w="2" />
                 </table>
                 
                 <table expand="1" rows="2" cols="3" homogeneous="1">
diff --git a/gui/gui-multibandcompressor.xml b/gui/gui-multibandcompressor.xml
index ed9647d..4cc95bb 100644
--- a/gui/gui-multibandcompressor.xml
+++ b/gui/gui-multibandcompressor.xml
@@ -7,8 +7,8 @@
         </vbox>
         <vbox shrink-x="1" expand-x="1" fill-x="1" expand="0" fill="0" attach-x="1" attach-y="0" pad-y="24">
             <label param="meter_inL" />
-            <vumeter param="meter_inL" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
-            <vumeter param="meter_inR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+            <vumeter param="meter_inL" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+            <vumeter param="meter_inR" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
             <label param="meter_inR" />
         </vbox>
         <vbox shrink-x="1" expand-x="0" fill-x="0" expand="0" fill="0" attach-x="2" attach-y="0" pad-y="24">
@@ -70,8 +70,8 @@
         </table>
         <vbox shrink-x="1" expand-x="1" fill-x="1" expand="0" fill="0" attach-x="7" attach-y="0" pad-y="24">
             <label param="meter_outL" />
-            <vumeter param="meter_outL" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
-            <vumeter param="meter_outR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+            <vumeter param="meter_outL" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+            <vumeter param="meter_outR" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
             <label param="meter_outR" />
         </vbox>
         <vbox shrink-x="1" expand-x="0" fill-x="0" expand="0" fill="0" attach-x="8" attach-y="0" pad-y="24">
@@ -134,10 +134,10 @@
             </table>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
                 <label param="compression0" />
-                <vumeter param="compression0" mode="2" hold="1.5" falloff="2.5" />
+                <vumeter param="compression0" position="2" mode="2" hold="1.5" falloff="2.5" />
             </vbox>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
-                <vumeter param="output0" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+                <vumeter param="output0" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
                 <label param="output0" />
             </vbox>
             <table expand-y="0" expand-x="1" cols="3" rows="1" spacing="5">
@@ -194,10 +194,10 @@
             </table>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
                 <label param="compression1" />
-                <vumeter param="compression1" mode="2" hold="1.5" falloff="2.5" />
+                <vumeter param="compression1" position="2" mode="2" hold="1.5" falloff="2.5" />
             </vbox>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
-                <vumeter param="output1" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+                <vumeter param="output1" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
                 <label param="output1" />
             </vbox>
             <table expand-y="0" expand-x="1" cols="3" rows="1" spacing="5">
@@ -254,10 +254,10 @@
             </table>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
                 <label param="compression2" />
-                <vumeter param="compression2" mode="2" hold="1.5" falloff="2.5" />
+                <vumeter param="compression2" position="2" mode="2" hold="1.5" falloff="2.5" />
             </vbox>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
-                <vumeter param="output2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+                <vumeter param="output2" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
                 <label param="output2" />
             </vbox>
             <table expand-y="0" expand-x="1" cols="3" rows="1" spacing="5">
@@ -314,10 +314,10 @@
             </table>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
                 <label param="compression3" />
-                <vumeter param="compression3" mode="2" hold="1.5" falloff="2.5" />
+                <vumeter param="compression3" position="2" mode="2" hold="1.5" falloff="2.5" />
             </vbox>
             <vbox expand-x="1" fill-x="1" expand="1" fill="1">
-                <vumeter param="output3" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+                <vumeter param="output3" position="2" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
                 <label param="output3" />
             </vbox>
             <table expand-y="0" expand-x="1" cols="3" rows="1" spacing="5">
diff --git a/gui/gui-multibandlimiter.xml b/gui/gui-multibandlimiter.xml
index eca5cf9..4a7f97f 100644
--- a/gui/gui-multibandlimiter.xml
+++ b/gui/gui-multibandlimiter.xml
@@ -7,8 +7,8 @@
         </vbox>
         <vbox shrink-x="1" expand-x="1" fill-x="1" expand="0" fill="0" attach-x="1" attach-y="0">
             <label param="meter_inL" />
-            <vumeter param="meter_inL" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
-            <vumeter param="meter_inR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+            <vumeter param="meter_inL" mode="0" hold="1.5" falloff="2.5" shrink-y="0" position="2" />
+            <vumeter param="meter_inR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" position="2" />
             <label param="meter_inR" />
         </vbox>
         <vbox shrink-x="1" expand-x="0" fill-x="0" expand="0" fill="0" attach-x="2" attach-y="0">
@@ -17,14 +17,14 @@
             <led param="clip_inR" expand="0" fill="0" />
             <label text="0dB" expand="0" fill="0" />
         </vbox>
-        <vbox expand="0" attach-x="3" attach-y="0" expand-x="0" fill-x="0" fill="0" pad-x="20">
+        <vbox expand="0" attach-x="3" attach-y="0" expand-x="0" fill-x="0" fill="0" pad-x="2">
              <label param="bypass"/>
              <align><toggle param="bypass" shrink="1"/></align>
         </vbox>
         <vbox shrink-x="1" expand-x="1" fill-x="1" expand="0" fill="0" attach-x="4" attach-y="0">
             <label param="meter_outL" />
-            <vumeter param="meter_outL" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
-            <vumeter param="meter_outR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
+            <vumeter param="meter_outL" mode="0" hold="1.5" falloff="2.5" shrink-y="0" position="2" />
+            <vumeter param="meter_outR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" position="2" />
             <label param="meter_outR" />
         </vbox>
         <vbox shrink-x="1" expand-x="0" fill-x="0" expand="0" fill="0" attach-x="5" attach-y="0">
@@ -110,23 +110,20 @@
                         <value param="q2" attach-x="1" attach-y="2" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" width="2" align-x="0.0" />
                     </table>
                 </hbox>
+                <hbox>
+                    <label param="mode" />
+                    <combo param="mode" />
+                </hbox>
                 <if cond="directlink">
                     <line-graph refresh="1" width="220" height="90" param="limit" expand="0" fill="1"/>
                 </if>
+                <hbox homogenous="1">
+                    <vumeter attach-x="1" attach-y="0" param="att0" mode="2" hold="1.5" falloff="2.5" expand-x="1" fill-y="0" expand-y="0" height="12" position="2" />
+                    <vumeter attach-x="1" attach-y="1" param="att1" mode="2" hold="1.5" falloff="2.6" expand-x="1" fill-y="0" expand-y="0" height="12" position="2" />
+                    <vumeter attach-x="1" attach-y="2" param="att2" mode="2" hold="1.5" falloff="2.5" expand-x="1" fill-y="0" expand-y="0" height="12" position="2" />
+                    <vumeter attach-x="1" attach-y="3" param="att3" mode="2" hold="1.5" falloff="2.5" expand-x="1" fill-y="0" expand-y="0" height="12" position="2" />
+                </hbox>
             </vbox>
         </frame>
-        
-        <frame label="Attenuation" expand="1" fill="1">
-            <table rows="4" cols="2" expand="1" fill="1">
-                <label attach-x="0" attach-y="0" param="att0" expand-x="0" />
-                <vumeter attach-x="1" attach-y="0" param="att0" mode="1" hold="1.5" falloff="2.5" width="120" expand-x="1" fill-y="0" expand-y="0" height="32" />
-                <label attach-x="0" attach-y="1" param="att1" expand-x="0" />
-                <vumeter attach-x="1" attach-y="1" param="att1" mode="1" hold="1.5" falloff="2.5" width="120" expand-x="1" fill-y="0" expand-y="0" height="32" />
-                <label attach-x="0" attach-y="2" param="att2" expand-x="0" />
-                <vumeter attach-x="1" attach-y="2" param="att2" mode="1" hold="1.5" falloff="2.5" width="120" expand-x="1" fill-y="0" expand-y="0" height="32" />
-                <label attach-x="0" attach-y="3" param="att3" expand-x="0" />
-                <vumeter attach-x="1" attach-y="3" param="att3" mode="1" hold="1.5" falloff="2.5" width="120" expand-x="1" fill-y="0" expand-y="0" height="32" />
-            </table>
-        </frame>
     </hbox>
 </table>    
diff --git a/gui/gui-pulsator.xml b/gui/gui-pulsator.xml
index 03e685b..2c6c227 100644
--- a/gui/gui-pulsator.xml
+++ b/gui/gui-pulsator.xml
@@ -5,8 +5,8 @@
         <value param="level_in" attach-x="0" attach-y="3" expand-x="0" />
         
         <label attach-x="1" attach-y="0" expand-x="1" text="Input level" />
-        <vumeter param="meter_inL" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" />
-        <vumeter param="meter_inR" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="2" expand-x="1" />
+        <vumeter param="meter_inL" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" />
+        <vumeter param="meter_inR" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="2" expand-x="1" />
         
         <label attach-x="2" attach-y="0" expand-x="0" text="Clip" />
         <led param="clip_inL" attach-x="2" attach-y="1" expand-x="0" />
@@ -19,8 +19,8 @@
         <toggle param="mono" attach-x="4" attach-y="1" attach-h="2" expand-x="0" />
         
         <label attach-x="5" attach-y="0" expand-x="1" text="Output level"/>
-        <vumeter param="meter_outL" mode="0" hold="1.5" falloff="2.5" attach-x="5" attach-y="1" expand-x="1" />
-        <vumeter param="meter_outR" mode="0" hold="1.5" falloff="2.5" attach-x="5" attach-y="2" expand-x="1" />
+        <vumeter param="meter_outL" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="5" attach-y="1" expand-x="1" />
+        <vumeter param="meter_outR" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="5" attach-y="2" expand-x="1" />
         
         <label attach-x="6" attach-y="0" expand-x="0" text="Clip"/>
         <led param="clip_outL" mode="1" attach-x="6" attach-y="1" expand-x="0" />
diff --git a/gui/gui-reverb.xml b/gui/gui-reverb.xml
index c3fd6a0..0326af0 100644
--- a/gui/gui-reverb.xml
+++ b/gui/gui-reverb.xml
@@ -52,9 +52,9 @@
         <table cols="3" rows="3" attach-w="5">
             <label attach-x="0" attach-y="0" expand-x="0" fill-x="0" />
             <label param="meter_wet" attach-x="0" attach-y="1" expand-y="1" fill-y="0" expand-x="0" fill-x="0" />
-            <vumeter param="meter_wet" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" attach-w="2" expand-y="1" fill-y="0" expand-x="1" fill-x="1"/>
+            <vumeter param="meter_wet" position="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" attach-w="2" expand-y="1" fill-y="0" expand-x="1" fill-x="1"/>
             <label param="meter_out" attach-x="0" attach-y="2" expand-y="1" fill-y="0" expand-x="0" fill-x="0"/>
-            <vumeter param="meter_out" hold="1.5" falloff="2.5" attach-x="1" attach-y="2" attach-w="2" expand-y="1" fill-y="0" expand-x="1" fill-x="1" />
+            <vumeter param="meter_out" position="2" hold="1.5" falloff="2.5" attach-x="1" attach-y="2" attach-w="2" expand-y="1" fill-y="0" expand-x="1" fill-x="1" />
             <!--<led param="clip" mode="0" attach-x="2" attach-y="2" expand-x="0" fill-x="0"/>-->
         </table>
         </frame>
diff --git a/gui/gui-saturator.xml b/gui/gui-saturator.xml
index 96b0f8c..2909d27 100644
--- a/gui/gui-saturator.xml
+++ b/gui/gui-saturator.xml
@@ -6,8 +6,8 @@
         <!-- Meters -->
         <table rows="4" cols="2">
             <label param="meter_in" attach-x="0" attach-y="0" expand-x="1" fill-x="1" />
-            <vumeter param="meter_in" hold="1.5" falloff="2.5" attach-x="0" attach-y="1" expand-x="1" fill-x="1" />
-            <vumeter param="meter_out" hold="1.5" falloff="2.5" attach-x="0" attach-y="2" expand-x="1" fill-x="1" />
+            <vumeter param="meter_in" position="2" hold="1.5" falloff="2.5" attach-x="0" attach-y="1" expand-x="1" fill-x="1" />
+            <vumeter param="meter_out" position="2" hold="1.5" falloff="2.5" attach-x="0" attach-y="2" expand-x="1" fill-x="1" />
             <label param="meter_out" attach-x="0" attach-y="3" expand-x="1" fill-x="1" />
             
             <label param="clip_in" attach-x="1" attach-y="0" expand-x="0" fill-x="0" />
diff --git a/gui/gui-sidechaincompressor.xml b/gui/gui-sidechaincompressor.xml
index de78091..cbaaaab 100644
--- a/gui/gui-sidechaincompressor.xml
+++ b/gui/gui-sidechaincompressor.xml
@@ -17,11 +17,11 @@
             <vbox spacing="5">
                 <table expand="0" fill="0" rows="3" cols="3">
                     <label param="meter_in" expand-x="0" fill-x="0" attach-x="0" attach-y="0" />
-                    <vumeter param="meter_in" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_in" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
                     <led param="clip_in" mode="0" expand-x="0" fill-x="0" attach-x="2" attach-y="0" />
                     
                     <label param="meter_out" expand-x="0" fill-x="0" attach-x="0" attach-y="1" />
-                    <vumeter param="meter_out" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_out" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
                     <led param="clip_out" mode="1" expand-x="0" fill-x="0" attach-x="2" attach-y="1" />
                 </table>
                 
@@ -91,7 +91,7 @@
             </if>
             <vbox spacing="3">
                 <label param="compression"/>
-                <vumeter param="compression" mode="2" hold="1.5" attach-w="2" expand="0" fill="1"/>
+                <vumeter param="compression" position="2" mode="2" hold="1.5" attach-w="2" expand="0" fill="1"/>
             </vbox>
         </vbox>
       </frame>
diff --git a/gui/gui-sidechaingate.xml b/gui/gui-sidechaingate.xml
index 35af0a9..6635af0 100644
--- a/gui/gui-sidechaingate.xml
+++ b/gui/gui-sidechaingate.xml
@@ -17,11 +17,11 @@
             <vbox spacing="5">
                 <table expand="0" fill="0" rows="3" cols="3">
                     <label param="meter_in" expand-x="0" fill-x="0" attach-x="0" attach-y="0" />
-                    <vumeter param="meter_in" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_in" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
                     <led param="clip_in" mode="0" expand-x="0" fill-x="0" attach-x="2" attach-y="0" />
                     
                     <label param="meter_out" expand-x="0" fill-x="0" attach-x="0" attach-y="1" />
-                    <vumeter param="meter_out" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
+                    <vumeter param="meter_out" position="2" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
                     <led param="clip_out" mode="1" expand-x="0" fill-x="0" attach-x="2" attach-y="1" />
                 </table>
                 
@@ -91,7 +91,7 @@
             </if>
             <vbox spacing="3">
                 <label param="gating"/>
-                <vumeter param="gating" mode="2" hold="1.5" attach-w="2" expand="0" fill="1"/>
+                <vumeter param="gating" position="2" mode="2" hold="1.5" attach-w="2" expand="0" fill="1"/>
             </vbox>
         </vbox>
       </frame>
diff --git a/src/audio_fx.cpp b/src/audio_fx.cpp
index 8c92df5..78e56bb 100644
--- a/src/audio_fx.cpp
+++ b/src/audio_fx.cpp
@@ -532,17 +532,55 @@ bool simple_lfo::get_dot(float &x, float &y, int &size, cairo_iface *context) co
 }
 
 
-////////////////////////////////////////////////////////////////////////////////
+/// Fast Lookahead Limiter by Steve Harris
+/// [This module is used with permission of Steve Harris]
+/// THERE'S NO PERMISSION TO USE IT BY NOW!!
+/// This is a limiter with an attack time of 5ms.
+/// It adds just over 5ms of lantecy to the input signal, but it guatantees that
+/// there will be no signals over the limit, and tries to get the minimum
+/// ammount of distortion. 
 
 lookahead_limiter::lookahead_limiter() {
     is_active = false;
-    attenuation = 1.f;
+    buffer_time = 0.0053;
+    num_chunks = 16;
+    buffer_len = 128;
+    buffer_pos = 0;
+
+    /* Find size for power-of-two interleaved delay buffer */
+    while(buffer_len < srate * buffer_time * 2) {
+        buffer_len *= 2;
+    }
+    buffer = (float*) calloc(buffer_len, sizeof(float));
+    delay = (int)(0.005 * srate);
+
+    chunk_pos = 0;
+    chunk_num = 0;
+    chunk_size = srate / 2000;
+    
+    /* find a chunk size (in smaples) thats roughly 0.5ms */
+    //chunk_size = srate / 2000;
+    chunks = (float*) calloc(num_chunks, sizeof(float));
+
+    peak = 0.0f;
+    atten = 1.0f;
+    atten_lp = 1.0f;
+    delta = 0.0f;
+    atten_max = 1.0;
 }
 
 void lookahead_limiter::activate()
 {
     is_active = true;
-    attenuation = 1.f;
+    memset(buffer, 0, num_chunks * sizeof(float));
+    chunk_pos = 0;
+    chunk_num = 0;
+    peak = 0.0f;
+    atten = 1.0f;
+    atten_lp = 1.0f;
+    atten_max = 1.0;
+    delta = 0.0f;
+    attask = 0;
 }
 
 void lookahead_limiter::deactivate()
@@ -552,7 +590,9 @@ void lookahead_limiter::deactivate()
 
 float lookahead_limiter::get_attenuation()
 {
-    return attenuation;
+    float a = atten_max;
+    atten_max = 1.0;
+    return a;
 }
 
 void lookahead_limiter::set_sample_rate(uint32_t sr)
@@ -563,13 +603,70 @@ void lookahead_limiter::set_sample_rate(uint32_t sr)
 void lookahead_limiter::set_params(float l, float r, float g, uint32_t sr)
 {
     limit = l;
-    release = r;
+    release = r / 1000;
     gain = g;
     srate = sr;
 }
 
 void lookahead_limiter::process(float &left, float &right)
 {
-    left = (left * limit) / limit;
-    right = (right * limit) / limit;
+    const float trim = 1.f;
+    float sig;
+    unsigned int i;
+    
+    if (chunk_pos++ == chunk_size) {
+        /* we've got a full chunk */
+             
+        delta = (1.0f - atten) / (srate * release);
+        round_to_zero(&delta);
+        for (i=0; i<10; i++) {
+            const int p = (chunk_num - 9 + i) & (num_chunks - 1);
+                const float this_delta = (limit / chunks[p] - atten) /
+                      ((float)(i) * srate * 0.0005f + 1.0f);
+
+            if (this_delta < delta) {
+                delta = this_delta;
+            }
+        }
+        chunks[chunk_num++ & (num_chunks - 1)] = peak;
+        peak = 0.0f;
+        chunk_pos = 0;
+    }
+
+    buffer[(buffer_pos * 2) & (buffer_len - 1)] =     left * trim  + 1.0e-30;
+    buffer[(buffer_pos * 2 + 1) & (buffer_len - 1)] = right * trim + 1.0e-30;
+
+    sig = fabs(left) > fabs(right) ? fabs(left) : fabs(right);
+    sig += 1.0e-30;
+    if (sig * trim > peak) {
+        peak = sig * trim;
+    }
+
+    atten += delta;
+    atten_lp = atten * 0.1f + atten_lp * 0.9f;
+    if (delta > 0.0f && atten > 1.0f) {
+        atten = 1.0f;
+        delta = 0.0f;
+    }
+    atten_max = (atten < atten_max) ? atten : atten_max;
+    left = buffer[(buffer_pos * 2 - delay * 2) & (buffer_len - 1)] * atten_lp;
+    right = buffer[(buffer_pos * 2 - delay * 2 + 1) & (buffer_len - 1)] * atten_lp;
+    round_to_zero(&left);
+    round_to_zero(&right);
+
+    if (left < -limit) {
+        left = -limit;
+    } else if (left > limit) {
+        left = limit;
+    }
+    if (right < -limit) {
+        right = -limit;
+    } else if (right > limit) {
+        right = limit;
+    }
+
+    left /= limit;
+    right /= limit;
+    
+    buffer_pos++;
 }
diff --git a/src/calf/audio_fx.h b/src/calf/audio_fx.h
index 3282e4d..3400acf 100644
--- a/src/calf/audio_fx.h
+++ b/src/calf/audio_fx.h
@@ -574,10 +574,31 @@ public:
 /// there will be no signals over the limit, and tries to get the minimum
 /// ammount of distortion. 
 
+// Convert a value in dB's to a coefficent
+#define DB_CO(g) ((g) > -90.0f ? powf(10.0f, (g) * 0.05f) : 0.0f)
+#define CO_DB(v) (20.0f * log10f(v))
+
 class lookahead_limiter {
 private:
-    float limit, release, gain, attenuation;
+    float limit, release, gain;
+    int num_chunks;
+    float buffer_time;
+    float latency;
+    float * buffer;
+    unsigned int buffer_len;
+    unsigned int buffer_pos;
     uint32_t srate;
+    float atten;
+    float atten_lp;
+    float atten_max;
+    float peak;
+    float delta;
+    int attask;
+    unsigned int delay;
+    unsigned int chunk_num;
+    unsigned int chunk_pos;
+    unsigned int chunk_size;
+    float * chunks;
     bool is_active;
 public:
     int id;
@@ -588,6 +609,11 @@ public:
     float get_attenuation();
     void activate();
     void deactivate();
+    static inline void round_to_zero(volatile float *f)
+    {
+	    *f += 1e-18;
+	    *f -= 1e-18;
+    }
 };
 
 #if 0
diff --git a/src/calf/ctl_vumeter.h b/src/calf/ctl_vumeter.h
index b2abbe9..f70713a 100644
--- a/src/calf/ctl_vumeter.h
+++ b/src/calf/ctl_vumeter.h
@@ -57,7 +57,8 @@ struct CalfVUMeter
     int meter_width;
     int vumeter_width;
     int vumeter_height;
-    std::string *meter_text;
+    float disp_value;
+    int vumeter_position;
     cairo_surface_t *cache_surface;
     cairo_pattern_t *pat;
 };
@@ -81,6 +82,8 @@ extern void calf_vumeter_set_width(CalfVUMeter *meter, int value);
 extern int calf_vumeter_get_width(CalfVUMeter *meter);
 extern void calf_vumeter_set_height(CalfVUMeter *meter, int value);
 extern int calf_vumeter_get_height(CalfVUMeter *meter);
+extern void calf_vumeter_set_position(CalfVUMeter *meter, int value);
+extern int calf_vumeter_get_position(CalfVUMeter *meter);
 
 G_END_DECLS
 
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index c76cfaa..b8c9d42 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -239,6 +239,7 @@ struct multibandlimiter_metadata: public plugin_metadata<multibandlimiter_metada
            param_freq0, param_freq1, param_freq2,
            param_sep0, param_sep1, param_sep2,
            param_q0, param_q1, param_q2,
+           param_mode,
            param_limit, param_release,
            param_att0, param_att1, param_att2, param_att3,
            param_count };
diff --git a/src/calf/modules_limit.h b/src/calf/modules_limit.h
index 346b89e..60b550a 100644
--- a/src/calf/modules_limit.h
+++ b/src/calf/modules_limit.h
@@ -38,9 +38,10 @@ private:
     typedef multibandlimiter_audio_module AM;
     static const int strips = 4;
     uint32_t clip_inL, clip_inR, clip_outL, clip_outR;
+    int mode, mode_old;
     float meter_inL, meter_inR, meter_outL, meter_outR;
     dsp::lookahead_limiter strip[strips];
-    dsp::biquad_d2<float> lpL0, lpR0, lpL1, lpR1, lpL2, lpR2, hpL0, hpR0, hpL1, hpR1, hpL2, hpR2;
+    dsp::biquad_d2<float> lpL[3][3], lpR[3][3], hpL[3][3], hpR[3][3];
     float freq_old[strips - 1], sep_old[strips - 1], q_old[strips - 1];
 public:
     uint32_t srate;
diff --git a/src/ctl_vumeter.cpp b/src/ctl_vumeter.cpp
index 788a1d0..42399ae 100644
--- a/src/ctl_vumeter.cpp
+++ b/src/ctl_vumeter.cpp
@@ -26,50 +26,70 @@
 #include <math.h>
 #include <gdk/gdk.h>
 #include <sys/time.h>
+#include <string>
 
-///////////////////////////////////////// vu meter ///////////////////////////////////////////////
-
-static void
-calf_vumeter_draw_outline_part (cairo_t *c, int pad, int ix, int iy, int ox, int oy, int sx, int sy)
-{
-    cairo_rectangle(c, ix + pad, iy + pad, sx + ox * 2 - pad * 2, sy + oy * 2 - pad * 2);
-}
 
-static void
-calf_vumeter_draw_outline (cairo_t *c, int ix, int iy, int ox, int oy, int sx, int sy)
-{
-    // outer (black)
-    calf_vumeter_draw_outline_part (c, 0, ix, iy, ox, oy, sx, sy);
-    cairo_set_source_rgb(c, 0, 0, 0);
-    cairo_fill(c);
-    
-    // inner (bevel)
-    calf_vumeter_draw_outline_part (c, 1, ix, iy, ox, oy, sx, sy);
-    cairo_pattern_t *pat2 = cairo_pattern_create_linear (0, 0, 0, sy + oy * 2 - 1 * 2);
-    cairo_pattern_add_color_stop_rgba (pat2, 0, 0.23, 0.23, 0.23, 1);
-    cairo_pattern_add_color_stop_rgba (pat2, 0.5, 0, 0, 0, 1);
-    cairo_set_source (c, pat2);
-    cairo_fill(c);
-    cairo_pattern_destroy(pat2);
-}
+///////////////////////////////////////// vu meter ///////////////////////////////////////////////
 
 static gboolean
 calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
 {
     g_assert(CALF_IS_VUMETER(widget));
 
-
     CalfVUMeter *vu = CALF_VUMETER(widget);
     GtkStyle	*style;
-    
-    int ox = 4, oy = 3, led = 3, inner = 1;
-    int mx = vu->meter_width;
-    if (mx > widget->allocation.width / 2)
-        mx = 0;
-    int sx = widget->allocation.width - (ox * 2), sy = widget->allocation.height - (oy * 2);
-    int sx1 = sx - ((widget->allocation.width - inner * 2 - ox * 2) % led) - mx;
     style = gtk_widget_get_style(widget);
     cairo_t *c = gdk_cairo_create(GDK_DRAWABLE(widget->window));
+    
+    int width = widget->allocation.width; int height = widget->allocation.height;
+    int border_x = 1; int border_y = 1; // outer border
+    int space_x = 1; int space_y = 1; // inner border around led bar
+    int led = 2; // single LED size
+    int led_m = 1; // margin between LED
+    int led_s = led + led_m; // size of LED with margin
+    int led_x = 5; int led_y = 4; // position of first LED
+    int led_w = width - 2 * led_x + led_m; // width of LED bar w/o text calc (additional led margin, is removed later; used for filling the led bar completely w/o margin gap)
+    int led_h = height - 2 * led_y; // height of LED bar w/o text calc
+    int text_x = 0; int text_y = 0;
+    int text_w = 0; int text_h = 0;
+    int text_m = 3; // text margin
+    
+    cairo_select_font_face(c, "cairo:sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
+    cairo_set_font_size(c, 8);
+    cairo_text_extents_t extents;
+    
+    if(vu->vumeter_position) {
+        cairo_text_extents(c, "-88.88", &extents);
+        text_w = extents.width;
+        text_h = extents.height;
+        switch(vu->vumeter_position) {
+            case 1:
+                text_x = width / 2 - text_w / 2;
+                text_y = border_y + text_m - extents.y_bearing;
+                led_y += text_h + text_m;
+                led_h -= text_h + text_m;
+                break;
+            case 2:
+                text_x = width - border_x - text_m * 2 - text_w;
+                text_y = height / 2 - text_h / 2 - extents.y_bearing;
+                led_w -= text_m * 2 + text_w;
+                break;
+            case 3:
+                text_x = width / 2 - text_w / 2;
+                text_y = height - border_y - text_m - text_h - extents.y_bearing;
+                led_h -= text_m * 2 + text_h;
+                break;
+            case 4:
+                text_x = border_x + text_m;
+                text_y = height / 2 - text_h / 2 - extents.y_bearing;
+                led_x += text_m * 2 + text_w;
+                led_w -= text_m * 2 + text_w;
+                break;
+        }
+    }
+    
+    led_w -= led_w % led_s + led_m; //round LED width to LED size and remove margin gap, width is filled with LED without margin gap now
+    
     if( vu->cache_surface == NULL ) {
         // looks like its either first call or the widget has been resized.
         // create the cache_surface.
@@ -79,67 +99,83 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
                                   widget->allocation.width,
                                   widget->allocation.height );
 
-        // And render the meterstuff again.
+        // And render the meterstuff
 
         cairo_t *cache_cr = cairo_create( vu->cache_surface );
-        
-        // theme background for reduced width and round borders
-//        if(widget->style->bg_pixmap[0] == NULL) {
-            gdk_cairo_set_source_color(cache_cr,&style->bg[GTK_STATE_NORMAL]);
-//        } else {
-//            gdk_cairo_set_source_pixbuf(cache_cr, GDK_PIXBUF(widget->style->bg_pixmap[0]), widget->allocation.x, widget->allocation.y + 20);
-//        }
+        gdk_cairo_set_source_color(cache_cr,&style->bg[GTK_STATE_NORMAL]);
         cairo_paint(cache_cr);
         
-        calf_vumeter_draw_outline (cache_cr, 0, 0, ox, oy, sx, sy);
+        // outer (black)
+        cairo_rectangle(cache_cr, 0, 0, width, height);
+        cairo_set_source_rgb(cache_cr, 0, 0, 0);
+        cairo_fill(cache_cr);
         
-        sx = sx1;
+        // inner (bevel)
+        cairo_rectangle(cache_cr,
+                        border_x,
+                        border_y,
+                        width - border_x * 2,
+                        height - border_y * 2);
+        cairo_pattern_t *pat2 = cairo_pattern_create_linear (border_x,
+                                                             border_y,
+                                                             border_x,
+                                                             height - border_y * 2);
+        cairo_pattern_add_color_stop_rgba (pat2, 0, 0.23, 0.23, 0.23, 1);
+        cairo_pattern_add_color_stop_rgba (pat2, 0.5, 0, 0, 0, 1);
+        cairo_set_source (cache_cr, pat2);
+        cairo_fill(cache_cr);
+        cairo_pattern_destroy(pat2);
         
-        cairo_rectangle(cache_cr, ox, oy, sx, sy);
+        // border around LED
+        cairo_rectangle(cache_cr,
+                        led_x - space_x,
+                        led_y - space_y,
+                        led_w + space_x * 2,
+                        led_h + space_y * 2);
         cairo_set_source_rgb (cache_cr, 0, 0, 0);
         cairo_fill(cache_cr);
         
+        // LED bases
         cairo_set_line_width(cache_cr, 1);
-
-        for (int x = ox + inner; x <= ox + sx - led; x += led)
+        for (int x = led_x; x + led <= led_x + led_w; x += led_s)
         {
-            float ts = (x - ox) * 1.0 / sx;
+            float ts = (x - led_x) * 1.0 / led_w;
             float r = 0.f, g = 0.f, b = 0.f;
             switch(vu->mode)
             {
-            case VU_STANDARD:
-            default:
-                if (ts < 0.75)
-                r = ts / 0.75, g = 0.5 + ts * 0.66, b = 1 - ts / 0.75;
-                else
-                r = 1, g = 1 - (ts - 0.75) / 0.25, b = 0;
-                //                if (vu->value < ts || vu->value <= 0)
-                //                    r *= 0.5, g *= 0.5, b *= 0.5;
-                break;
-            case VU_MONOCHROME_REVERSE:
-                r = 0, g = 170.0 / 255.0, b = 1;
-                //                if (!(vu->value < ts) || vu->value >= 1.0)
-                //                    r *= 0.5, g *= 0.5, b *= 0.5;
-                break;
-            case VU_MONOCHROME:
-                r = 0, g = 170.0 / 255.0, b = 1;
-                //                if (vu->value < ts || vu->value <= 0)
-                //                    r *= 0.5, g *= 0.5, b *= 0.5;
-                break;
+                case VU_STANDARD:
+                default:
+                    if (ts < 0.75)
+                    r = ts / 0.75, g = 0.5 + ts * 0.66, b = 1 - ts / 0.75;
+                    else
+                    r = 1, g = 1 - (ts - 0.75) / 0.25, b = 0;
+                    //                if (vu->value < ts || vu->value <= 0)
+                    //                    r *= 0.5, g *= 0.5, b *= 0.5;
+                    break;
+                case VU_MONOCHROME_REVERSE:
+                    r = 0, g = 170.0 / 255.0, b = 1;
+                    //                if (!(vu->value < ts) || vu->value >= 1.0)
+                    //                    r *= 0.5, g *= 0.5, b *= 0.5;
+                    break;
+                case VU_MONOCHROME:
+                    r = 0, g = 170.0 / 255.0, b = 1;
+                    //                if (vu->value < ts || vu->value <= 0)
+                    //                    r *= 0.5, g *= 0.5, b *= 0.5;
+                    break;
             }
             GdkColor sc2 = { 0, (guint16)(65535 * r + 0.2), (guint16)(65535 * g), (guint16)(65535 * b) };
             GdkColor sc3 = { 0, (guint16)(65535 * r * 0.7), (guint16)(65535 * g * 0.7), (guint16)(65535 * b * 0.7) };
             gdk_cairo_set_source_color(cache_cr, &sc2);
-            cairo_move_to(cache_cr, x + 0.5, oy + 1);
-            cairo_line_to(cache_cr, x + 0.5, oy + sy - inner);
+            cairo_move_to(cache_cr, x + 0.5, led_y);
+            cairo_line_to(cache_cr, x + 0.5, led_y + led_h);
             cairo_stroke(cache_cr);
             gdk_cairo_set_source_color(cache_cr, &sc3);
-            cairo_move_to(cache_cr, x + 1.5, oy + sy - inner);
-            cairo_line_to(cache_cr, x + 1.5, oy + 1);
+            cairo_move_to(cache_cr, x + 1.5, led_y + led_h);
+            cairo_line_to(cache_cr, x + 1.5, led_y);
             cairo_stroke(cache_cr);
         }
         // create blinder pattern
-        vu->pat = cairo_pattern_create_linear (ox, oy, ox, ox + sy);
+        vu->pat = cairo_pattern_create_linear (led_x, led_y, led_x, led_y + led_h);
         cairo_pattern_add_color_stop_rgba (vu->pat, 0, 0.5, 0.5, 0.5, 0.6);
         cairo_pattern_add_color_stop_rgba (vu->pat, 0.4, 0, 0, 0, 0.6);
         cairo_pattern_add_color_stop_rgba (vu->pat, 0.401, 0, 0, 0, 0.8);
@@ -147,8 +183,7 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
         cairo_destroy( cache_cr );
     }
     
-    sx = sx1;
-
+    // draw LED blinder
     cairo_set_source_surface( c, vu->cache_surface, 0,0 );
     cairo_paint( c );
     cairo_set_source( c, vu->pat );
@@ -159,8 +194,7 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
     long time = tv.tv_sec * 1000 * 1000 + tv.tv_usec;
     
     // limit to 1.f
-    float value_orig = vu->value > 1.f ? 1.f : vu->value;
-    value_orig = value_orig < 0.f ? 0.f : value_orig;
+    float value_orig = std::max(std::min(vu->value, 1.f), 0.f);
     float value = 0.f;
     
     // falloff?
@@ -175,14 +209,14 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
         }
         value = vu->last_falloff;
         vu->last_falltime = time;
-        vu->falling = vu->last_falloff > 0.000001;
+        vu->falling = vu->last_falloff > 0.00000001;
     } else {
         // falloff disabled
         vu->last_falloff = 0.f;
         vu->last_falltime = 0.f;
         value = value_orig;
+        vu->falling = false;
     }
-    
     if(vu->vumeter_hold > 0.0) {
         // peak hold timer
         if(time - (long)(vu->vumeter_hold * 1000 * 1000) > vu->last_hold) {
@@ -190,6 +224,7 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
             vu->last_value = value;
             vu->last_hold = time;
             vu->holding = false;
+            vu->disp_value = value_orig;
         }
         if( vu->mode == VU_MONOCHROME_REVERSE ) {
             if(value < vu->last_value) {
@@ -198,14 +233,19 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
                 vu->last_hold = time;
                 vu->holding = true;
             }
-            int hpx = round(vu->last_value * (sx - 2 * inner));
-            hpx = hpx + (1 - (hpx + inner) % led);
-            int vpx = round((1 - value) * (sx - 2 * inner));
-            vpx = vpx + (1 - (vpx + inner) % led);
-            int widthA = std::min(led + hpx, (sx - 2 * inner));
-            int widthB = std::min(std::max((sx - 2 * inner) - vpx - led - hpx, 0), (sx - 2 * inner));
-            cairo_rectangle( c, ox + inner, oy + inner, hpx, sy - 2 * inner);
-            cairo_rectangle( c, ox + inner + widthA, oy + inner, widthB, sy - 2 * inner);
+            
+            // blinder left -> hold LED
+            int hold_x = round((vu->last_value) * (led_w + led_m)); // add last led_m removed earlier
+            hold_x -= hold_x % led_s + led_m;
+            hold_x = std::max(0, hold_x);
+            cairo_rectangle( c, led_x, led_y, hold_x, led_h);
+            
+            // blinder hold LED -> value
+            int val_x = round((1 - value) * (led_w + led_m)); // add last led_m removed earlier
+            val_x -= val_x % led_s;
+            int blind_x = std::min(hold_x + led_s, led_w);
+            int blind_w = std::min(std::max(led_w - val_x - hold_x - led_s, 0), led_w);
+            cairo_rectangle(c, led_x + blind_x, led_y, blind_w, led_h);
         } else {
             if(value > vu->last_value) {
                 // value is above peak hold
@@ -213,39 +253,45 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
                 vu->last_hold = time;
                 vu->holding = true;
             }
-            int hpx = round((1 - vu->last_value) * (sx - 2 * inner));
-            hpx = hpx + (1 - (hpx + inner) % led);
-            int vpx = round(value * (sx - 2 * inner));
-            vpx = vpx + (1 - (vpx + inner) % led);
-            int width = std::min(std::max((sx - 2 * inner) - vpx - led - hpx, 0), (sx - 2 * inner));
-            cairo_rectangle( c, ox + inner + vpx, oy + inner, width, sy - 2 * inner);
-            cairo_rectangle( c, ox + inner + (sx - 2 * inner) - hpx, oy + inner, hpx, sy - 2 * inner);
+            
+            // blinder hold LED -> right
+            int hold_x = round((1 - vu->last_value) * (led_w + led_m)); // add last led_m removed earlier
+            hold_x -= hold_x % led_s;
+            cairo_rectangle( c, led_x + led_w - hold_x, led_y, hold_x, led_h);
+            
+            // blinder value -> hold LED
+            int val_x = round(value * (led_w + led_m)); // add last led_m removed earlier
+            val_x -= val_x % led_s;
+            int blind_w = led_w - hold_x - led_s - val_x;
+            blind_w = std::min(std::max(blind_w, 0), led_w);
+            cairo_rectangle(c, led_x + val_x, led_y, blind_w, led_h);
         }
     } else {
         // darken normally
         if( vu->mode == VU_MONOCHROME_REVERSE )
-            cairo_rectangle( c, ox + inner,oy + inner, value * (sx - 2 * inner), sy - 2 * inner);
+            cairo_rectangle( c, led_x, led_y, value * led_w, led_h);
         else
-            cairo_rectangle( c, ox + inner + value * (sx - 2 * inner), oy + inner, (sx - 2 * inner) * (1 - value), sy - 2 * inner );
+            cairo_rectangle( c, led_x + value * led_w, led_y, led_w * (1 - value), led_h);
     }
     cairo_fill( c );
     
-    if (mx > 0)
+    if (vu->vumeter_position)
     {
-        cairo_select_font_face(c, "cairo:sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
-        cairo_set_font_size(c, 10);
-        
-        const char *str = vu->meter_text ? vu->meter_text->c_str() : "";
-
-        cairo_text_extents_t tx;
-        cairo_text_extents(c, str, &tx);
-
-        int mtl = 2;
-        int ix = widget->allocation.width - mx + mtl;
-        calf_vumeter_draw_outline(c, ix, 0, ox, oy, mx - mtl - 2 * ox, sy);
-
-        cairo_move_to(c, ox + sx + mx - tx.width - inner, oy + sy / 2 + tx.height / 2);
-        cairo_set_source_rgba (c, 0, 1, 0, 1);
+        char str[32];
+        if((vu->value > vu->disp_value and vu->mode != VU_MONOCHROME_REVERSE)
+        or (vu->value < vu->disp_value and vu->mode == VU_MONOCHROME_REVERSE))
+            vu->disp_value = vu->value;
+        if (vu->disp_value < 1.0 / 1024.0)
+            sprintf(str, "-inf");
+        else
+            sprintf(str, "%0.2f", vu->disp_value);
+        // draw value as number
+        cairo_text_extents(c, str, &extents);
+        cairo_move_to(c, text_x + (text_w - extents.width) / 2.0, text_y);
+        if(vu->disp_value > 1.f and vu->mode != VU_MONOCHROME_REVERSE)
+            cairo_set_source_rgba (c, 1, 0, 0, 0.8);
+        else
+            cairo_set_source_rgba (c, 0, 0.7, 1, 0.8);
         cairo_show_text(c, str);
         cairo_fill(c);
     }
@@ -302,7 +348,7 @@ calf_vumeter_init (CalfVUMeter *self)
     self->falling = false;
     self->holding = false;
     self->meter_width = 0;
-    self->meter_text = NULL;
+    self->disp_value = 0.f;
 }
 
 GtkWidget *
@@ -440,3 +486,16 @@ extern int calf_vumeter_get_height(CalfVUMeter *meter)
 {
     return meter->vumeter_height;
 }
+extern void calf_vumeter_set_position(CalfVUMeter *meter, int value)
+{
+    if (value != meter->vumeter_height)
+    {
+        meter->vumeter_position = value;
+        gtk_widget_queue_draw(GTK_WIDGET(meter));
+    }
+}
+
+extern int calf_vumeter_get_position(CalfVUMeter *meter)
+{
+    return meter->vumeter_position;
+}
diff --git a/src/gtk_main_win.cpp b/src/gtk_main_win.cpp
index 1c62d95..acdce6b 100644
--- a/src/gtk_main_win.cpp
+++ b/src/gtk_main_win.cpp
@@ -367,6 +367,7 @@ gtk_main_window::plugin_strip *gtk_main_window::create_strip(plugin_ctl_iface *p
         calf_vumeter_set_hold(CALF_VUMETER(label), 1.5);
         calf_vumeter_set_width(CALF_VUMETER(label), 120);
         calf_vumeter_set_height(CALF_VUMETER(label), 12);
+        calf_vumeter_set_position(CALF_VUMETER(label), 2);
         gtk_box_pack_start(GTK_BOX(inBox), label,FALSE, FALSE, 0);
         strip->audio_in[0] = label;
         
@@ -375,6 +376,7 @@ gtk_main_window::plugin_strip *gtk_main_window::create_strip(plugin_ctl_iface *p
         calf_vumeter_set_hold(CALF_VUMETER(label), 1.5);
         calf_vumeter_set_width(CALF_VUMETER(label), 120);
         calf_vumeter_set_height(CALF_VUMETER(label), 12);
+        calf_vumeter_set_position(CALF_VUMETER(label), 2);
         gtk_box_pack_start(GTK_BOX(inBox), label,FALSE, FALSE, 0);
         strip->audio_in[1] = label;
         
@@ -395,6 +397,7 @@ gtk_main_window::plugin_strip *gtk_main_window::create_strip(plugin_ctl_iface *p
         calf_vumeter_set_hold(CALF_VUMETER(label), 1.5);
         calf_vumeter_set_width(CALF_VUMETER(label), 120);
         calf_vumeter_set_height(CALF_VUMETER(label), 12);
+        calf_vumeter_set_position(CALF_VUMETER(label), 2);
         gtk_box_pack_start(GTK_BOX(outBox), label,FALSE, FALSE, 0);
         strip->audio_out[0] = label;
         
@@ -403,6 +406,7 @@ gtk_main_window::plugin_strip *gtk_main_window::create_strip(plugin_ctl_iface *p
         calf_vumeter_set_hold(CALF_VUMETER(label), 1.5);
         calf_vumeter_set_width(CALF_VUMETER(label), 120);
         calf_vumeter_set_height(CALF_VUMETER(label), 12);
+        calf_vumeter_set_position(CALF_VUMETER(label), 2);
         gtk_box_pack_start(GTK_BOX(outBox), label,FALSE, FALSE, 0);
         strip->audio_out[1] = label;
         
diff --git a/src/gui_controls.cpp b/src/gui_controls.cpp
index 04b23ba..c9e9c89 100644
--- a/src/gui_controls.cpp
+++ b/src/gui_controls.cpp
@@ -435,6 +435,7 @@ GtkWidget *vumeter_param_control::create(plugin_gui *_gui, int _param_no)
     CALF_VUMETER(widget)->vumeter_falloff = get_float("falloff", 0.f);
     CALF_VUMETER(widget)->vumeter_width = get_int("width", 50);
     CALF_VUMETER(widget)->vumeter_height = get_int("height", 18);
+    CALF_VUMETER(widget)->vumeter_position = get_int("position", 0);
     gtk_widget_set_name(GTK_WIDGET(widget), "Calf-VUMeter");
     return widget;
 }
diff --git a/src/metadata.cpp b/src/metadata.cpp
index 5d80cb9..b2ea303 100644
--- a/src/metadata.cpp
+++ b/src/metadata.cpp
@@ -331,7 +331,7 @@ CALF_PORT_PROPS(multibandcompressor) = {
     { 2,           1,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "makeup0", "Makeup 1" },
     { 2.828427125, 1,           8,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "knee0", "Knee 1" },
     { 0,           0,           1,     0,  PF_ENUM | PF_CTL_COMBO, multibandcompressor_detection_names, "detection0", "Detection 1" },
-    { 1,           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, "compression0", "Gain Reduction 1" },
+    { 1,           0.0625,     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, "compression0", "Gain Reduction 1" },
     { 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, "output0", "Output 1" },
     { 1,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass0", "Bypass 1" },
     { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "solo0", "Solo 1" },
@@ -344,7 +344,7 @@ CALF_PORT_PROPS(multibandcompressor) = {
     { 2,           1,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "makeup1", "Makeup 2" },
     { 2.828427125, 1,           8,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "knee1", "Knee 2" },
     { 0,           0,           1,     0,  PF_ENUM | PF_CTL_COMBO, multibandcompressor_detection_names, "detection1", "Detection 2" },
-    { 1,           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, "compression1", "Gain Reduction 2" },
+    { 1,           0.0625,     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, "compression1", "Gain Reduction 2" },
     { 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, "output1", "Output 2" },
     { 1,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass1", "Bypass 2" },
     { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "solo1", "Solo 2" },
@@ -357,7 +357,7 @@ CALF_PORT_PROPS(multibandcompressor) = {
     { 2,           1,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "makeup2", "Makeup 3" },
     { 2.828427125, 1,           8,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "knee2", "Knee 3" },
     { 0,           0,           1,     0,  PF_ENUM | PF_CTL_COMBO, multibandcompressor_detection_names, "detection2", "Detection 3" },
-    { 1,           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, "compression2", "Gain Reduction 3" },
+    { 1,           0.0625,     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, "compression2", "Gain Reduction 3" },
     { 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, "output2", "Output 3" },
     { 1,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass2", "Bypass 3" },
     { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "solo2", "Solo 3" },
@@ -370,7 +370,7 @@ CALF_PORT_PROPS(multibandcompressor) = {
     { 2,           1,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "makeup3", "Makeup 4" },
     { 2.828427125, 1,           8,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "knee3", "Knee 4" },
     { 0,           0,           1,     0,  PF_ENUM | PF_CTL_COMBO, multibandcompressor_detection_names, "detection3", "Detection 4" },
-    { 1,           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, "compression3", "Gain Reduction 4" },
+    { 1,           0.0625,     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, "compression3", "Gain Reduction 4" },
     { 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, "output3", "Output 4" },
     { 1,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass3", "Bypass 4" },
     { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "solo3", "Solo 4" },
@@ -390,7 +390,7 @@ const char *deesser_mode_names[] = { "Wide", "Split" };
 CALF_PORT_PROPS(deesser) = {
     { 0,      0,  1,    0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
     { 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, "detected", "Detected" },
-    { 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.0625, 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,  1,    0, PF_BOOL | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "detected_led", "Active" },
     { 0,      0,  1,    0, PF_BOOL | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_out", "Out" },
     { 0,      0,  1,    0, PF_ENUM | PF_CTL_COMBO, deesser_detection_names, "detection", "Detection" },
@@ -492,6 +492,7 @@ CALF_PLUGIN_INFO(sidechaingate) = { 0x8504, "Sidechaingate", "Calf Sidechain Gat
 ////////////////////////////////////////////////////////////////////////////
 
 CALF_PORT_NAMES(multibandlimiter) = {"In L", "In R", "Out L", "Out R"};
+const char *multibandlimiter_filter_choices[] = { "12dB", "36dB"};
 
 CALF_PORT_PROPS(multibandlimiter) = {
     { 0,           0,           1,     0,  PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
@@ -518,14 +519,15 @@ CALF_PORT_PROPS(multibandlimiter) = {
     { 0.895025,    0.25,        4,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB | PF_PROP_GRAPH, NULL, "q1", "Q2" },
     { 0.895025,    0.25,        4,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB | PF_PROP_GRAPH, NULL, "q2", "Q3" },
     
+    { 1,      0,  1,    0, PF_ENUM | PF_CTL_COMBO, multibandlimiter_filter_choices, "mode", "Filter Mode" },
     
     { 1,      0.0625, 1,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "limit", "Limit" },
     { 50,         1,        1000,  0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "release", "Release" },
     
-    { 1,           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, "att0", "Low" },
-    { 1,           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, "att1", "LMid" },
-    { 1,           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, "att2", "HMid" },
-    { 1,           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, "att3", "Hi" },
+    { 1,           0.125,     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, "att0", "Low" },
+    { 1,           0.125,     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, "att1", "LMid" },
+    { 1,           0.125,     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, "att2", "HMid" },
+    { 1,           0.125,     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, "att3", "Hi" },
     
     {}
 };
diff --git a/src/modules_limit.cpp b/src/modules_limit.cpp
index 9a1fde3..40005f7 100644
--- a/src/modules_limit.cpp
+++ b/src/modules_limit.cpp
@@ -75,39 +75,69 @@ void multibandlimiter_audio_module::deactivate()
 
 void multibandlimiter_audio_module::params_changed()
 {
+    mode_old = mode;
+    mode = *params[param_mode];
+    int i;
+    int j1;
+    switch(mode) {
+        case 0:
+            j1 = 0;
+            break;
+        case 1:
+            j1 = 2;
+            break;
+    }
     // set the params of all filters
-    if(*params[param_freq0] != freq_old[0] or *params[param_sep0] != sep_old[0] or *params[param_q0] != q_old[0]) {
-        lpL0.set_lp_rbj((float)(*params[param_freq0] * (1 - *params[param_sep0])), *params[param_q0], (float)srate);
-        lpR0.copy_coeffs(lpL0);
-        hpL0.set_hp_rbj((float)(*params[param_freq0] * (1 + *params[param_sep0])), *params[param_q0], (float)srate);
-        hpR0.copy_coeffs(hpL0);
+    if(*params[param_freq0] != freq_old[0] or *params[param_sep0] != sep_old[0] or *params[param_q0] != q_old[0] or *params[param_mode] != mode_old) {
+        lpL[0][0].set_lp_rbj((float)(*params[param_freq0] * (1 - *params[param_sep0])), *params[param_q0], (float)srate);
+        hpL[0][0].set_hp_rbj((float)(*params[param_freq0] * (1 + *params[param_sep0])), *params[param_q0], (float)srate);
+        lpR[0][0].copy_coeffs(lpL[0][0]);
+        hpR[0][0].copy_coeffs(hpL[0][0]);
+        for(i = 1; i <= j1; i++) {
+            lpL[0][i].copy_coeffs(lpL[0][0]);
+            hpL[0][i].copy_coeffs(hpL[0][0]);
+            lpR[0][i].copy_coeffs(lpL[0][0]);
+            hpR[0][i].copy_coeffs(hpL[0][0]);
+        }
         freq_old[0] = *params[param_freq0];
         sep_old[0]  = *params[param_sep0];
         q_old[0]    = *params[param_q0];
     }
-    if(*params[param_freq1] != freq_old[1] or *params[param_sep1] != sep_old[1] or *params[param_q1] != q_old[1]) {
-        lpL1.set_lp_rbj((float)(*params[param_freq1] * (1 - *params[param_sep1])), *params[param_q1], (float)srate);
-        lpR1.copy_coeffs(lpL1);
-        hpL1.set_hp_rbj((float)(*params[param_freq1] * (1 + *params[param_sep1])), *params[param_q1], (float)srate);
-        hpR1.copy_coeffs(hpL1);
+    if(*params[param_freq1] != freq_old[1] or *params[param_sep1] != sep_old[1] or *params[param_q1] != q_old[1] or *params[param_mode] != mode_old) {
+        lpL[1][0].set_lp_rbj((float)(*params[param_freq1] * (1 - *params[param_sep1])), *params[param_q1], (float)srate);
+        hpL[1][0].set_hp_rbj((float)(*params[param_freq1] * (1 + *params[param_sep1])), *params[param_q1], (float)srate);
+        lpR[1][0].copy_coeffs(lpL[1][0]);
+        hpR[1][0].copy_coeffs(hpL[1][0]);
+        for(i = 1; i <= j1; i++) {
+            lpL[1][i].copy_coeffs(lpL[1][0]);
+            hpL[1][i].copy_coeffs(hpL[1][0]);
+            lpR[1][i].copy_coeffs(lpL[1][0]);
+            hpR[1][i].copy_coeffs(hpL[1][0]);
+        }
         freq_old[1] = *params[param_freq1];
         sep_old[1]  = *params[param_sep1];
         q_old[1]    = *params[param_q1];
     }
-    if(*params[param_freq2] != freq_old[2] or *params[param_sep2] != sep_old[2] or *params[param_q2] != q_old[2]) {
-        lpL2.set_lp_rbj((float)(*params[param_freq2] * (1 - *params[param_sep2])), *params[param_q2], (float)srate);
-        lpR2.copy_coeffs(lpL2);
-        hpL2.set_hp_rbj((float)(*params[param_freq2] * (1 + *params[param_sep2])), *params[param_q2], (float)srate);
-        hpR2.copy_coeffs(hpL2);
+    if(*params[param_freq2] != freq_old[2] or *params[param_sep2] != sep_old[2] or *params[param_q2] != q_old[2] or *params[param_mode] != mode_old) {
+        lpL[2][0].set_lp_rbj((float)(*params[param_freq2] * (1 - *params[param_sep2])), *params[param_q2], (float)srate);
+        hpL[2][0].set_hp_rbj((float)(*params[param_freq2] * (1 + *params[param_sep2])), *params[param_q2], (float)srate);
+        lpR[2][0].copy_coeffs(lpL[2][0]);
+        hpR[2][0].copy_coeffs(hpL[2][0]);
+        for(i = 1; i <= j1; i++) {
+            lpL[2][i].copy_coeffs(lpL[2][0]);
+            hpL[2][i].copy_coeffs(hpL[2][0]);
+            lpR[2][i].copy_coeffs(lpL[2][0]);
+            hpR[2][i].copy_coeffs(hpL[2][0]);
+        }
         freq_old[2] = *params[param_freq2];
         sep_old[2]  = *params[param_sep2];
         q_old[2]    = *params[param_q2];
     }
     // set the params of all strips
-    strip[0].set_params(*params[param_limit], *params[param_release], 1.f, srate);
-    strip[1].set_params(*params[param_limit], *params[param_release], 1.f, srate);
-    strip[2].set_params(*params[param_limit], *params[param_release], 1.f, srate);
-    strip[3].set_params(*params[param_limit], *params[param_release], 1.f, srate);
+    strip[0].set_params(*params[param_limit] * 0.66, std::min(1.f / 30, *params[param_release]), 1.f, srate);
+    strip[1].set_params(*params[param_limit] * 0.66, std::min(1.f / *params[param_freq0], *params[param_release]), 1.f, srate);
+    strip[2].set_params(*params[param_limit] * 0.66, std::min(1.f / *params[param_freq1], *params[param_release]), 1.f, srate);
+    strip[3].set_params(*params[param_limit] * 0.66, std::min(1.f / *params[param_freq2], *params[param_release]), 1.f, srate);
 }
 
 void multibandlimiter_audio_module::set_sample_rate(uint32_t sr)
@@ -171,44 +201,33 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
             // out vars
             float outL = 0.f;
             float outR = 0.f;
-            for (int i = 0; i < strips; i ++) {
+            for (int i = 0; i < strips; i++) {
                 float left  = inL;
                 float right = inR;
                 // send trough filters
-                switch (i) {
+                int j1;
+                switch(mode) {
                     case 0:
-                        left  = lpL0.process(left);
-                        right = lpR0.process(right);
-                        lpL0.sanitize();
-                        lpR0.sanitize();
+                        j1 = 0;
                         break;
                     case 1:
-                        left  = lpL1.process(left);
-                        right = lpR1.process(right);
-                        left  = hpL0.process(left);
-                        right = hpR0.process(right);
-                        lpL1.sanitize();
-                        lpR1.sanitize();
-                        hpL0.sanitize();
-                        hpR0.sanitize();
-                        break;
-                    case 2:
-                        left  = lpL2.process(left);
-                        right = lpR2.process(right);
-                        left  = hpL1.process(left);
-                        right = hpR1.process(right);
-                        lpL2.sanitize();
-                        lpR2.sanitize();
-                        hpL1.sanitize();
-                        hpR1.sanitize();
-                        break;
-                    case 3:
-                        left  = hpL2.process(left);
-                        right = hpR2.process(right);
-                        hpL2.sanitize();
-                        hpR2.sanitize();
+                        j1 = 2;
                         break;
                 }
+                for (int j = 0; j <= j1; j++){
+                    if(i + 1 < strips) {
+                        left  = lpL[i][j].process(left);
+                        right = lpR[i][j].process(right);
+                        lpL[i][j].sanitize();
+                        lpR[i][j].sanitize();
+                    }
+                    if(i - 1 >= 0) {
+                        left  = hpL[i - 1][j].process(left);
+                        right = hpR[i - 1][j].process(right);
+                        hpL[i - 1][j].sanitize();
+                        hpR[i - 1][j].sanitize();
+                    }
+                }
                 // process gain reduction
                 strip[i].process(left, right);
                 // sum up output
@@ -218,9 +237,16 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
             
             // even out filters gain reduction
             // 3dB - levelled manually (based on default sep and q settings)
-            outL *= 1.414213562;
-            outR *= 1.414213562;
-            
+            switch(mode) {
+                case 0:
+                    outL *= 1.414213562;
+                    outR *= 1.414213562;
+                    break;
+                case 1:
+                    outL *= 0.61;
+                    outR *= 0.61;
+                    break;
+            }
             // out level
             outL *= *params[param_level_out];
             outR *= *params[param_level_out];
@@ -294,22 +320,33 @@ bool multibandlimiter_audio_module::get_graph(int index, int subindex, float *da
     {
         float ret = 1.f;
         double freq = 20.0 * pow (20000.0 / 20.0, i * 1.0 / points);
-        switch(subindex) {
+        int j1;
+        switch(mode) {
             case 0:
-                ret *= lpL0.freq_gain(freq, (float)srate);
+                j1 = 0;
                 break;
             case 1:
-                ret *= hpL0.freq_gain(freq, (float)srate);
-                ret *= lpL1.freq_gain(freq, (float)srate);
-                break;
-            case 2:
-                ret *= hpL1.freq_gain(freq, (float)srate);
-                ret *= lpL2.freq_gain(freq, (float)srate);
-                break;
-            case 3:
-                ret *= hpL2.freq_gain(freq, (float)srate);
+                j1 = 2;
                 break;
         }
+        for(int j = 0; j <= j1; j ++) {
+            switch(subindex) {
+                case 0:
+                    ret *= lpL[0][j].freq_gain(freq, (float)srate);
+                    break;
+                case 1:
+                    ret *= hpL[0][j].freq_gain(freq, (float)srate);
+                    ret *= lpL[1][j].freq_gain(freq, (float)srate);
+                    break;
+                case 2:
+                    ret *= hpL[1][j].freq_gain(freq, (float)srate);
+                    ret *= lpL[2][j].freq_gain(freq, (float)srate);
+                    break;
+                case 3:
+                    ret *= hpL[2][j].freq_gain(freq, (float)srate);
+                    break;
+            }
+        }
         data[i] = dB_grid(ret, 32, 0);
     }
     context->set_line_width(1.5);
@@ -322,7 +359,7 @@ bool multibandlimiter_audio_module::get_gridline(int index, int subindex, float
         return false;
     } else {
         vertical = (subindex & 1) != 0;
-        return get_freq_gridline(subindex, pos, vertical, legend, context, true, 36, 0);
+        return get_freq_gridline(subindex, pos, vertical, legend, context);
     }
 }
 

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list