[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