BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit ecff5b2c3514024bb31aa4b2e6cfb29dbf264e2b
parent 9a8d769611d7128a33a7f08ce71bcd37ed8692be
Author: Matt Demanett <matt@demanett.net>
Date:   Tue,  8 Sep 2020 23:16:44 -0400

LLPG: mini LPG.

Diffstat:
Mplugin.json | 10++++++++++
Ares-pp/LLPG-dark-pp.svg | 332+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares-pp/LLPG-lowcontrast-pp.svg | 332+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares-pp/LLPG-pp.svg | 268+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mres-pp/LPG-dark-pp.svg | 5+++--
Mres-pp/LPG-lowcontrast-pp.svg | 5+++--
Mres-pp/LPG-pp.svg | 5+++--
Ares-src/LLPG-src.svg | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mres-src/LPG-src.svg | 5+++--
Ares/LLPG-dark.svg | 0
Ares/LLPG-lowcontrast.svg | 0
Ares/LLPG.svg | 0
Mres/LPG-dark.svg | 0
Mres/LPG-lowcontrast.svg | 0
Mres/LPG.svg | 0
Asrc/LLPG.cpp | 142+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/LLPG.hpp | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/LPG.cpp | 5++---
Msrc/LPG.hpp | 1-
Msrc/MegaGate.cpp | 4++--
Msrc/Slew.cpp | 4++--
Msrc/Vish.cpp | 4++--
Msrc/bogaudio.cpp | 3+++
Msrc/lpg_common.cpp | 2+-
Msrc/lpg_common.hpp | 2+-
Msrc/slew_common.cpp | 20++++++++++++--------
Msrc/slew_common.hpp | 11++++++-----
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); };