[SCM] calf/master: Initial multiband limiter vumeters can have width and height in xml layouts vumeters: 1 px gap removed

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


The following commit has been merged in the master branch:
commit 5141485835f7020fead8f48906c738fdc9ead905
Author: Markus Schmidt <schmidt at boomshop.net>
Date:   Sat Nov 19 04:14:18 2011 +0100

    Initial multiband limiter
    vumeters can have width and height in xml layouts
    vumeters: 1 px gap removed

diff --git a/gui/background_dark.png b/doc/manuals/images/background_dark.png
similarity index 100%
copy from gui/background_dark.png
copy to doc/manuals/images/background_dark.png
diff --git a/doc/manuals/scripts/style.css b/doc/manuals/scripts/style.css
index 7028925..af7036c 100644
--- a/doc/manuals/scripts/style.css
+++ b/doc/manuals/scripts/style.css
@@ -1,5 +1,5 @@
 body {
-    background: url(../images/background_blue.png);
+    background: url(../images/background_dark.png);
     color: white;
     text-align: center;
     font-family: sans-serif;
diff --git a/gui/gui-multibandcompressor.xml b/gui/gui-multibandcompressor.xml
index fe3ef8c..ed9647d 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" height="30" />
-            <vumeter param="meter_inR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" height="30" />
+            <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" />
             <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">
@@ -16,7 +16,7 @@
             <led param="clip_inL" expand="0" fill="0" />
             <led param="clip_inR" expand="0" fill="0" />
             <label text="0dB" expand="0" fill="0" />
-        </vbox>z
+        </vbox>
         <table rows="3" cols="2" attach-x="4" attach-y="0" spacing="0" border="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0">
             <knob param="freq0" attach-x="0" attach-y="0" border="0" expand="0" fill="0" expand-x="0" fill-x="0" />
             <vbox attach-x="1" attach-y="0" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0">
@@ -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" height="30" />
-            <vumeter param="meter_outR" mode="0" hold="1.5" falloff="2.5" shrink-y="0" height="30" />
+            <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" />
             <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">
diff --git a/gui/gui-multibandlimiter.xml b/gui/gui-multibandlimiter.xml
new file mode 100644
index 0000000..eca5cf9
--- /dev/null
+++ b/gui/gui-multibandlimiter.xml
@@ -0,0 +1,132 @@
+<table rows="2" cols="1">
+    <table attach-x="0" attach-y="0" expand-y="0" expand-x="1" spacing="5" rows="1" cols="7">
+        <vbox shrink-x="1" expand-x="0" fill-x="0" expand="0" fill="0" attach-x="0" attach-y="0">
+            <label param="level_in" />
+            <knob param="level_in" size="2" />
+            <value param="level_in" />
+        </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" />
+            <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">
+            <label text="0dB" expand="0" fill="0" />
+            <led param="clip_inL" expand="0" fill="0" />
+            <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">
+             <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" />
+            <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">
+            <label text="0dB" expand="0" fill="0" />
+            <led param="clip_outL" expand="0" mode="1" fill="0" />
+            <led param="clip_outR" expand="0" mode="1" fill="0" />
+            <label text="0dB" expand="0" fill="0" />
+        </vbox>
+        <vbox shrink-x="1" expand-x="0" fill-x="0" expand="0" fill="0" attach-x="6" attach-y="0">
+            <label param="level_out" />
+            <knob param="level_out" size="2" />
+            <value param="level_out" />
+        </vbox>
+    </table>
+    
+    <hbox attach-x="0" attach-y="1" expand-y="1" expand-x="1" spacing="5">
+        <frame label="Limit" expand="0" fill="1">
+            <vbox>
+                <vbox>
+                    <knob param="limit" size="5" type="2" />
+                    <value param="limit" />
+                </vbox>
+                <vbox>
+                    <label param="release" />
+                    <knob param="release" />
+                    <value param="release" />
+                </vbox>
+            </vbox>
+        </frame>
+        
+        <frame label="X-Over" expand="0" fill="1">
+            <vbox>
+                <hbox>
+                    <table rows="3" cols="2" spacing="0" border="0" expand="0" fill="0">
+                        <knob param="freq0" attach-x="0" attach-y="0" border="0" expand="0" fill="0" expand-x="0" fill-x="0" />
+                        <vbox attach-x="1" attach-y="0" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0">
+                            <label param="freq0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" align-x="0.0" />
+                            <value param="freq0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" align-x="0.0" />
+                        </vbox>
+                        <hbox  attach-x="0" attach-y="1" border="0" fill-x="0">
+                            <knob param="sep0" type="1" size="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                            <label param="sep0" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                        </hbox>
+                        <value param="sep0" attach-x="1" attach-y="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" width="2" align-x="0.0" />
+                        <hbox  attach-x="0" attach-y="2" border="0" fill-x="0">
+                            <knob param="q0" type="1" size="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                            <label param="q0" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                        </hbox>
+                        <value param="q0" 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>
+                    <table rows="3" cols="2" spacing="0" border="0" expand="0" fill="0">
+                        <knob param="freq1" attach-x="0" attach-y="0" border="0" expand="0" fill="0" expand-x="0" fill-x="0" />
+                        <vbox attach-x="1" attach-y="0" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0">
+                            <label param="freq1" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" align-x="0.0" />
+                            <value param="freq1" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" width="2" align-x="0.0" />
+                        </vbox>
+                        <hbox  attach-x="0" attach-y="1" border="0" fill-x="0">
+                            <knob param="sep1" type="1" size="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                            <label param="sep1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                        </hbox>
+                        <value param="sep1" attach-x="1" attach-y="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" width="2" align-x="0.0" />
+                        <hbox  attach-x="0" attach-y="2" border="0" fill-x="0">
+                            <knob param="q1" type="1" size="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                            <label param="q1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                        </hbox>
+                        <value param="q1" 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>
+                    <table rows="3" cols="2" spacing="0" border="0" expand="0" fill="0">
+                        <knob param="freq2" attach-x="0" attach-y="0" border="0" expand="0" fill="0" expand-x="0" fill-x="0" />
+                        <vbox attach-x="1" attach-y="0" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0">
+                            <label param="freq2" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" align-x="0.0" />
+                            <value param="freq2" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" align-x="0.0" />
+                        </vbox>
+                        <hbox  attach-x="0" attach-y="1" border="0" fill-x="0">
+                            <knob param="sep2" type="1" size="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                            <label param="sep2" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                        </hbox>
+                        <value param="sep2" attach-x="1" attach-y="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" width="2" align-x="0.0" />
+                        <hbox  attach-x="0" attach-y="2" border="0" fill-x="0">
+                            <knob param="q2" type="1" size="1" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                            <label param="q2" border="0" expand="0" fill="0" expand-y="0" fill-y="0" expand-x="0" fill-x="0" />
+                        </hbox>
+                        <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>
+                <if cond="directlink">
+                    <line-graph refresh="1" width="220" height="90" param="limit" expand="0" fill="1"/>
+                </if>
+            </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/src/.deps/modules_limit.Plo b/src/.deps/modules_limit.Plo
new file mode 100644
index 0000000..e885e13
--- /dev/null
+++ b/src/.deps/modules_limit.Plo
@@ -0,0 +1,435 @@
+modules_limit.lo: modules_limit.cpp \
+ /usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed/limits.h \
+ /usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed/syslimits.h \
+ /usr/include/limits.h /usr/include/features.h \
+ /usr/include/x86_64-linux-gnu/bits/predefs.h \
+ /usr/include/x86_64-linux-gnu/sys/cdefs.h \
+ /usr/include/x86_64-linux-gnu/bits/wordsize.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
+ /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/local_lim.h \
+ /usr/include/linux/limits.h \
+ /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/stdio_lim.h /usr/include/memory.h \
+ /usr/include/string.h /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h \
+ /usr/include/xlocale.h calf/giface.h ../config.h calf/primitives.h \
+ /usr/include/assert.h /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdint.h \
+ /usr/include/stdint.h /usr/include/x86_64-linux-gnu/bits/wchar.h \
+ /usr/include/stdio.h /usr/include/x86_64-linux-gnu/bits/types.h \
+ /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdarg.h \
+ /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
+ /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/c++/4.6/cmath \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/os_defines.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/cpu_defines.h \
+ /usr/include/c++/4.6/bits/cpp_type_traits.h \
+ /usr/include/c++/4.6/ext/type_traits.h /usr/include/math.h \
+ /usr/include/x86_64-linux-gnu/bits/huge_val.h \
+ /usr/include/x86_64-linux-gnu/bits/huge_valf.h \
+ /usr/include/x86_64-linux-gnu/bits/huge_vall.h \
+ /usr/include/x86_64-linux-gnu/bits/inf.h \
+ /usr/include/x86_64-linux-gnu/bits/nan.h \
+ /usr/include/x86_64-linux-gnu/bits/mathdef.h \
+ /usr/include/x86_64-linux-gnu/bits/mathcalls.h \
+ /usr/include/x86_64-linux-gnu/bits/mathinline.h \
+ /usr/include/c++/4.6/cstdlib /usr/include/stdlib.h \
+ /usr/include/x86_64-linux-gnu/bits/waitflags.h \
+ /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/byteswap.h \
+ /usr/include/x86_64-linux-gnu/sys/types.h /usr/include/time.h \
+ /usr/include/x86_64-linux-gnu/sys/select.h \
+ /usr/include/x86_64-linux-gnu/bits/select.h \
+ /usr/include/x86_64-linux-gnu/bits/sigset.h \
+ /usr/include/x86_64-linux-gnu/bits/time.h \
+ /usr/include/x86_64-linux-gnu/sys/sysmacros.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/c++/4.6/map /usr/include/c++/4.6/bits/stl_tree.h \
+ /usr/include/c++/4.6/bits/stl_algobase.h \
+ /usr/include/c++/4.6/bits/functexcept.h \
+ /usr/include/c++/4.6/bits/exception_defines.h \
+ /usr/include/c++/4.6/ext/numeric_traits.h \
+ /usr/include/c++/4.6/bits/stl_pair.h /usr/include/c++/4.6/bits/move.h \
+ /usr/include/c++/4.6/bits/concept_check.h \
+ /usr/include/c++/4.6/bits/stl_iterator_base_types.h \
+ /usr/include/c++/4.6/bits/stl_iterator_base_funcs.h \
+ /usr/include/c++/4.6/bits/stl_iterator.h \
+ /usr/include/c++/4.6/debug/debug.h /usr/include/c++/4.6/bits/allocator.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++allocator.h \
+ /usr/include/c++/4.6/ext/new_allocator.h /usr/include/c++/4.6/new \
+ /usr/include/c++/4.6/exception /usr/include/c++/4.6/bits/stl_function.h \
+ /usr/include/c++/4.6/backward/binders.h \
+ /usr/include/c++/4.6/bits/stl_map.h \
+ /usr/include/c++/4.6/initializer_list \
+ /usr/include/c++/4.6/bits/stl_multimap.h \
+ /usr/include/c++/4.6/bits/range_access.h /usr/include/c++/4.6/complex \
+ /usr/include/c++/4.6/sstream /usr/include/c++/4.6/istream \
+ /usr/include/c++/4.6/ios /usr/include/c++/4.6/iosfwd \
+ /usr/include/c++/4.6/bits/stringfwd.h \
+ /usr/include/c++/4.6/bits/postypes.h /usr/include/c++/4.6/cwchar \
+ /usr/include/c++/4.6/bits/char_traits.h \
+ /usr/include/c++/4.6/bits/localefwd.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h \
+ /usr/include/c++/4.6/clocale /usr/include/locale.h \
+ /usr/include/x86_64-linux-gnu/bits/locale.h /usr/include/c++/4.6/cctype \
+ /usr/include/ctype.h /usr/include/c++/4.6/bits/ios_base.h \
+ /usr/include/c++/4.6/ext/atomicity.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr-default.h \
+ /usr/include/pthread.h /usr/include/sched.h \
+ /usr/include/x86_64-linux-gnu/bits/sched.h \
+ /usr/include/x86_64-linux-gnu/bits/setjmp.h /usr/include/unistd.h \
+ /usr/include/x86_64-linux-gnu/bits/posix_opt.h \
+ /usr/include/x86_64-linux-gnu/bits/environments.h \
+ /usr/include/x86_64-linux-gnu/bits/confname.h /usr/include/getopt.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/atomic_word.h \
+ /usr/include/c++/4.6/bits/locale_classes.h /usr/include/c++/4.6/string \
+ /usr/include/c++/4.6/bits/ostream_insert.h \
+ /usr/include/c++/4.6/bits/cxxabi_forced.h \
+ /usr/include/c++/4.6/bits/basic_string.h \
+ /usr/include/c++/4.6/bits/basic_string.tcc \
+ /usr/include/c++/4.6/bits/locale_classes.tcc \
+ /usr/include/c++/4.6/streambuf /usr/include/c++/4.6/bits/streambuf.tcc \
+ /usr/include/c++/4.6/bits/basic_ios.h \
+ /usr/include/c++/4.6/bits/locale_facets.h /usr/include/c++/4.6/cwctype \
+ /usr/include/wctype.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/ctype_base.h \
+ /usr/include/c++/4.6/bits/streambuf_iterator.h \
+ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/ctype_inline.h \
+ /usr/include/c++/4.6/bits/locale_facets.tcc \
+ /usr/include/c++/4.6/bits/basic_ios.tcc /usr/include/c++/4.6/ostream \
+ /usr/include/c++/4.6/bits/ostream.tcc \
+ /usr/include/c++/4.6/bits/istream.tcc \
+ /usr/include/c++/4.6/bits/sstream.tcc /usr/include/c++/4.6/vector \
+ /usr/include/c++/4.6/bits/stl_construct.h \
+ /usr/include/c++/4.6/bits/stl_uninitialized.h \
+ /usr/include/c++/4.6/bits/stl_vector.h \
+ /usr/include/c++/4.6/bits/stl_bvector.h \
+ /usr/include/c++/4.6/bits/vector.tcc calf/modules_limit.h calf/biquad.h \
+ calf/inertia.h calf/audio_fx.h calf/delay.h calf/buffer.h calf/onepole.h \
+ calf/fixed_point.h calf/giface.h calf/metadata.h calf/plugin_tools.h \
+ calf/vumeter.h
+
+/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed/limits.h:
+
+/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed/syslimits.h:
+
+/usr/include/limits.h:
+
+/usr/include/features.h:
+
+/usr/include/x86_64-linux-gnu/bits/predefs.h:
+
+/usr/include/x86_64-linux-gnu/sys/cdefs.h:
+
+/usr/include/x86_64-linux-gnu/bits/wordsize.h:
+
+/usr/include/x86_64-linux-gnu/gnu/stubs.h:
+
+/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
+
+/usr/include/x86_64-linux-gnu/bits/posix1_lim.h:
+
+/usr/include/x86_64-linux-gnu/bits/local_lim.h:
+
+/usr/include/linux/limits.h:
+
+/usr/include/x86_64-linux-gnu/bits/posix2_lim.h:
+
+/usr/include/x86_64-linux-gnu/bits/xopen_lim.h:
+
+/usr/include/x86_64-linux-gnu/bits/stdio_lim.h:
+
+/usr/include/memory.h:
+
+/usr/include/string.h:
+
+/usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h:
+
+/usr/include/xlocale.h:
+
+calf/giface.h:
+
+../config.h:
+
+calf/primitives.h:
+
+/usr/include/assert.h:
+
+/usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/x86_64-linux-gnu/bits/wchar.h:
+
+/usr/include/stdio.h:
+
+/usr/include/x86_64-linux-gnu/bits/types.h:
+
+/usr/include/x86_64-linux-gnu/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdarg.h:
+
+/usr/include/x86_64-linux-gnu/bits/sys_errlist.h:
+
+/usr/include/x86_64-linux-gnu/bits/stdio.h:
+
+/usr/include/c++/4.6/cmath:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/os_defines.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/cpu_defines.h:
+
+/usr/include/c++/4.6/bits/cpp_type_traits.h:
+
+/usr/include/c++/4.6/ext/type_traits.h:
+
+/usr/include/math.h:
+
+/usr/include/x86_64-linux-gnu/bits/huge_val.h:
+
+/usr/include/x86_64-linux-gnu/bits/huge_valf.h:
+
+/usr/include/x86_64-linux-gnu/bits/huge_vall.h:
+
+/usr/include/x86_64-linux-gnu/bits/inf.h:
+
+/usr/include/x86_64-linux-gnu/bits/nan.h:
+
+/usr/include/x86_64-linux-gnu/bits/mathdef.h:
+
+/usr/include/x86_64-linux-gnu/bits/mathcalls.h:
+
+/usr/include/x86_64-linux-gnu/bits/mathinline.h:
+
+/usr/include/c++/4.6/cstdlib:
+
+/usr/include/stdlib.h:
+
+/usr/include/x86_64-linux-gnu/bits/waitflags.h:
+
+/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/x86_64-linux-gnu/bits/endian.h:
+
+/usr/include/x86_64-linux-gnu/bits/byteswap.h:
+
+/usr/include/x86_64-linux-gnu/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/x86_64-linux-gnu/sys/select.h:
+
+/usr/include/x86_64-linux-gnu/bits/select.h:
+
+/usr/include/x86_64-linux-gnu/bits/sigset.h:
+
+/usr/include/x86_64-linux-gnu/bits/time.h:
+
+/usr/include/x86_64-linux-gnu/sys/sysmacros.h:
+
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/c++/4.6/map:
+
+/usr/include/c++/4.6/bits/stl_tree.h:
+
+/usr/include/c++/4.6/bits/stl_algobase.h:
+
+/usr/include/c++/4.6/bits/functexcept.h:
+
+/usr/include/c++/4.6/bits/exception_defines.h:
+
+/usr/include/c++/4.6/ext/numeric_traits.h:
+
+/usr/include/c++/4.6/bits/stl_pair.h:
+
+/usr/include/c++/4.6/bits/move.h:
+
+/usr/include/c++/4.6/bits/concept_check.h:
+
+/usr/include/c++/4.6/bits/stl_iterator_base_types.h:
+
+/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h:
+
+/usr/include/c++/4.6/bits/stl_iterator.h:
+
+/usr/include/c++/4.6/debug/debug.h:
+
+/usr/include/c++/4.6/bits/allocator.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++allocator.h:
+
+/usr/include/c++/4.6/ext/new_allocator.h:
+
+/usr/include/c++/4.6/new:
+
+/usr/include/c++/4.6/exception:
+
+/usr/include/c++/4.6/bits/stl_function.h:
+
+/usr/include/c++/4.6/backward/binders.h:
+
+/usr/include/c++/4.6/bits/stl_map.h:
+
+/usr/include/c++/4.6/initializer_list:
+
+/usr/include/c++/4.6/bits/stl_multimap.h:
+
+/usr/include/c++/4.6/bits/range_access.h:
+
+/usr/include/c++/4.6/complex:
+
+/usr/include/c++/4.6/sstream:
+
+/usr/include/c++/4.6/istream:
+
+/usr/include/c++/4.6/ios:
+
+/usr/include/c++/4.6/iosfwd:
+
+/usr/include/c++/4.6/bits/stringfwd.h:
+
+/usr/include/c++/4.6/bits/postypes.h:
+
+/usr/include/c++/4.6/cwchar:
+
+/usr/include/c++/4.6/bits/char_traits.h:
+
+/usr/include/c++/4.6/bits/localefwd.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h:
+
+/usr/include/c++/4.6/clocale:
+
+/usr/include/locale.h:
+
+/usr/include/x86_64-linux-gnu/bits/locale.h:
+
+/usr/include/c++/4.6/cctype:
+
+/usr/include/ctype.h:
+
+/usr/include/c++/4.6/bits/ios_base.h:
+
+/usr/include/c++/4.6/ext/atomicity.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr-default.h:
+
+/usr/include/pthread.h:
+
+/usr/include/sched.h:
+
+/usr/include/x86_64-linux-gnu/bits/sched.h:
+
+/usr/include/x86_64-linux-gnu/bits/setjmp.h:
+
+/usr/include/unistd.h:
+
+/usr/include/x86_64-linux-gnu/bits/posix_opt.h:
+
+/usr/include/x86_64-linux-gnu/bits/environments.h:
+
+/usr/include/x86_64-linux-gnu/bits/confname.h:
+
+/usr/include/getopt.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/atomic_word.h:
+
+/usr/include/c++/4.6/bits/locale_classes.h:
+
+/usr/include/c++/4.6/string:
+
+/usr/include/c++/4.6/bits/ostream_insert.h:
+
+/usr/include/c++/4.6/bits/cxxabi_forced.h:
+
+/usr/include/c++/4.6/bits/basic_string.h:
+
+/usr/include/c++/4.6/bits/basic_string.tcc:
+
+/usr/include/c++/4.6/bits/locale_classes.tcc:
+
+/usr/include/c++/4.6/streambuf:
+
+/usr/include/c++/4.6/bits/streambuf.tcc:
+
+/usr/include/c++/4.6/bits/basic_ios.h:
+
+/usr/include/c++/4.6/bits/locale_facets.h:
+
+/usr/include/c++/4.6/cwctype:
+
+/usr/include/wctype.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/ctype_base.h:
+
+/usr/include/c++/4.6/bits/streambuf_iterator.h:
+
+/usr/include/c++/4.6/x86_64-linux-gnu/./bits/ctype_inline.h:
+
+/usr/include/c++/4.6/bits/locale_facets.tcc:
+
+/usr/include/c++/4.6/bits/basic_ios.tcc:
+
+/usr/include/c++/4.6/ostream:
+
+/usr/include/c++/4.6/bits/ostream.tcc:
+
+/usr/include/c++/4.6/bits/istream.tcc:
+
+/usr/include/c++/4.6/bits/sstream.tcc:
+
+/usr/include/c++/4.6/vector:
+
+/usr/include/c++/4.6/bits/stl_construct.h:
+
+/usr/include/c++/4.6/bits/stl_uninitialized.h:
+
+/usr/include/c++/4.6/bits/stl_vector.h:
+
+/usr/include/c++/4.6/bits/stl_bvector.h:
+
+/usr/include/c++/4.6/bits/vector.tcc:
+
+calf/modules_limit.h:
+
+calf/biquad.h:
+
+calf/inertia.h:
+
+calf/audio_fx.h:
+
+calf/delay.h:
+
+calf/buffer.h:
+
+calf/onepole.h:
+
+calf/fixed_point.h:
+
+calf/giface.h:
+
+calf/metadata.h:
+
+calf/plugin_tools.h:
+
+calf/vumeter.h:
diff --git a/src/Makefile.am b/src/Makefile.am
index b396f69..3716750 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -52,7 +52,7 @@ calfbenchmark_CXXFLAGS = $(AM_CXXFLAGS) -DTEST_OSC
 calfbenchmark_LDADD += libcalfgui.la
 endif
 
-calf_la_SOURCES = audio_fx.cpp metadata.cpp modules.cpp modules_comp.cpp modules_dist.cpp modules_eq.cpp modules_mod.cpp fluidsynth.cpp giface.cpp monosynth.cpp organ.cpp osctl.cpp osctlnet.cpp plugin.cpp preset.cpp synth.cpp utils.cpp wavetable.cpp modmatrix.cpp 
+calf_la_SOURCES = audio_fx.cpp metadata.cpp modules.cpp modules_comp.cpp modules_limit.cpp modules_dist.cpp modules_eq.cpp modules_mod.cpp fluidsynth.cpp giface.cpp monosynth.cpp organ.cpp osctl.cpp osctlnet.cpp plugin.cpp preset.cpp synth.cpp utils.cpp wavetable.cpp modmatrix.cpp 
 calf_la_LIBADD ?= $(FLUIDSYNTH_DEPS_LIBS)
 if USE_DEBUG
 calf_la_LDFLAGS = -rpath $(ladspadir) -avoid-version -module -lexpat -disable-static $(FLUIDSYNTH_DEPS_LIBS)
diff --git a/src/audio_fx.cpp b/src/audio_fx.cpp
index 094717d..8c92df5 100644
--- a/src/audio_fx.cpp
+++ b/src/audio_fx.cpp
@@ -531,3 +531,45 @@ bool simple_lfo::get_dot(float &x, float &y, int &size, cairo_iface *context) co
     return true;
 }
 
+
+////////////////////////////////////////////////////////////////////////////////
+
+lookahead_limiter::lookahead_limiter() {
+    is_active = false;
+    attenuation = 1.f;
+}
+
+void lookahead_limiter::activate()
+{
+    is_active = true;
+    attenuation = 1.f;
+}
+
+void lookahead_limiter::deactivate()
+{
+    is_active = false;
+}
+
+float lookahead_limiter::get_attenuation()
+{
+    return attenuation;
+}
+
+void lookahead_limiter::set_sample_rate(uint32_t sr)
+{
+    srate = sr;
+}
+
+void lookahead_limiter::set_params(float l, float r, float g, uint32_t sr)
+{
+    limit = l;
+    release = r;
+    gain = g;
+    srate = sr;
+}
+
+void lookahead_limiter::process(float &left, float &right)
+{
+    left = (left * limit) / limit;
+    right = (right * limit) / limit;
+}
diff --git a/src/calf/audio_fx.h b/src/calf/audio_fx.h
index b9e5012..3282e4d 100644
--- a/src/calf/audio_fx.h
+++ b/src/calf/audio_fx.h
@@ -565,6 +565,31 @@ public:
     bool get_dot(float &x, float &y, int &size, calf_plugins::cairo_iface *context) const;
 };
 
+
+/// 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. 
+
+class lookahead_limiter {
+private:
+    float limit, release, gain, attenuation;
+    uint32_t srate;
+    bool is_active;
+public:
+    int id;
+    lookahead_limiter();
+    void process(float &left, float &right);
+    void set_sample_rate(uint32_t sr);
+    void set_params(float l, float r, float g, uint32_t sr);
+    float get_attenuation();
+    void activate();
+    void deactivate();
+};
+
 #if 0
 { to keep editor happy
 #endif
diff --git a/src/calf/ctl_vumeter.h b/src/calf/ctl_vumeter.h
index dbd4f2a..b2abbe9 100644
--- a/src/calf/ctl_vumeter.h
+++ b/src/calf/ctl_vumeter.h
@@ -55,6 +55,8 @@ struct CalfVUMeter
     float last_falloff;
     long last_falltime;
     int meter_width;
+    int vumeter_width;
+    int vumeter_height;
     std::string *meter_text;
     cairo_surface_t *cache_surface;
     cairo_pattern_t *pat;
@@ -75,6 +77,10 @@ extern void calf_vumeter_set_hold(CalfVUMeter *meter, float value);
 extern float calf_vumeter_get_hold(CalfVUMeter *meter);
 extern void calf_vumeter_set_falloff(CalfVUMeter *meter, float value);
 extern float calf_vumeter_get_falloff(CalfVUMeter *meter);
+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);
 
 G_END_DECLS
 
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 27cd2bf..c76cfaa 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -230,6 +230,21 @@ struct sidechaingate_metadata: public plugin_metadata<sidechaingate_metadata>
     PLUGIN_NAME_ID_LABEL("sidechaingate", "sidechaingate", "Sidechain Gate")
 };
 
+/// Markus's multibandlimiter - metadata
+struct multibandlimiter_metadata: public plugin_metadata<multibandlimiter_metadata>
+{
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
+    enum { param_bypass, param_level_in, param_level_out, 
+           STEREO_VU_METER_PARAMS,
+           param_freq0, param_freq1, param_freq2,
+           param_sep0, param_sep1, param_sep2,
+           param_q0, param_q1, param_q2,
+           param_limit, param_release,
+           param_att0, param_att1, param_att2, param_att3,
+           param_count };
+    PLUGIN_NAME_ID_LABEL("multiband_limiter", "multibandlimiter", "Multiband Limiter")
+};
+
 /// Markus's 5-band EQ - metadata
 struct equalizer5band_metadata: public plugin_metadata<equalizer5band_metadata>
 {
diff --git a/src/calf/modulelist.h b/src/calf/modulelist.h
index 85dead8..1588921 100644
--- a/src/calf/modulelist.h
+++ b/src/calf/modulelist.h
@@ -15,6 +15,7 @@
     PER_MODULE_ITEM(deesser, false, "deesser")
     PER_MODULE_ITEM(gate, false, "gate")
     PER_MODULE_ITEM(sidechaingate, false, "sidechaingate")
+    PER_MODULE_ITEM(multibandlimiter, false, "multibandlimiter")
     PER_MODULE_ITEM(pulsator, false, "pulsator")
     PER_MODULE_ITEM(equalizer5band, false, "eq5")
     PER_MODULE_ITEM(equalizer8band, false, "eq8")
diff --git a/src/calf/modules_limit.h b/src/calf/modules_limit.h
new file mode 100644
index 0000000..2c563ae
--- /dev/null
+++ b/src/calf/modules_limit.h
@@ -0,0 +1,58 @@
+/* Calf DSP plugin pack
+ * Limiter related plugins
+ *
+ * Copyright (C) 2001-2010 Krzysztof Foltman, Markus Schmidt, Thor Harald Johansen and others
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef CALF_MODULES_LIMIT_H
+#define CALF_MODULES_LIMIT_H
+
+#include <assert.h>
+#include <limits.h>
+#include "biquad.h"
+#include "inertia.h"
+#include "audio_fx.h"
+#include "giface.h"
+#include "metadata.h"
+#include "plugin_tools.h"
+
+namespace calf_plugins {
+
+/// Multiband Limiter by Markus Schmidt (based on Krzysztof's filters and Steve's lookahead limiter algorythm)
+class multibandlimiter_audio_module: public audio_module<multibandlimiter_metadata>, public line_graph_iface {
+private:
+    typedef multibandlimiter_audio_module AM;
+    static const int strips = 4;
+    uint32_t clip_inL, clip_inR, clip_outL, clip_outR;
+    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;
+    float freq_old[strips - 1], sep_old[strips - 1], q_old[strips - 1];
+public:
+    uint32_t srate;
+    bool is_active;
+    multibandlimiter_audio_module();
+    void activate();
+    void deactivate();
+    void params_changed();
+    uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask);
+    void set_sample_rate(uint32_t sr);
+};
+
+};
+
+#endif
diff --git a/src/ctl_vumeter.cpp b/src/ctl_vumeter.cpp
index ccd3877..788a1d0 100644
--- a/src/ctl_vumeter.cpp
+++ b/src/ctl_vumeter.cpp
@@ -67,7 +67,7 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
     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) - 1 - mx;
+    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));
     if( vu->cache_surface == NULL ) {
@@ -261,9 +261,9 @@ calf_vumeter_size_request (GtkWidget *widget,
                            GtkRequisition *requisition)
 {
     g_assert(CALF_IS_VUMETER(widget));
-
-    requisition->width = 50;
-    requisition->height = 18;
+    CalfVUMeter *self = CALF_VUMETER(widget);
+    requisition->width = self->vumeter_width;
+    requisition->height = self->vumeter_height;
 }
 
 static void
@@ -296,8 +296,8 @@ calf_vumeter_init (CalfVUMeter *self)
 {
     GtkWidget *widget = GTK_WIDGET(self);
     //GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
-    widget->requisition.width = 50;
-    widget->requisition.height = 18;
+    widget->requisition.width =  self->vumeter_width;
+    widget->requisition.height = self->vumeter_height;
     self->cache_surface = NULL;
     self->falling = false;
     self->holding = false;
@@ -401,7 +401,7 @@ extern float calf_vumeter_get_falloff(CalfVUMeter *meter)
 
 extern void calf_vumeter_set_hold(CalfVUMeter *meter, float value)
 {
-    if (value != meter->vumeter_falloff)
+    if (value != meter->vumeter_hold)
     {
         meter->vumeter_hold = value;
         gtk_widget_queue_draw(GTK_WIDGET(meter));
@@ -413,3 +413,30 @@ extern float calf_vumeter_get_hold(CalfVUMeter *meter)
     return meter->vumeter_hold;
 }
 
+extern void calf_vumeter_set_width(CalfVUMeter *meter, int value)
+{
+    if (value != meter->vumeter_width)
+    {
+        meter->vumeter_width = value;
+        gtk_widget_queue_draw(GTK_WIDGET(meter));
+    }
+}
+
+extern int calf_vumeter_get_width(CalfVUMeter *meter)
+{
+    return meter->vumeter_width;
+}
+
+extern void calf_vumeter_set_height(CalfVUMeter *meter, int value)
+{
+    if (value != meter->vumeter_height)
+    {
+        meter->vumeter_height = value;
+        gtk_widget_queue_draw(GTK_WIDGET(meter));
+    }
+}
+
+extern int calf_vumeter_get_height(CalfVUMeter *meter)
+{
+    return meter->vumeter_height;
+}
diff --git a/src/gui_controls.cpp b/src/gui_controls.cpp
index 17e123b..04b23ba 100644
--- a/src/gui_controls.cpp
+++ b/src/gui_controls.cpp
@@ -433,6 +433,8 @@ GtkWidget *vumeter_param_control::create(plugin_gui *_gui, int _param_no)
     calf_vumeter_set_mode (CALF_VUMETER (widget), (CalfVUMeterMode)get_int("mode", 0));
     CALF_VUMETER(widget)->vumeter_hold = get_float("hold", 0);
     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);
     gtk_widget_set_name(GTK_WIDGET(widget), "Calf-VUMeter");
     return widget;
 }
diff --git a/src/metadata.cpp b/src/metadata.cpp
index 0aa27fc..c284a98 100644
--- a/src/metadata.cpp
+++ b/src/metadata.cpp
@@ -489,6 +489,49 @@ CALF_PORT_PROPS(sidechaingate) = {
 
 CALF_PLUGIN_INFO(sidechaingate) = { 0x8504, "Sidechaingate", "Calf Sidechain Gate", "Markus Schmidt / Damien Zammit / Thor Harald Johansen", calf_plugins::calf_copyright_info, "ExpanderPlugin" };
 
+////////////////////////////////////////////////////////////////////////////
+
+CALF_PORT_NAMES(multibandlimiter) = {"In L", "In R", "Out L", "Out R"};
+
+CALF_PORT_PROPS(multibandlimiter) = {
+    { 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", "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-InL" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB-InR" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB-OutL" },
+    { 0,           0,           1,     0,  PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB-OutR" },
+    
+    { 100,         10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "freq0", "Split 1/2" },
+    { 1000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "freq1", "Split 2/3" },
+    { 6000,        10,          20000, 0,  PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "freq2", "Split 3/4" },
+    
+    { -0.17,      -0.5,         0.5,   0,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_GRAPH, NULL, "sep0", "S1" },
+    { -0.17,      -0.5,         0.5,   0,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_GRAPH, NULL, "sep1", "S2" },
+    { -0.17,      -0.5,         0.5,   0,  PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_GRAPH, NULL, "sep2", "S3" },
+    
+    { 0.895025,    0.25,        4,     0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB | PF_PROP_GRAPH, NULL, "q0", "Q1" },
+    { 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.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" },
+    
+    {}
+};
+
+CALF_PLUGIN_INFO(multibandlimiter) = { 0x8520, "Multibandlimiter", "Calf Multiband Limiter", "Markus Schmidt / Steve Harris", calf_plugins::calf_copyright_info, "LimiterPlugin" };
+
 
 ////////////////////////////////////////////////////////////////////////////
 // A few macros to make 
diff --git a/src/modules_comp.cpp b/src/modules_comp.cpp
index b75f2ef..de6e14b 100644
--- a/src/modules_comp.cpp
+++ b/src/modules_comp.cpp
@@ -28,7 +28,7 @@ using namespace calf_plugins;
 
 #define SET_IF_CONNECTED(name) if (params[AM::param_##name] != NULL) *params[AM::param_##name] = name;
 
-/// Multibandcompressor by Markus Schmidt
+/// Multiband Compressor by Markus Schmidt
 ///
 /// This module splits the signal in four different bands
 /// and sends them through multiple filters (implemented by
diff --git a/src/modules_limit.cpp b/src/modules_limit.cpp
new file mode 100644
index 0000000..4da8295
--- /dev/null
+++ b/src/modules_limit.cpp
@@ -0,0 +1,289 @@
+/* Calf DSP plugin pack
+ * Limiter related plugins
+ *
+ * Copyright (C) 2001-2010 Krzysztof Foltman, Markus Schmidt, Thor Harald Johansen and others
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+#include <limits.h>
+#include <memory.h>
+#include <calf/giface.h>
+#include <calf/modules_limit.h>
+
+using namespace dsp;
+using namespace calf_plugins;
+
+#define SET_IF_CONNECTED(name) if (params[AM::param_##name] != NULL) *params[AM::param_##name] = name;
+
+/// Multiband Limiter by Markus Schmidt
+///
+/// This module splits the signal in four different bands
+/// and sends them through multiple filters (implemented by
+/// Krzysztof). They are processed by a compressing routine
+/// (implemented by Steve Harris) afterwards and summed up to the
+/// final output again.
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+multibandlimiter_audio_module::multibandlimiter_audio_module()
+{
+    is_active = false;
+    srate = 0;
+    // zero all displays
+    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 multibandlimiter_audio_module::activate()
+{
+    is_active = true;
+    // set all filters and strips
+    params_changed();
+    // activate all strips
+    for (int j = 0; j < strips; j ++) {
+        strip[j].activate();
+        strip[j].id = j;
+    }
+}
+
+void multibandlimiter_audio_module::deactivate()
+{
+    is_active = false;
+    // deactivate all strips
+    for (int j = 0; j < strips; j ++) {
+        strip[j].deactivate();
+    }
+}
+
+void multibandlimiter_audio_module::params_changed()
+{
+    // set the params of all filters
+    if(*params[param_freq0] != freq_old[0] or *params[param_sep0] != sep_old[0] or *params[param_q0] != q_old[0]) {
+        lpL0.set_lp_rbj((float)(*params[param_freq0] * (1 - *params[param_sep0])), *params[param_q0], (float)srate);
+        lpR0.copy_coeffs(lpL0);
+        hpL0.set_hp_rbj((float)(*params[param_freq0] * (1 + *params[param_sep0])), *params[param_q0], (float)srate);
+        hpR0.copy_coeffs(hpL0);
+        freq_old[0] = *params[param_freq0];
+        sep_old[0]  = *params[param_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);
+        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);
+        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);
+}
+
+void multibandlimiter_audio_module::set_sample_rate(uint32_t sr)
+{
+    srate = sr;
+    // set srate of all strips
+    for (int j = 0; j < strips; j ++) {
+        strip[j].set_sample_rate(srate);
+    }
+}
+
+#define BYPASSED_COMPRESSION(index) \
+    if(params[param_att##index] != NULL) \
+        *params[param_att##index] = 1.0; \
+
+#define ACTIVE_COMPRESSION(index) \
+    if(params[param_att##index] != NULL) \
+        *params[param_att##index] = strip[index].get_attenuation(); \
+
+uint32_t multibandlimiter_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;
+//    for (int i = 0; i < strips; i++)
+//        strip[i].update_curve();
+    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 {
+        // process all strips
+        
+        // let meters fall a bit
+        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;
+        while(offset < numsamples) {
+            // cycle through samples
+            float inL = ins[0][offset];
+            float inR = ins[1][offset];
+            // in level
+            inR *= *params[param_level_in];
+            inL *= *params[param_level_in];
+            // out vars
+            float outL = 0.f;
+            float outR = 0.f;
+            for (int i = 0; i < strips; i ++) {
+                float left  = inL;
+                float right = inR;
+                // send trough filters
+                switch (i) {
+                    case 0:
+                        left  = lpL0.process(left);
+                        right = lpR0.process(right);
+                        lpL0.sanitize();
+                        lpR0.sanitize();
+                        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();
+                        break;
+                }
+                // process gain reduction
+                strip[i].process(left, right);
+                // sum up output
+                outL += left;
+                outR += right;
+            } // process single strip
+            
+            // even out filters gain reduction
+            // 3dB - levelled manually (based on default sep and q settings)
+            outL *= 1.414213562;
+            outR *= 1.414213562;
+            
+            // out level
+            outL *= *params[param_level_out];
+            outR *= *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
+        
+    } // process all strips (no bypass)
+    
+    // draw meters
+    SET_IF_CONNECTED(clip_inL);
+    SET_IF_CONNECTED(clip_inR);
+    SET_IF_CONNECTED(clip_outL);
+    SET_IF_CONNECTED(clip_outR);
+    SET_IF_CONNECTED(meter_inL);
+    SET_IF_CONNECTED(meter_inR);
+    SET_IF_CONNECTED(meter_outL);
+    SET_IF_CONNECTED(meter_outR);
+    // draw strip meters
+    if(bypass > 0.5f) {
+        BYPASSED_COMPRESSION(0)
+        BYPASSED_COMPRESSION(1)
+        BYPASSED_COMPRESSION(2)
+        BYPASSED_COMPRESSION(3)
+    } else {
+        ACTIVE_COMPRESSION(0)
+        ACTIVE_COMPRESSION(1)
+        ACTIVE_COMPRESSION(2)
+        ACTIVE_COMPRESSION(3)
+    }
+    // whatever has to be returned x)
+    return outputs_mask;
+}
+
+
diff --git a/src/plugin.cpp b/src/plugin.cpp
index 2f78bc9..ac26fd6 100644
--- a/src/plugin.cpp
+++ b/src/plugin.cpp
@@ -23,6 +23,7 @@
 #include <calf/lv2wrap.h>
 #include <calf/modules.h>
 #include <calf/modules_comp.h>
+#include <calf/modules_limit.h>
 #include <calf/modules_dev.h>
 #include <calf/modules_dist.h>
 #include <calf/modules_eq.h>

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list