commit 9a8d769611d7128a33a7f08ce71bcd37ed8692be
parent ece430fc99f2ca33e1a7dcae7e1585094ee590e4
Author: Matt Demanett <matt@demanett.net>
Date: Tue, 8 Sep 2020 22:29:28 -0400
LPG: an LPG.
Diffstat:
13 files changed, 1711 insertions(+), 3 deletions(-)
diff --git a/plugin.json b/plugin.json
@@ -174,6 +174,16 @@
]
},
{
+ "slug": "Bogaudio-LPG",
+ "name": "LPG",
+ "description": "Low-pass gate",
+ "manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#lpg",
+ "tags": [
+ "Low-pass gate",
+ "Polyphonic"
+ ]
+ },
+ {
"slug": "Bogaudio-MegaGate",
"name": "MEGAGATE",
"description": "Low- and high-pass gate",
diff --git a/res-pp/LPG-dark-pp.svg b/res-pp/LPG-dark-pp.svg
@@ -0,0 +1,452 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="120.0" height="380.0" viewBox="0 0 120.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+
+
+text {
+ fill: #eee;
+}
+
+polyline {
+ stroke: #ccc;
+}
+path {
+ stroke: #ccc;
+}
+
+rect.module-background, .background-fill {
+ fill: #111;
+}
+polyline.module-border-inner {
+ stroke: #191919;
+}
+polyline.module-border-middle {
+ stroke: #111;
+}
+polyline.module-border-outer {
+ stroke: #000;
+}
+
+rect.input-background, rect.input-background-filler {
+ fill: #aaa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #666;
+}
+text.input-label {
+ fill: #222;
+}
+polyline.input-label, path.input-label {
+ stroke: #222;
+}
+text.output-label {
+ fill: #ddd;
+}
+polyline.output-label, path.output-label {
+ stroke: #ddd;
+}
+
+circle.port-rim {
+ stroke: #c0c0c0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #888;
+}
+circle.knob-rim {
+ fill: #444;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="120.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 119.0,1 119.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 119.5,0.5 119.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 120.0,0 120.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="9pt" letter-spacing="3px" text-anchor="end" transform="translate(110.0 19)">LPG</text>
+ <g transform="translate(5.5 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BOGAUDIO</text>
+ <rect class="background-fill" width="1.5" height="2" fill="#ddd" transform="translate(21 -4)"/>
+ </g>
+
+
+
+
+
+
+ <g transform="translate(0 40)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(42.5 0)">RESPONSE</text>
+ <g transform="translate(-3 -12.5)"><svg id="RESPONSE_PARAM">
+ <g transform="translate(45 45)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="22" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(12 2.5)">
+ <g transform="translate(30 30)">
+ <polyline points="0,0 4.5,0" stroke-width="1.5" transform="rotate(-240) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-210) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-180) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-150) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-120) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-90) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-60) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-30) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(30) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(60) translate(25 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+
+ <g transform="translate(26 67)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LONG</text>
+ <g transform="translate(0 -1)"><svg id="LONG_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+ </g>
+
+ <g transform="translate(88 40)">
+ <g transform="translate(0 0)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">RISE</text>
+ <g transform="translate(0 10)"><svg id="RISE_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 -2)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 45)">
+ <text font-size="7pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">FALL</text>
+ <g transform="translate(0 10)"><svg id="FALL_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 -2)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 134)">
+
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 26) rotate(-90)">LPF</text>
+
+ <g transform="translate(18 0)">
+ <g transform="translate(3.5 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <g transform="translate(0 10.0)"><svg id="LPF_ENV_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <text font-size="9.0pt" text-align="middle" transform="rotate(-240) translate(18 0) rotate(240) translate(-2.2 3.6)">-</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(60) translate(18 0) rotate(-60) translate(-2 2)">+</text>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(52 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <g transform="translate(0 10.0)"><svg id="LPF_BIAS_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-11 2.0)">
+ <g transform="translate(25.5 22.5)">
+ <text font-size="5pt" transform="rotate(60) translate(17 0) rotate(-60) translate(0 4)">20K</text>
+ <text font-size="5pt" transform="rotate(-90) translate(19 0) rotate(90) translate(-4 2.2)">5K</text>
+ <text font-size="5pt" transform="rotate(-172.9) translate(19 0) rotate(172.9) translate(-5 2.2)">1K</text>
+ <text font-size="5pt" transform="rotate(-240) translate(17 0) rotate(240) translate(-12 4)">0HZ</text>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(19.8) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-27.9) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-133.9) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-192.6) translate(17 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 201)">
+
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 34) rotate(-90)">VCA</text>
+
+ <g transform="translate(22 0)">
+ <g transform="translate(0 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <g transform="translate(0 10.0)"><svg id="VCA_ENV_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <text font-size="9.0pt" text-align="middle" transform="rotate(-240) translate(18 0) rotate(240) translate(-2.2 3.6)">-</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(60) translate(18 0) rotate(-60) translate(-2 2)">+</text>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(47.5 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <g transform="translate(0 10.0)"><svg id="VCA_BIAS_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(16 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(40 58)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LINEAR</text>
+ <g transform="translate(0 -1)"><svg id="LINEAR_VCA_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+ </g>
+
+ <g class="io-group" transform="translate(8 284)">
+ <rect class="input-background" width="90" height="75" rx="5" transform="translate(7 0)"/>
+ <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)"/>
+
+ <g transform="translate(10.5 3)"><svg id="RESPONSE_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RESP</text>
+ <g transform="translate(40.5 3)"><svg id="LPF_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">LPF</text>
+ <g transform="translate(70.5 3)"><svg id="VCA_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 35)">VCA</text>
+
+ <rect class="output-background" width="30" height="39" rx="5" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <g transform="translate(10.5 40)"><svg id="GATE_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text>
+ <g transform="translate(40.5 40)"><svg id="IN_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">IN</text>
+ <g transform="translate(70.5 40)"><svg id="OUT_OUTPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#f00" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 72)">OUT</text>
+ </g>
+</svg>
diff --git a/res-pp/LPG-lowcontrast-pp.svg b/res-pp/LPG-lowcontrast-pp.svg
@@ -0,0 +1,452 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="120.0" height="380.0" viewBox="0 0 120.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+
+
+text {
+ fill: #b3b3b3;
+}
+
+polyline {
+ stroke: #b3b3b3;
+}
+path {
+ stroke: #b3b3b3;
+}
+
+rect.module-background, .background-fill {
+ fill: #333;
+}
+polyline.module-border-inner {
+ stroke: #191919;
+}
+polyline.module-border-middle {
+ stroke: #111;
+}
+polyline.module-border-outer {
+ stroke: #000;
+}
+
+rect.input-background, rect.input-background-filler {
+ fill: #b3b3b3;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #888;
+}
+text.input-label {
+ fill: #666;
+}
+polyline.input-label, path.input-label {
+ stroke: #666;
+}
+text.output-label {
+ fill: #ccc;
+}
+polyline.output-label, path.output-label {
+ stroke: #ccc;
+}
+
+circle.port-rim {
+ stroke: #bbb;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #bbb;
+}
+circle.knob-rim {
+ fill: #555;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="120.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 119.0,1 119.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 119.5,0.5 119.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 120.0,0 120.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="9pt" letter-spacing="3px" text-anchor="end" transform="translate(110.0 19)">LPG</text>
+ <g transform="translate(5.5 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BOGAUDIO</text>
+ <rect class="background-fill" width="1.5" height="2" fill="#ddd" transform="translate(21 -4)"/>
+ </g>
+
+
+
+
+
+
+ <g transform="translate(0 40)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(42.5 0)">RESPONSE</text>
+ <g transform="translate(-3 -12.5)"><svg id="RESPONSE_PARAM">
+ <g transform="translate(45 45)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="22" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(12 2.5)">
+ <g transform="translate(30 30)">
+ <polyline points="0,0 4.5,0" stroke-width="1.5" transform="rotate(-240) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-210) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-180) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-150) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-120) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-90) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-60) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-30) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(30) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(60) translate(25 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+
+ <g transform="translate(26 67)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LONG</text>
+ <g transform="translate(0 -1)"><svg id="LONG_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+ </g>
+
+ <g transform="translate(88 40)">
+ <g transform="translate(0 0)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">RISE</text>
+ <g transform="translate(0 10)"><svg id="RISE_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 -2)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 45)">
+ <text font-size="7pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">FALL</text>
+ <g transform="translate(0 10)"><svg id="FALL_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 -2)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 134)">
+
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 26) rotate(-90)">LPF</text>
+
+ <g transform="translate(18 0)">
+ <g transform="translate(3.5 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <g transform="translate(0 10.0)"><svg id="LPF_ENV_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <text font-size="9.0pt" text-align="middle" transform="rotate(-240) translate(18 0) rotate(240) translate(-2.2 3.6)">-</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(60) translate(18 0) rotate(-60) translate(-2 2)">+</text>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(52 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <g transform="translate(0 10.0)"><svg id="LPF_BIAS_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-11 2.0)">
+ <g transform="translate(25.5 22.5)">
+ <text font-size="5pt" transform="rotate(60) translate(17 0) rotate(-60) translate(0 4)">20K</text>
+ <text font-size="5pt" transform="rotate(-90) translate(19 0) rotate(90) translate(-4 2.2)">5K</text>
+ <text font-size="5pt" transform="rotate(-172.9) translate(19 0) rotate(172.9) translate(-5 2.2)">1K</text>
+ <text font-size="5pt" transform="rotate(-240) translate(17 0) rotate(240) translate(-12 4)">0HZ</text>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(19.8) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-27.9) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-133.9) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-192.6) translate(17 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 201)">
+
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 34) rotate(-90)">VCA</text>
+
+ <g transform="translate(22 0)">
+ <g transform="translate(0 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <g transform="translate(0 10.0)"><svg id="VCA_ENV_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <text font-size="9.0pt" text-align="middle" transform="rotate(-240) translate(18 0) rotate(240) translate(-2.2 3.6)">-</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(60) translate(18 0) rotate(-60) translate(-2 2)">+</text>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(47.5 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <g transform="translate(0 10.0)"><svg id="VCA_BIAS_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(16 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(40 58)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LINEAR</text>
+ <g transform="translate(0 -1)"><svg id="LINEAR_VCA_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+ </g>
+
+ <g class="io-group" transform="translate(8 284)">
+ <rect class="input-background" width="90" height="75" rx="5" transform="translate(7 0)"/>
+ <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)"/>
+
+ <g transform="translate(10.5 3)"><svg id="RESPONSE_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RESP</text>
+ <g transform="translate(40.5 3)"><svg id="LPF_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">LPF</text>
+ <g transform="translate(70.5 3)"><svg id="VCA_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 35)">VCA</text>
+
+ <rect class="output-background" width="30" height="39" rx="5" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <g transform="translate(10.5 40)"><svg id="GATE_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text>
+ <g transform="translate(40.5 40)"><svg id="IN_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">IN</text>
+ <g transform="translate(70.5 40)"><svg id="OUT_OUTPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#f00" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 72)">OUT</text>
+ </g>
+</svg>
diff --git a/res-pp/LPG-pp.svg b/res-pp/LPG-pp.svg
@@ -0,0 +1,388 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="120.0" height="380.0" viewBox="0 0 120.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="120.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 119.0,1 119.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 119.5,0.5 119.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 120.0,0 120.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="9pt" letter-spacing="3px" text-anchor="end" transform="translate(110.0 19)">LPG</text>
+ <g transform="translate(5.5 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BOGAUDIO</text>
+ <rect class="background-fill" width="1.5" height="2" fill="#ddd" transform="translate(21 -4)"/>
+ </g>
+
+
+
+
+
+
+ <g transform="translate(0 40)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(42.5 0)">RESPONSE</text>
+ <g transform="translate(-3 -12.5)"><svg id="RESPONSE_PARAM">
+ <g transform="translate(45 45)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="22" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(12 2.5)">
+ <g transform="translate(30 30)">
+ <polyline points="0,0 4.5,0" stroke-width="1.5" transform="rotate(-240) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-210) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-180) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-150) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-120) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-90) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-60) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(-30) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(30) translate(25 0)"/>
+ <polyline points="0,0 3,0" stroke-width="0.7" transform="rotate(60) translate(25 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+
+ <g transform="translate(26 67)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LONG</text>
+ <g transform="translate(0 -1)"><svg id="LONG_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+ </g>
+
+ <g transform="translate(88 40)">
+ <g transform="translate(0 0)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">RISE</text>
+ <g transform="translate(0 10)"><svg id="RISE_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 -2)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 45)">
+ <text font-size="7pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">FALL</text>
+ <g transform="translate(0 10)"><svg id="FALL_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 -2)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 134)">
+
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 26) rotate(-90)">LPF</text>
+
+ <g transform="translate(18 0)">
+ <g transform="translate(3.5 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <g transform="translate(0 10.0)"><svg id="LPF_ENV_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <text font-size="9.0pt" text-align="middle" transform="rotate(-240) translate(18 0) rotate(240) translate(-2.2 3.6)">-</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(60) translate(18 0) rotate(-60) translate(-2 2)">+</text>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(52 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <g transform="translate(0 10.0)"><svg id="LPF_BIAS_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-11 2.0)">
+ <g transform="translate(25.5 22.5)">
+ <text font-size="5pt" transform="rotate(60) translate(17 0) rotate(-60) translate(0 4)">20K</text>
+ <text font-size="5pt" transform="rotate(-90) translate(19 0) rotate(90) translate(-4 2.2)">5K</text>
+ <text font-size="5pt" transform="rotate(-172.9) translate(19 0) rotate(172.9) translate(-5 2.2)">1K</text>
+ <text font-size="5pt" transform="rotate(-240) translate(17 0) rotate(240) translate(-12 4)">0HZ</text>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(19.8) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-27.9) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-133.9) translate(17 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-192.6) translate(17 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 201)">
+
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 34) rotate(-90)">VCA</text>
+
+ <g transform="translate(22 0)">
+ <g transform="translate(0 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <g transform="translate(0 10.0)"><svg id="VCA_ENV_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <text font-size="9.0pt" text-align="middle" transform="rotate(-240) translate(18 0) rotate(240) translate(-2.2 3.6)">-</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <text font-size="5.0pt" text-align="middle" transform="rotate(60) translate(18 0) rotate(-60) translate(-2 2)">+</text>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(47.5 0)">
+
+ <g transform="translate(0.5 8)">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <g transform="translate(0 10.0)"><svg id="VCA_BIAS_PARAM">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(0 10.0)">
+ <g transform="translate(14.5 14.5)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(16 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(16 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(40 58)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LINEAR</text>
+ <g transform="translate(0 -1)"><svg id="LINEAR_VCA_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+ </g>
+
+ <g class="io-group" transform="translate(8 284)">
+ <rect class="input-background" width="90" height="75" rx="5" transform="translate(7 0)"/>
+ <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)"/>
+
+ <g transform="translate(10.5 3)"><svg id="RESPONSE_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RESP</text>
+ <g transform="translate(40.5 3)"><svg id="LPF_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">LPF</text>
+ <g transform="translate(70.5 3)"><svg id="VCA_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 35)">VCA</text>
+
+ <rect class="output-background" width="30" height="39" rx="5" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <g transform="translate(10.5 40)"><svg id="GATE_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text>
+ <g transform="translate(40.5 40)"><svg id="IN_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">IN</text>
+ <g transform="translate(70.5 40)"><svg id="OUT_OUTPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#f00" fill="none"/>
+ </g>
+ </svg></g>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 72)">OUT</text>
+ </g>
+</svg>
diff --git a/res-src/LPG-src.svg b/res-src/LPG-src.svg
@@ -0,0 +1,110 @@
+<module hp="8">
+ <style/>
+
+ <def xlink:href="#module8" var-name="LPG"/>
+
+ <!-- <polyline class="guide" points="0,0 0,380" stroke-width="1" fill="none" transform="translate(3.5*$width/10.0 0)"/> -->
+ <!-- <polyline class="guide" points="0,0 0,380" stroke-width="1" fill="none" transform="translate(5.5*$width/10.0 0)"/> -->
+ <!-- <polyline class="guide" points="0,0 0,380" stroke-width="1" fill="none" transform="translate(7.5*$width/10.0 0)"/> -->
+
+ <g transform="translate(0 40)" var-pad="10.0">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(42.5 0)">RESPONSE</text>
+ <def id="RESPONSE_PARAM" xlink:href="#knob45" transform="translate(-3 $pad-22.5)"/>
+ <def xlink:href="#dial-mintick-45" transform="translate(12 $pad-7.5)"/>
+
+ <g transform="translate(26 67)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LONG</text>
+ <def id="LONG_PARAM" xlink:href="#button-small" transform="translate(0 -1)"/>
+ </g>
+ </g>
+
+ <g transform="translate(88 40)" var-pad="3.0">
+ <g transform="translate(0 0)">
+ <text font-size="8pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">RISE</text>
+ <def id="RISE_SHAPE_PARAM" xlink:href="#knob16" transform="translate(0 10)"/>
+ <def xlink:href="#dial-shape-rise" transform="translate(-12 -2)"/>
+ </g>
+
+ <g transform="translate(0 45)">
+ <text font-size="7pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(8 0)">FALL</text>
+ <def id="FALL_SHAPE_PARAM" xlink:href="#knob16" transform="translate(0 10)"/>
+ <def xlink:href="#dial-shape-fall" transform="translate(-12 -2)"/>
+ </g>
+ </g>
+
+ <g transform="translate(5 134)">
+ <!-- <rect width="$width" height="52" fill="#f0f" transform="translate(-5 0)"/> -->
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 26) rotate(-90)">LPF</text>
+
+ <g transform="translate(18 0)">
+ <g transform="translate(3.5 0)">
+ <!-- <rect width="36" height="78" fill="#0f0" transform="translate(-3 0)"/> -->
+ <g transform="translate(0.5 8)" var-pad="10.0">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <def id="LPF_ENV_PARAM" xlink:href="#knob29x" transform="translate(0 $pad)"/>
+ <def xlink:href="#dial-attenuverter29" transform="translate(0 $pad)"/>
+ </g>
+ </g>
+
+ <g transform="translate(52 0)">
+ <!-- <rect width="36" height="78" fill="#0f0" transform="translate(-3 0)"/> -->
+ <g transform="translate(0.5 8)" var-pad="10.0">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <def id="LPF_BIAS_PARAM" xlink:href="#knob29x" transform="translate(0 $pad)"/>
+ <def xlink:href="#dial-frequency-bias" transform="translate(-11 $pad-8)"/>
+ </g>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(5 201)">
+ <!-- <rect width="$width" height="68" fill="#f0f" transform="translate(-5 0)"/> -->
+ <text font-size="9pt" letter-spacing="2px" text-anchor="middle" transform="translate(11 34) rotate(-90)">VCA</text>
+
+ <g transform="translate(22 0)">
+ <g transform="translate(0 0)">
+ <!-- <rect width="36" height="78" fill="#0f0" transform="translate(-3 0)"/> -->
+ <g transform="translate(0.5 8)" var-pad="10.0">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">ENV</text>
+ <def id="VCA_ENV_PARAM" xlink:href="#knob29x" transform="translate(0 $pad)"/>
+ <def xlink:href="#dial-attenuverter29" transform="translate(0 $pad)"/>
+ </g>
+ </g>
+
+ <g transform="translate(47.5 0)">
+ <!-- <rect width="36" height="78" fill="#0f0" transform="translate(-3 0)"/> -->
+ <g transform="translate(0.5 8)" var-pad="10.0">
+ <text font-size="7pt" letter-spacing="2px" text-anchor="middle" transform="translate(15 0)">BIAS</text>
+ <def id="VCA_BIAS_PARAM" xlink:href="#knob29x" transform="translate(0 $pad)"/>
+ <def xlink:href="#dial-mintick-29" transform="translate(0 $pad)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(40 58)">
+ <text font-size="5pt" letter-spacing="1px" transform="translate(12 6)">LINEAR</text>
+ <def id="LINEAR_VCA_PARAM" xlink:href="#button-small" transform="translate(0 -1)"/>
+ </g>
+ </g>
+
+ <g class="io-group" transform="translate(8 284)">
+ <rect class="input-background" width="90" height="75" rx="5" transform="translate(7 0)" />
+ <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)" />
+
+ <def id="RESPONSE_INPUT" xlink:href="#input" transform="translate(10.5 3)"/>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RESP</text>
+ <def id="LPF_INPUT" xlink:href="#input" transform="translate(40.5 3)"/>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">LPF</text>
+ <def id="VCA_INPUT" xlink:href="#input" transform="translate(70.5 3)"/>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 35)">VCA</text>
+
+ <rect class="output-background" width="30" height="39" rx="5" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <def id="GATE_INPUT" xlink:href="#input" transform="translate(10.5 40)"/>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text>
+ <def id="IN_INPUT" xlink:href="#input" transform="translate(40.5 40)"/>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">IN</text>
+ <def id="OUT_OUTPUT" xlink:href="#output" transform="translate(70.5 40)"/>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(82.5 72)">OUT</text>
+ </g>
+</module>
diff --git a/res/LPG-dark.svg b/res/LPG-dark.svg
Binary files differ.
diff --git a/res/LPG-lowcontrast.svg b/res/LPG-lowcontrast.svg
Binary files differ.
diff --git a/res/LPG.svg b/res/LPG.svg
Binary files differ.
diff --git a/src/LPG.cpp b/src/LPG.cpp
@@ -0,0 +1,205 @@
+
+#include "LPG.hpp"
+
+#define LPF_POLES "lpf_poles"
+
+void LPG::Engine::reset() {
+ trigger.reset();
+ gatePulseGen.process(10.0);
+}
+
+void LPG::Engine::setSampleRate(float sr) {
+ vcaSL.setParams(sr, 5.0f, 1.0f);
+ finalHP.setParams(sr, MultimodeFilter::BUTTERWORTH_TYPE, 2, MultimodeFilter::HIGHPASS_MODE, 80.0f, MultimodeFilter::minQbw, MultimodeFilter::LINEAR_BANDWIDTH_MODE, MultimodeFilter::MINIMUM_DELAY_MODE);
+}
+
+void LPG::reset() {
+ for (int c = 0; c < _channels; ++c) {
+ _engines[c]->reset();
+ }
+}
+
+void LPG::sampleRateChange() {
+ _sampleRate = APP->engine->getSampleRate();
+ _sampleTime = APP->engine->getSampleTime();
+ for (int i = 0; i < _channels; ++i) {
+ _engines[i]->setSampleRate(_sampleRate);
+ }
+}
+
+json_t* LPG::toJson(json_t* root) {
+ json_object_set_new(root, LPF_POLES, json_integer(_lpfPoles));
+ return root;
+}
+
+void LPG::fromJson(json_t* root) {
+ json_t* p = json_object_get(root, LPF_POLES);
+ if (p) {
+ _lpfPoles = json_integer_value(p);
+ }
+}
+
+bool LPG::active() {
+ return outputs[OUT_OUTPUT].isConnected();
+}
+
+int LPG::channels() {
+ return inputs[GATE_INPUT].getChannels();
+}
+
+void LPG::addChannel(int c) {
+ _engines[c] = new Engine();
+ _engines[c]->reset();
+ _engines[c]->setSampleRate(_sampleRate);
+}
+
+void LPG::removeChannel(int c) {
+ delete _engines[c];
+ _engines[c] = NULL;
+}
+
+void LPG::modulateChannel(int c) {
+ _engines[c]->slew.modulate(
+ _sampleRate,
+ params[RESPONSE_PARAM],
+ inputs[RESPONSE_INPUT],
+ 300.0f * _timeScale,
+ params[RISE_SHAPE_PARAM],
+ params[RESPONSE_PARAM],
+ inputs[RESPONSE_INPUT],
+ 1000.0f * _timeScale,
+ params[FALL_SHAPE_PARAM],
+ c
+ );
+}
+
+void LPG::processChannel(const ProcessArgs& args, int c) {
+ Engine& e = *_engines[c];
+
+ if (e.trigger.process(inputs[GATE_INPUT].getPolyVoltage(c))) {
+ float time = clamp(params[RESPONSE_PARAM].getValue(), 0.0f, 1.0f);
+ if (inputs[RESPONSE_INPUT].isConnected()) {
+ time *= clamp(inputs[RESPONSE_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
+ }
+ time *= time;
+ time *= _timeScale * 0.5f;
+ time += 0.01f;
+ e.gateSeconds = time;
+
+ e.gateElapsedSeconds = 0.0f;
+ e.gateSeconds = time;
+ }
+ else {
+ e.gateElapsedSeconds += _sampleTime;
+ }
+
+ float gate = 0.0f;
+ if (e.gateElapsedSeconds < e.gateSeconds) {
+ gate = 10.0f;
+ }
+ float env = e.slew.next(gate);
+ env /= 10.0f;
+
+ float lpfEnv = clamp(params[LPF_ENV_PARAM].getValue(), -1.0f, 1.0f);
+ float lpfBias = clamp(params[LPF_BIAS_PARAM].getValue(), -1.0f, 1.0f);
+ if (inputs[LPF_INPUT].isConnected()) {
+ float cv = clamp(inputs[LPF_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
+ lpfBias = clamp(lpfBias + cv, -1.0f, 1.0f);
+ }
+ lpfBias *= lpfBias;
+ float f = clamp(lpfBias + env * lpfEnv, 0.0f, 1.0f);
+ f *= maxFilterCutoff;
+ f = std::max(f, MultimodeFilter4::minFrequency);
+ e.lpf.setParams(
+ _sampleRate,
+ MultimodeFilter::BUTTERWORTH_TYPE,
+ _lpfPoles,
+ MultimodeFilter::LOWPASS_MODE,
+ f,
+ 0.0f
+ );
+
+ bool linear = params[LINEAR_VCA_PARAM].getValue() > 0.5f;
+ float vcaEnv = clamp(params[VCA_ENV_PARAM].getValue(), -1.0f, 1.0f);
+ float vcaBias = clamp(params[VCA_BIAS_PARAM].getValue(), 0.0f, 1.0f);
+ if (inputs[VCA_INPUT].isConnected()) {
+ float cv = clamp(inputs[VCA_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
+ vcaBias = clamp(vcaBias + cv, 0.0f, 1.0f);
+ }
+ float level = clamp(vcaBias + env * vcaEnv, 0.0f, 1.0f);
+ level = e.vcaSL.next(level);
+
+ float out = inputs[IN_INPUT].getPolyVoltage(c);
+ out = e.finalHP.next(e.lpf.next(out));
+ if (linear) {
+ out *= level;
+ }
+ else {
+ e.vca.setLevel(Amplifier::minDecibels * (1.0f - level));
+ out = e.vca.next(out);
+ }
+ outputs[OUT_OUTPUT].setChannels(_channels);
+ outputs[OUT_OUTPUT].setVoltage(out, c);
+}
+
+struct LPGWidget : BGModuleWidget {
+ static constexpr int hp = 8;
+
+ LPGWidget(LPG* module) {
+ setModule(module);
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+ setPanel(box.size, "LPG");
+ createScrews();
+
+ // generated by svg_widgets.rb
+ auto responseParamPosition = Vec(19.5, 50.0);
+ auto times10xParamPosition = Vec(26.0, 106.0);
+ auto riseShapeParamPosition = Vec(88.0, 50.0);
+ auto fallShapeParamPosition = Vec(88.0, 95.0);
+ auto lpfEnvParamPosition = Vec(27.0, 152.0);
+ auto lpfBiasParamPosition = Vec(75.5, 152.0);
+ auto vcaEnvParamPosition = Vec(27.5, 219.0);
+ auto vcaBiasParamPosition = Vec(75.0, 219.0);
+ auto linearVcaParamPosition = Vec(45.0, 258.0);
+
+ auto responseInputPosition = Vec(18.5, 287.0);
+ auto lpfInputPosition = Vec(48.5, 287.0);
+ auto vcaInputPosition = Vec(78.5, 287.0);
+ auto gateInputPosition = Vec(18.5, 324.0);
+ auto inInputPosition = Vec(48.5, 324.0);
+
+ auto outOutputPosition = Vec(78.5, 324.0);
+ // end generated by svg_widgets.rb
+
+ addParam(createParam<Knob45>(responseParamPosition, module, LPG::RESPONSE_PARAM));
+ addParam(createParam<IndicatorButtonGreen9>(times10xParamPosition, module, LPG::LONG_PARAM));
+ addParam(createParam<Knob16>(riseShapeParamPosition, module, LPG::RISE_SHAPE_PARAM));
+ addParam(createParam<Knob16>(fallShapeParamPosition, module, LPG::FALL_SHAPE_PARAM));
+ addParam(createParam<Knob26>(lpfEnvParamPosition, module, LPG::LPF_ENV_PARAM));
+ addParam(createParam<Knob26>(lpfBiasParamPosition, module, LPG::LPF_BIAS_PARAM));
+ addParam(createParam<Knob26>(vcaEnvParamPosition, module, LPG::VCA_ENV_PARAM));
+ addParam(createParam<Knob26>(vcaBiasParamPosition, module, LPG::VCA_BIAS_PARAM));
+ addParam(createParam<IndicatorButtonGreen9>(linearVcaParamPosition, module, LPG::LINEAR_VCA_PARAM));
+
+ addInput(createInput<Port24>(responseInputPosition, module, LPG::RESPONSE_INPUT));
+ addInput(createInput<Port24>(lpfInputPosition, module, LPG::LPF_INPUT));
+ addInput(createInput<Port24>(vcaInputPosition, module, LPG::VCA_INPUT));
+ addInput(createInput<Port24>(gateInputPosition, module, LPG::GATE_INPUT));
+ addInput(createInput<Port24>(inInputPosition, module, LPG::IN_INPUT));
+
+ addOutput(createOutput<Port24>(outOutputPosition, module, LPG::OUT_OUTPUT));
+ }
+
+ void contextMenu(Menu* menu) override {
+ auto m = dynamic_cast<LPG*>(module);
+ assert(m);
+ OptionsMenuItem* bwm = new OptionsMenuItem("LPF poles");
+ bwm->addItem(OptionMenuItem("1", [m]() { return m->_lpfPoles == 1; }, [m]() { m->_lpfPoles = 1; }));
+ bwm->addItem(OptionMenuItem("2", [m]() { return m->_lpfPoles == 2; }, [m]() { m->_lpfPoles = 2; }));
+ bwm->addItem(OptionMenuItem("3", [m]() { return m->_lpfPoles == 3; }, [m]() { m->_lpfPoles = 3; }));
+ bwm->addItem(OptionMenuItem("4", [m]() { return m->_lpfPoles == 4; }, [m]() { m->_lpfPoles = 4; }));
+ OptionsMenuItem::addToMenu(bwm, menu);
+ }
+};
+
+Model* modelLPG = createModel<LPG, LPGWidget>("Bogaudio-LPG", "LPG", "Low-pass gate", "Low-pass gate", "Polyphonic");
diff --git a/src/LPG.hpp b/src/LPG.hpp
@@ -0,0 +1,87 @@
+#pragma once
+
+#include "lpg_common.hpp"
+#include "dsp/filters/multimode.hpp"
+
+extern Model* modelLPG;
+
+namespace bogaudio {
+
+struct LPG : LPGEnvBaseModule {
+ enum ParamsIds {
+ RESPONSE_PARAM,
+ LONG_PARAM,
+ RISE_SHAPE_PARAM,
+ FALL_SHAPE_PARAM,
+ LPF_ENV_PARAM,
+ LPF_BIAS_PARAM,
+ VCA_ENV_PARAM,
+ VCA_BIAS_PARAM,
+ LINEAR_VCA_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ RESPONSE_INPUT,
+ LPF_INPUT,
+ VCA_INPUT,
+ GATE_INPUT,
+ IN_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ static constexpr float maxFilterCutoff = 20000.0f;
+
+ struct Engine {
+ Trigger trigger;
+ rack::dsp::PulseGenerator gatePulseGen;
+ float gateSeconds = 0.0f;
+ float gateElapsedSeconds = 0.0f;
+ RiseFallShapedSlewLimiter slew;
+ MultimodeFilter4 lpf;
+ MultimodeFilter4 finalHP;
+ Amplifier vca;
+ bogaudio::dsp::SlewLimiter vcaSL;
+
+ void reset();
+ void setSampleRate(float sr);
+ };
+
+ Engine* _engines[maxChannels] {};
+ float _sampleRate = 0.0f;
+ float _sampleTime = 0.0f;
+ int _lpfPoles = 2;
+
+ LPG()
+ : LPGEnvBaseModule(-1, LONG_PARAM, 5.0f)
+ {
+ config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ configParam(RESPONSE_PARAM, 0.0f, 1.0f, 0.2f, "Response", "%", 0.0f, 100.0f);
+ configParam(LONG_PARAM, 0.0f, 1.0f, 0.0f, "Long mode");
+ configParam(RISE_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Rise shape");
+ configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Fall shape");
+ configParam(LPF_ENV_PARAM, -1.0f, 1.0f, 0.8f, "LPF envelope amount", "%", 0.0f, 100.0f);
+ configParam<ScaledSquaringParamQuantity<(int)maxFilterCutoff>>(LPF_BIAS_PARAM, 0.0f, 1.0f, 0.0f, "LPF cutoff", " HZ");
+ configParam(VCA_ENV_PARAM, -1.0f, 1.0f, 1.0f, "VCA envelope amount", "%", 0.0f, 100.0f);
+ configParam(VCA_BIAS_PARAM, 0.0f, 1.0f, 0.0f, "VCA level", "%", 0.0f, 100.0f);
+ configParam(LINEAR_VCA_PARAM, 0.0f, 1.0f, 0.0f, "Linear VCA mode");
+ }
+
+ void reset() override;
+ void sampleRateChange() override;
+ json_t* toJson(json_t* root) override;
+ void fromJson(json_t* root) override;
+ bool active() override;
+ int channels() override;
+ void addChannel(int c) override;
+ void removeChannel(int c) override;
+ void modulateChannel(int c) override;
+ void processChannel(const ProcessArgs& args, int c) override;
+};
+
+} // namespace bogaudio
diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp
@@ -38,6 +38,7 @@
#include "LFO.hpp"
#include "LLFO.hpp"
#include "Lmtr.hpp"
+#include "LPG.hpp"
#include "LVCF.hpp"
#include "LVCO.hpp"
#include "Manual.hpp"
@@ -135,6 +136,7 @@ void init(rack::Plugin *p) {
p->addModel(modelFFB);
p->addModel(modelEQ);
p->addModel(modelEQS);
+ p->addModel(modelLPG);
p->addModel(modelMegaGate);
p->addModel(modelPEQ);
p->addModel(modelPEQ6);
diff --git a/src/lpg_common.cpp b/src/lpg_common.cpp
@@ -16,8 +16,8 @@ void LPGEnvBaseModule::fromJson(json_t* root) {
}
void LPGEnvBaseModule::modulate() {
- _gateToTrigger = params[_gateToTriggerParamID].getValue() > 0.5f;
- _timeScale = params[_timeScaleParamID].getValue() > 0.5f ? 10.0f : 1.0f;
+ _gateToTrigger = _gateToTriggerParamID >= 0 && params[_gateToTriggerParamID].getValue() > 0.5f;
+ _timeScale = params[_timeScaleParamID].getValue() > 0.5f ? _longTimeScale : 1.0f;
}
diff --git a/src/lpg_common.hpp b/src/lpg_common.hpp
@@ -5,14 +5,16 @@
struct LPGEnvBaseModule : BGModule {
int _gateToTriggerParamID;
int _timeScaleParamID;
+ float _longTimeScale;
bool _gateToTrigger = false;
float _timeScale = 1.0f;
const float _maxVelocityDb = 0.0f;
float _minVelocityDb = -6.0f;
- LPGEnvBaseModule(int gateToTriggerParamID, int timeScaleParamID)
+ LPGEnvBaseModule(int gateToTriggerParamID, int timeScaleParamID, float longTimeScale = 10.0f)
: _gateToTriggerParamID(gateToTriggerParamID)
, _timeScaleParamID(timeScaleParamID)
+ , _longTimeScale(longTimeScale)
{}
json_t* toJson(json_t* root) override;