commit ecff5b2c3514024bb31aa4b2e6cfb29dbf264e2b
parent 9a8d769611d7128a33a7f08ce71bcd37ed8692be
Author: Matt Demanett <matt@demanett.net>
Date: Tue, 8 Sep 2020 23:16:44 -0400
LLPG: mini LPG.
Diffstat:
27 files changed, 1263 insertions(+), 33 deletions(-)
diff --git a/plugin.json b/plugin.json
@@ -184,6 +184,16 @@
]
},
{
+ "slug": "Bogaudio-LLPG",
+ "name": "LLPG",
+ "description": "Low-pass gate",
+ "manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#llpg",
+ "tags": [
+ "Low-pass gate",
+ "Polyphonic"
+ ]
+ },
+ {
"slug": "Bogaudio-MegaGate",
"name": "MEGAGATE",
"description": "Low- and high-pass gate",
diff --git a/res-pp/LLPG-dark-pp.svg b/res-pp/LLPG-dark-pp.svg
@@ -0,0 +1,332 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="45.0" height="380.0" viewBox="0 0 45.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>
+
+ <defs>
+ <symbol id="dial-shape-llpg" viewBox="0 0 45px 45px">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </symbol>
+ </defs>
+
+
+
+ <rect class="module-background background-fill" width="45.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 44.0,1 44.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 44.5,0.5 44.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 45.0,0 45.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <g transform="rotate(-90) translate(-376.0 13)">
+ <text class="title" font-size="7pt" letter-spacing="2.5px">LLPG</text>
+ <g transform="translate(0 12)">
+ <text class="brand" font-size="7pt" letter-spacing="2px">BGA</text>
+ <rect class="background-fill" width="3.0" height="3" fill="#ddd" transform="translate(11.5 -5)"/>
+ </g>
+ </g>
+
+
+ <g transform="translate(0 25)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">RESP</text>
+ <g transform="translate(0 3.5)"><svg id="RESPONSE_PARAM">
+ <g transform="translate(22.5 22.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(8 11.5)">
+ <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 transform="translate(0 73)">
+ <g transform="translate(14.5 9)"><svg id="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(2.5 -3)">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 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 122)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">LPF</text>
+ <g transform="translate(9.5 8)"><svg id="LPF_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(9.5 8)">
+ <g transform="translate(13 13)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(14.5 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 177)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">VCA</text>
+ <g transform="translate(9.5 8)"><svg id="VCA_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(9.5 8)">
+ <g transform="translate(13 13)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(14.5 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 225)">
+ <g class="io-group" transform="translate(5.5 0)">
+ <rect class="input-background-filler" width="34" height="10" transform="translate(0 63)"/>
+ <rect class="input-background" width="34" height="70" rx="5"/>
+ <g transform="translate(5 3)"><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="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(17 35)">TRIG</text>
+ <g transform="translate(5 38)"><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="input-label" font-size="5pt" letter-spacing="1.2px" text-anchor="middle" transform="translate(17 70)">IN</text>
+ </g>
+ <g class="io-group" transform="translate(5.5 76)">
+ <rect class="output-background-filler" width="34" height="10" transform="translate(0 -3)"/>
+ <rect class="output-background" width="34" height="35" rx="5"/>
+ <g transform="translate(5 0)"><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(17 32)">OUT</text>
+ </g>
+ </g>
+</svg>
diff --git a/res-pp/LLPG-lowcontrast-pp.svg b/res-pp/LLPG-lowcontrast-pp.svg
@@ -0,0 +1,332 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="45.0" height="380.0" viewBox="0 0 45.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>
+
+ <defs>
+ <symbol id="dial-shape-llpg" viewBox="0 0 45px 45px">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </symbol>
+ </defs>
+
+
+
+ <rect class="module-background background-fill" width="45.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 44.0,1 44.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 44.5,0.5 44.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 45.0,0 45.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <g transform="rotate(-90) translate(-376.0 13)">
+ <text class="title" font-size="7pt" letter-spacing="2.5px">LLPG</text>
+ <g transform="translate(0 12)">
+ <text class="brand" font-size="7pt" letter-spacing="2px">BGA</text>
+ <rect class="background-fill" width="3.0" height="3" fill="#ddd" transform="translate(11.5 -5)"/>
+ </g>
+ </g>
+
+
+ <g transform="translate(0 25)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">RESP</text>
+ <g transform="translate(0 3.5)"><svg id="RESPONSE_PARAM">
+ <g transform="translate(22.5 22.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(8 11.5)">
+ <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 transform="translate(0 73)">
+ <g transform="translate(14.5 9)"><svg id="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(2.5 -3)">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 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 122)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">LPF</text>
+ <g transform="translate(9.5 8)"><svg id="LPF_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(9.5 8)">
+ <g transform="translate(13 13)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(14.5 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 177)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">VCA</text>
+ <g transform="translate(9.5 8)"><svg id="VCA_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(9.5 8)">
+ <g transform="translate(13 13)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(14.5 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 225)">
+ <g class="io-group" transform="translate(5.5 0)">
+ <rect class="input-background-filler" width="34" height="10" transform="translate(0 63)"/>
+ <rect class="input-background" width="34" height="70" rx="5"/>
+ <g transform="translate(5 3)"><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="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(17 35)">TRIG</text>
+ <g transform="translate(5 38)"><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="input-label" font-size="5pt" letter-spacing="1.2px" text-anchor="middle" transform="translate(17 70)">IN</text>
+ </g>
+ <g class="io-group" transform="translate(5.5 76)">
+ <rect class="output-background-filler" width="34" height="10" transform="translate(0 -3)"/>
+ <rect class="output-background" width="34" height="35" rx="5"/>
+ <g transform="translate(5 0)"><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(17 32)">OUT</text>
+ </g>
+ </g>
+</svg>
diff --git a/res-pp/LLPG-pp.svg b/res-pp/LLPG-pp.svg
@@ -0,0 +1,268 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="45.0" height="380.0" viewBox="0 0 45.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>
+
+ <defs>
+ <symbol id="dial-shape-llpg" viewBox="0 0 45px 45px">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </symbol>
+ </defs>
+
+
+
+ <rect class="module-background background-fill" width="45.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 44.0,1 44.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 44.5,0.5 44.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 45.0,0 45.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <g transform="rotate(-90) translate(-376.0 13)">
+ <text class="title" font-size="7pt" letter-spacing="2.5px">LLPG</text>
+ <g transform="translate(0 12)">
+ <text class="brand" font-size="7pt" letter-spacing="2px">BGA</text>
+ <rect class="background-fill" width="3.0" height="3" fill="#ddd" transform="translate(11.5 -5)"/>
+ </g>
+ </g>
+
+
+ <g transform="translate(0 25)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">RESP</text>
+ <g transform="translate(0 3.5)"><svg id="RESPONSE_PARAM">
+ <g transform="translate(22.5 22.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(8 11.5)">
+ <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 transform="translate(0 73)">
+ <g transform="translate(14.5 9)"><svg id="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(2.5 -3)">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 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 122)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">LPF</text>
+ <g transform="translate(9.5 8)"><svg id="LPF_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(9.5 8)">
+ <g transform="translate(13 13)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(14.5 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 177)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">VCA</text>
+ <g transform="translate(9.5 8)"><svg id="VCA_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(9.5 8)">
+ <g transform="translate(13 13)">
+ <polyline points="0,0 4,0" stroke-width="1.5" transform="rotate(-240) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(14.5 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(60) translate(14.5 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 225)">
+ <g class="io-group" transform="translate(5.5 0)">
+ <rect class="input-background-filler" width="34" height="10" transform="translate(0 63)"/>
+ <rect class="input-background" width="34" height="70" rx="5"/>
+ <g transform="translate(5 3)"><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="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(17 35)">TRIG</text>
+ <g transform="translate(5 38)"><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="input-label" font-size="5pt" letter-spacing="1.2px" text-anchor="middle" transform="translate(17 70)">IN</text>
+ </g>
+ <g class="io-group" transform="translate(5.5 76)">
+ <rect class="output-background-filler" width="34" height="10" transform="translate(0 -3)"/>
+ <rect class="output-background" width="34" height="35" rx="5"/>
+ <g transform="translate(5 0)"><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(17 32)">OUT</text>
+ </g>
+ </g>
+</svg>
diff --git a/res-pp/LPG-dark-pp.svg b/res-pp/LPG-dark-pp.svg
@@ -425,15 +425,16 @@ polyline.knob-tick {
</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" width="30" height="37.5" rx="5" transform="translate(67 37.5)"/>
<rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(67 65)"/>
<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>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">TRIG</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"/>
diff --git a/res-pp/LPG-lowcontrast-pp.svg b/res-pp/LPG-lowcontrast-pp.svg
@@ -425,15 +425,16 @@ polyline.knob-tick {
</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" width="30" height="37.5" rx="5" transform="translate(67 37.5)"/>
<rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(67 65)"/>
<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>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">TRIG</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"/>
diff --git a/res-pp/LPG-pp.svg b/res-pp/LPG-pp.svg
@@ -361,15 +361,16 @@ polyline.knob-tick {
</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" width="30" height="37.5" rx="5" transform="translate(67 37.5)"/>
<rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(67 65)"/>
<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>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">TRIG</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"/>
diff --git a/res-src/LLPG-src.svg b/res-src/LLPG-src.svg
@@ -0,0 +1,69 @@
+<module hp="3">
+ <style/>
+
+ <defs>
+ <symbol id="dial-shape-llpg" viewBox="0 0 45px 45px">
+ <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 -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(45) translate(2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(12 0) rotate(240) translate(-2 0) rotate(-45) translate(-2.5 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(-45) translate(-2 0)"/>
+ <polyline points="-2.5,0 2.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(15 0) rotate(90) rotate(45) translate(2 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(-135) translate(-2.5 0)"/>
+ <path d="M -2.5 0 Q 0 2.5, 2.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(12 0) rotate(-60) translate(2 0) rotate(135) translate(2.5 0)"/>
+
+ <polyline points="-3,0 3,0" stroke-width="1.0"/>
+ <polyline points="0,-3 0,3" stroke-width="1.0"/>
+ </g>
+ </symbol>
+ </defs>
+
+ <def xlink:href="#module3" var-name="LLPG"/>
+
+ <g transform="translate(0 25)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">RESP</text>
+ <def id="RESPONSE_PARAM" xlink:href="#knob29" transform="translate(0 3.5)"/>
+ <def xlink:href="#dial-mintick-29" transform="translate(8 11.5)"/>
+ </g>
+
+ <g transform="translate(0 73)">
+ <def id="SHAPE_PARAM" xlink:href="#knob16" transform="translate(14.5 9)"/>
+ <def xlink:href="#dial-shape-llpg" transform="translate(2.5 -3)"/>
+ </g>
+
+ <g transform="translate(0 122)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">LPF</text>
+ <def id="LPF_PARAM" xlink:href="#knob26" transform="translate($width/2.0-13.0 8)"/>
+ <def xlink:href="#dial-mintick-26" transform="translate(9.5 8)"/>
+ </g>
+
+ <g transform="translate(0 177)">
+ <text font-size="6pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(22.5 0)">VCA</text>
+ <def id="VCA_PARAM" xlink:href="#knob26" transform="translate($width/2.0-13.0 8)"/>
+ <def xlink:href="#dial-mintick-26" transform="translate(9.5 8)"/>
+ </g>
+
+ <g transform="translate(0 225)">
+ <g class="io-group" transform="translate(5.5 0)">
+ <rect class="input-background-filler" width="34" height="10" transform="translate(0 63)"/>
+ <rect class="input-background" width="34" height="70" rx="5"/>
+ <def id="GATE_INPUT" xlink:href="#input" transform="translate(5 3)"/>
+ <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(17 35)">TRIG</text>
+ <def id="IN_INPUT" xlink:href="#input" transform="translate(5 38)"/>
+ <text class="input-label" font-size="5pt" letter-spacing="1.2px" text-anchor="middle" transform="translate(17 70)">IN</text>
+ </g>
+ <g class="io-group" transform="translate(5.5 76)">
+ <rect class="output-background-filler" width="34" height="10" transform="translate(0 -3)"/>
+ <rect class="output-background" width="34" height="35" rx="5"/>
+ <def id="OUT_OUTPUT" xlink:href="#output" transform="translate(5 0)"/>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(17 32)">OUT</text>
+ </g>
+ </g>
+</module>
diff --git a/res-src/LPG-src.svg b/res-src/LPG-src.svg
@@ -98,10 +98,11 @@
<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" width="30" height="37.5" rx="5" transform="translate(67 37.5)"/>
<rect class="output-background-filler" width="30" height="10" transform="translate(67 37.5)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(67 65)"/>
<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>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">TRIG</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)"/>
diff --git a/res/LLPG-dark.svg b/res/LLPG-dark.svg
Binary files differ.
diff --git a/res/LLPG-lowcontrast.svg b/res/LLPG-lowcontrast.svg
Binary files differ.
diff --git a/res/LLPG.svg b/res/LLPG.svg
Binary files differ.
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/LLPG.cpp b/src/LLPG.cpp
@@ -0,0 +1,142 @@
+
+#include "LLPG.hpp"
+
+void LLPG::Engine::reset() {
+ trigger.reset();
+}
+
+void LLPG::Engine::setSampleRate(float sr) {
+ finalHP.setParams(sr, MultimodeFilter::BUTTERWORTH_TYPE, 2, MultimodeFilter::HIGHPASS_MODE, 80.0f, MultimodeFilter::minQbw, MultimodeFilter::LINEAR_BANDWIDTH_MODE, MultimodeFilter::MINIMUM_DELAY_MODE);
+}
+
+void LLPG::reset() {
+ for (int c = 0; c < _channels; ++c) {
+ _engines[c]->reset();
+ }
+}
+
+void LLPG::sampleRateChange() {
+ _sampleRate = APP->engine->getSampleRate();
+ _sampleTime = APP->engine->getSampleTime();
+ for (int i = 0; i < _channels; ++i) {
+ _engines[i]->setSampleRate(_sampleRate);
+ }
+}
+
+bool LLPG::active() {
+ return outputs[OUT_OUTPUT].isConnected();
+}
+
+int LLPG::channels() {
+ return inputs[GATE_INPUT].getChannels();
+}
+
+void LLPG::addChannel(int c) {
+ _engines[c] = new Engine();
+ _engines[c]->reset();
+ _engines[c]->setSampleRate(_sampleRate);
+}
+
+void LLPG::removeChannel(int c) {
+ delete _engines[c];
+ _engines[c] = NULL;
+}
+
+void LLPG::modulateChannel(int c) {
+ _engines[c]->slew.modulate(
+ _sampleRate,
+ params[RESPONSE_PARAM],
+ NULL,
+ 300.0f,
+ params[SHAPE_PARAM],
+ params[RESPONSE_PARAM],
+ NULL,
+ 1000.0f,
+ params[SHAPE_PARAM],
+ c,
+ true
+ );
+}
+
+void LLPG::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);
+ time *= time;
+ 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 lpfBias = clamp(params[LPF_PARAM].getValue(), -1.0f, 1.0f);
+ lpfBias *= lpfBias;
+ float f = clamp(lpfBias + env, 0.0f, 1.0f);
+ f *= maxFilterCutoff;
+ f = std::max(f, MultimodeFilter4::minFrequency);
+ e.lpf.setParams(
+ _sampleRate,
+ MultimodeFilter::BUTTERWORTH_TYPE,
+ 2,
+ MultimodeFilter::LOWPASS_MODE,
+ f,
+ 0.0f
+ );
+
+ float vcaBias = clamp(params[VCA_PARAM].getValue(), 0.0f, 1.0f);
+ float level = clamp(vcaBias + env, 0.0f, 1.0f);
+
+ float out = inputs[IN_INPUT].getPolyVoltage(c);
+ out = e.finalHP.next(e.lpf.next(out));
+ e.vca.setLevel(Amplifier::minDecibels * (1.0f - level));
+ out = e.vca.next(out);
+ outputs[OUT_OUTPUT].setChannels(_channels);
+ outputs[OUT_OUTPUT].setVoltage(env * 10.0f, c);
+}
+
+struct LLPGWidget : BGModuleWidget {
+ static constexpr int hp = 3;
+
+ LLPGWidget(LLPG* module) {
+ setModule(module);
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+ setPanel(box.size, "LLPG");
+ createScrews();
+
+ // generated by svg_widgets.rb
+ auto responseParamPosition = Vec(8.0, 36.5);
+ auto shapeParamPosition = Vec(14.5, 82.0);
+ auto lpfParamPosition = Vec(9.5, 130.0);
+ auto vcaParamPosition = Vec(9.5, 185.0);
+
+ auto gateInputPosition = Vec(10.5, 228.0);
+ auto inInputPosition = Vec(10.5, 263.0);
+
+ auto outOutputPosition = Vec(10.5, 301.0);
+ // end generated by svg_widgets.rb
+
+ addParam(createParam<Knob26>(responseParamPosition, module, LLPG::RESPONSE_PARAM));
+ addParam(createParam<Knob16>(shapeParamPosition, module, LLPG::SHAPE_PARAM));
+ addParam(createParam<Knob26>(lpfParamPosition, module, LLPG::LPF_PARAM));
+ addParam(createParam<Knob26>(vcaParamPosition, module, LLPG::VCA_PARAM));
+
+ addInput(createInput<Port24>(gateInputPosition, module, LLPG::GATE_INPUT));
+ addInput(createInput<Port24>(inInputPosition, module, LLPG::IN_INPUT));
+
+ addOutput(createOutput<Port24>(outOutputPosition, module, LLPG::OUT_OUTPUT));
+ }
+};
+
+Model* modelLLPG = createModel<LLPG, LLPGWidget>("Bogaudio-LLPG", "LLPG", "Low-pass gate", "Low-pass gate", "Polyphonic");
diff --git a/src/LLPG.hpp b/src/LLPG.hpp
@@ -0,0 +1,67 @@
+#pragma once
+
+#include "lpg_common.hpp"
+#include "dsp/filters/multimode.hpp"
+
+extern Model* modelLLPG;
+
+namespace bogaudio {
+
+struct LLPG : BGModule {
+ enum ParamsIds {
+ RESPONSE_PARAM,
+ SHAPE_PARAM,
+ LPF_PARAM,
+ VCA_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ GATE_INPUT,
+ IN_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ static constexpr float maxFilterCutoff = 20000.0f;
+
+ struct Engine {
+ Trigger trigger;
+ float gateSeconds = 0.0f;
+ float gateElapsedSeconds = 0.0f;
+ RiseFallShapedSlewLimiter slew;
+ MultimodeFilter4 lpf;
+ MultimodeFilter4 finalHP;
+ Amplifier vca;
+
+ void reset();
+ void setSampleRate(float sr);
+ };
+
+ Engine* _engines[maxChannels] {};
+ float _sampleRate = 0.0f;
+ float _sampleTime = 0.0f;
+
+ LLPG() {
+ config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ configParam(RESPONSE_PARAM, 0.0f, 1.0f, 0.2f, "Response", "%", 0.0f, 100.0f);
+ configParam(SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Shape");
+ configParam<ScaledSquaringParamQuantity<(int)maxFilterCutoff>>(LPF_PARAM, 0.0f, 1.0f, 0.0f, "LPF cutoff", " HZ");
+ configParam(VCA_PARAM, 0.0f, 1.0f, 0.0f, "VCA level", "%", 0.0f, 100.0f);
+ }
+
+ void reset() override;
+ void sampleRateChange() 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/LPG.cpp b/src/LPG.cpp
@@ -5,7 +5,6 @@
void LPG::Engine::reset() {
trigger.reset();
- gatePulseGen.process(10.0);
}
void LPG::Engine::setSampleRate(float sr) {
@@ -62,11 +61,11 @@ void LPG::modulateChannel(int c) {
_engines[c]->slew.modulate(
_sampleRate,
params[RESPONSE_PARAM],
- inputs[RESPONSE_INPUT],
+ &inputs[RESPONSE_INPUT],
300.0f * _timeScale,
params[RISE_SHAPE_PARAM],
params[RESPONSE_PARAM],
- inputs[RESPONSE_INPUT],
+ &inputs[RESPONSE_INPUT],
1000.0f * _timeScale,
params[FALL_SHAPE_PARAM],
c
diff --git a/src/LPG.hpp b/src/LPG.hpp
@@ -39,7 +39,6 @@ struct LPG : LPGEnvBaseModule {
struct Engine {
Trigger trigger;
- rack::dsp::PulseGenerator gatePulseGen;
float gateSeconds = 0.0f;
float gateElapsedSeconds = 0.0f;
RiseFallShapedSlewLimiter slew;
diff --git a/src/MegaGate.cpp b/src/MegaGate.cpp
@@ -53,11 +53,11 @@ void MegaGate::modulateChannel(int c) {
_engines[c]->slew.modulate(
_sampleRate,
params[RISE_PARAM],
- inputs[RISE_INPUT],
+ &inputs[RISE_INPUT],
300.0f * _timeScale,
params[RISE_SHAPE_PARAM],
params[FALL_PARAM],
- inputs[FALL_INPUT],
+ &inputs[FALL_INPUT],
1000.0f * _timeScale,
params[FALL_SHAPE_PARAM],
c
diff --git a/src/Slew.cpp b/src/Slew.cpp
@@ -13,11 +13,11 @@ void Slew::modulateChannel(int c) {
_slew[c].modulate(
APP->engine->getSampleRate(),
params[RISE_PARAM],
- inputs[RISE_INPUT],
+ &inputs[RISE_INPUT],
10000.0f,
params[RISE_SHAPE_PARAM],
params[FALL_PARAM],
- inputs[FALL_INPUT],
+ &inputs[FALL_INPUT],
10000.0f,
params[FALL_SHAPE_PARAM],
c
diff --git a/src/Vish.cpp b/src/Vish.cpp
@@ -47,11 +47,11 @@ void Vish::modulateChannel(int c) {
_engines[c]->slew.modulate(
_sampleRate,
params[RISE_PARAM],
- inputs[RISE_INPUT],
+ &inputs[RISE_INPUT],
300.0f * _timeScale,
params[RISE_SHAPE_PARAM],
params[FALL_PARAM],
- inputs[FALL_INPUT],
+ &inputs[FALL_INPUT],
1000.0f * _timeScale,
params[FALL_SHAPE_PARAM],
c
diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp
@@ -37,6 +37,7 @@
#include "Lag.hpp"
#include "LFO.hpp"
#include "LLFO.hpp"
+#include "LLPG.hpp"
#include "Lmtr.hpp"
#include "LPG.hpp"
#include "LVCF.hpp"
@@ -111,6 +112,7 @@
#include "TestExpander.hpp"
#include "TestVCF.hpp"
+#include "LLPG.hpp"
//NEW_INCLUDES_HERE
Plugin *pluginInstance;
@@ -137,6 +139,7 @@ void init(rack::Plugin *p) {
p->addModel(modelEQ);
p->addModel(modelEQS);
p->addModel(modelLPG);
+ p->addModel(modelLLPG);
p->addModel(modelMegaGate);
p->addModel(modelPEQ);
p->addModel(modelPEQ6);
diff --git a/src/lpg_common.cpp b/src/lpg_common.cpp
@@ -17,7 +17,7 @@ void LPGEnvBaseModule::fromJson(json_t* root) {
void LPGEnvBaseModule::modulate() {
_gateToTrigger = _gateToTriggerParamID >= 0 && params[_gateToTriggerParamID].getValue() > 0.5f;
- _timeScale = params[_timeScaleParamID].getValue() > 0.5f ? _longTimeScale : 1.0f;
+ _timeScale = _timeScaleParamID >= 0 && params[_timeScaleParamID].getValue() > 0.5f ? _longTimeScale : 1.0f;
}
diff --git a/src/lpg_common.hpp b/src/lpg_common.hpp
@@ -11,7 +11,7 @@ struct LPGEnvBaseModule : BGModule {
const float _maxVelocityDb = 0.0f;
float _minVelocityDb = -6.0f;
- LPGEnvBaseModule(int gateToTriggerParamID, int timeScaleParamID, float longTimeScale = 10.0f)
+ LPGEnvBaseModule(int gateToTriggerParamID = -1, int timeScaleParamID = -1, float longTimeScale = 10.0f)
: _gateToTriggerParamID(gateToTriggerParamID)
, _timeScaleParamID(timeScaleParamID)
, _longTimeScale(longTimeScale)
diff --git a/src/slew_common.cpp b/src/slew_common.cpp
@@ -1,16 +1,19 @@
#include "slew_common.hpp"
-float RiseFallShapedSlewLimiter::timeMS(Param& param, Input& input, float maxMS, int c) {
+float RiseFallShapedSlewLimiter::timeMS(Param& param, Input* input, float maxMS, int c) {
float time = clamp(param.getValue(), 0.0f, 1.0f);
- if (input.isConnected()) {
- time *= clamp(input.getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
+ if (input && input->isConnected()) {
+ time *= clamp(input->getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
}
return time * time * maxMS;
}
-float RiseFallShapedSlewLimiter::shape(Param& param) {
+float RiseFallShapedSlewLimiter::shape(Param& param, bool invert) {
float shape = clamp(param.getValue(), -1.0f, 1.0f);
+ if (invert) {
+ shape *= -1.0f;
+ }
if (shape < 0.0) {
shape = 1.0f + shape;
shape = _rise.minShape + shape * (1.0f - _rise.minShape);
@@ -24,19 +27,20 @@ float RiseFallShapedSlewLimiter::shape(Param& param) {
void RiseFallShapedSlewLimiter::modulate(
float sampleRate,
Param& riseParam,
- Input& riseInput,
+ Input* riseInput,
float riseMaxMS,
Param& riseShapeParam,
Param& fallParam,
- Input& fallInput,
+ Input* fallInput,
float fallMaxMS,
Param& fallShapeParam,
- int c
+ int c,
+ bool invertRiseShape
) {
_rise.setParams(
sampleRate,
timeMS(riseParam, riseInput, riseMaxMS, c),
- shape(riseShapeParam)
+ shape(riseShapeParam, invertRiseShape)
);
_fall.setParams(
sampleRate,
diff --git a/src/slew_common.hpp b/src/slew_common.hpp
@@ -11,19 +11,20 @@ struct RiseFallShapedSlewLimiter {
ShapedSlewLimiter _rise;
ShapedSlewLimiter _fall;
- float timeMS(Param& param, Input& input, float maxMS, int c);
- float shape(Param& param);
+ float timeMS(Param& param, Input* input, float maxMS, int c);
+ float shape(Param& param, bool invert = false);
void modulate(
float sampleRate,
Param& riseParam,
- Input& riseInput,
+ Input* riseInput,
float riseMaxMS,
Param& riseShapeParam,
Param& fallParam,
- Input& fallInput,
+ Input* fallInput,
float fallMaxMS,
Param& fallShapeParam,
- int c
+ int c,
+ bool invertRiseShape = false
);
float next(float sample);
};