BogaudioModules

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

commit 55160dcfe3756175275dfeb64ccbac891de89657
parent 962bb0429d7bf7943cfa569ecd11c19d728c64d6
Author: Matt Demanett <matt@demanett.net>
Date:   Mon, 14 Sep 2020 23:24:00 -0400

VISH: drop VELO input, add SHAPE.  MEGAGATE: add shape.

Diffstat:
Mres-pp/MegaGate-dark-pp.svg | 18+++++++++++++-----
Mres-pp/MegaGate-lowcontrast-pp.svg | 18+++++++++++++-----
Mres-pp/MegaGate-pp.svg | 18+++++++++++++-----
Mres-pp/Vish-dark-pp.svg | 16++++++++--------
Mres-pp/Vish-lowcontrast-pp.svg | 16++++++++--------
Mres-pp/Vish-pp.svg | 16++++++++--------
Mres-src/MegaGate-src.svg | 13++++++++-----
Mres-src/Vish-src.svg | 16++++++++--------
Mres/MegaGate-dark.svg | 0
Mres/MegaGate-lowcontrast.svg | 0
Mres/MegaGate.svg | 0
Mres/Vish-dark.svg | 0
Mres/Vish-lowcontrast.svg | 0
Mres/Vish.svg | 0
Msrc/MegaGate.cpp | 43+++++++++++++++++++++++++++++++++++++++----
Msrc/MegaGate.hpp | 7++++++-
Msrc/Vish.cpp | 35++++++++++++-----------------------
Msrc/Vish.hpp | 7++-----
Msrc/lpg_common.cpp | 108++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Msrc/lpg_common.hpp | 4++--
Msrc/slew_common.cpp | 26++++++++++++++++++--------
Msrc/slew_common.hpp | 15++++++++++++---
22 files changed, 266 insertions(+), 110 deletions(-)

diff --git a/res-pp/MegaGate-dark-pp.svg b/res-pp/MegaGate-dark-pp.svg @@ -449,23 +449,23 @@ polyline.knob-tick { </g> <g class="io-group" transform="translate(8 284)"> - <rect class="input-background" width="120" height="37.5" rx="5" transform="translate(7 0)"/> + <rect class="input-background" width="120" height="76.5" rx="5" transform="translate(7 0)"/> <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)"/> - <g transform="translate(10.5 3)"><svg id="GATE_INPUT"> + <g transform="translate(10.5 3)"><svg id="VELOCITY_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">GATE</text> - <g transform="translate(40.5 3)"><svg id="VELOCITY_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">VELO</text> + <g transform="translate(40.5 3)"><svg id="SHAPE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">VELO</text> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 35)">SHAPE</text> <g transform="translate(70.5 3)"><svg id="LEFT_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> @@ -480,10 +480,18 @@ polyline.knob-tick { </g> </svg></g> <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(112.5 35)">R(L)</text> + <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="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text> <g transform="translate(30, 0)"> <rect class="output-background" width="90" height="39" rx="5" transform="translate(7 37.5)"/> <rect class="output-background-filler" width="90" height="10" transform="translate(7 37.5)"/> + <rect class="output-background-filler" width="10" height="10" transform="translate(7 66.5)"/> <g transform="translate(10.5 40)"><svg id="ENV_OUTPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00"/> diff --git a/res-pp/MegaGate-lowcontrast-pp.svg b/res-pp/MegaGate-lowcontrast-pp.svg @@ -449,23 +449,23 @@ polyline.knob-tick { </g> <g class="io-group" transform="translate(8 284)"> - <rect class="input-background" width="120" height="37.5" rx="5" transform="translate(7 0)"/> + <rect class="input-background" width="120" height="76.5" rx="5" transform="translate(7 0)"/> <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)"/> - <g transform="translate(10.5 3)"><svg id="GATE_INPUT"> + <g transform="translate(10.5 3)"><svg id="VELOCITY_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">GATE</text> - <g transform="translate(40.5 3)"><svg id="VELOCITY_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">VELO</text> + <g transform="translate(40.5 3)"><svg id="SHAPE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">VELO</text> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 35)">SHAPE</text> <g transform="translate(70.5 3)"><svg id="LEFT_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> @@ -480,10 +480,18 @@ polyline.knob-tick { </g> </svg></g> <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(112.5 35)">R(L)</text> + <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="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text> <g transform="translate(30, 0)"> <rect class="output-background" width="90" height="39" rx="5" transform="translate(7 37.5)"/> <rect class="output-background-filler" width="90" height="10" transform="translate(7 37.5)"/> + <rect class="output-background-filler" width="10" height="10" transform="translate(7 66.5)"/> <g transform="translate(10.5 40)"><svg id="ENV_OUTPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00"/> diff --git a/res-pp/MegaGate-pp.svg b/res-pp/MegaGate-pp.svg @@ -385,23 +385,23 @@ polyline.knob-tick { </g> <g class="io-group" transform="translate(8 284)"> - <rect class="input-background" width="120" height="37.5" rx="5" transform="translate(7 0)"/> + <rect class="input-background" width="120" height="76.5" rx="5" transform="translate(7 0)"/> <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)"/> - <g transform="translate(10.5 3)"><svg id="GATE_INPUT"> + <g transform="translate(10.5 3)"><svg id="VELOCITY_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">GATE</text> - <g transform="translate(40.5 3)"><svg id="VELOCITY_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">VELO</text> + <g transform="translate(40.5 3)"><svg id="SHAPE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">VELO</text> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 35)">SHAPE</text> <g transform="translate(70.5 3)"><svg id="LEFT_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> @@ -416,10 +416,18 @@ polyline.knob-tick { </g> </svg></g> <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(112.5 35)">R(L)</text> + <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="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text> <g transform="translate(30, 0)"> <rect class="output-background" width="90" height="39" rx="5" transform="translate(7 37.5)"/> <rect class="output-background-filler" width="90" height="10" transform="translate(7 37.5)"/> + <rect class="output-background-filler" width="10" height="10" transform="translate(7 66.5)"/> <g transform="translate(10.5 40)"><svg id="ENV_OUTPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00"/> diff --git a/res-pp/Vish-dark-pp.svg b/res-pp/Vish-dark-pp.svg @@ -312,34 +312,34 @@ polyline.knob-tick { <g transform="translate(0 248)"> <rect class="input-background" width="64" height="112" rx="5" transform="translate(5.5 0)"/> - <g transform="translate(10.5 3)"><svg id="MINIMUM_GATE_INPUT"> + <g transform="translate(10.5 3)"><svg id="RISE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">MIN</text> - <g transform="translate(40.5 3)"><svg id="RISE_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RISE</text> + <g transform="translate(40.5 3)"><svg id="MINIMUM_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(52.5 35)">RISE</text> - <g transform="translate(10.5 40)"><svg id="VELOCITY_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">MIN</text> + <g transform="translate(10.5 40)"><svg id="FALL_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">VELO</text> - <g transform="translate(40.5 40)"><svg id="FALL_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">FALL</text> + <g transform="translate(40.5 40)"><svg id="SHAPE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">FALL</text> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 72)">SHAPE</text> <g transform="translate(10.5 77)"><svg id="GATE_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/Vish-lowcontrast-pp.svg b/res-pp/Vish-lowcontrast-pp.svg @@ -312,34 +312,34 @@ polyline.knob-tick { <g transform="translate(0 248)"> <rect class="input-background" width="64" height="112" rx="5" transform="translate(5.5 0)"/> - <g transform="translate(10.5 3)"><svg id="MINIMUM_GATE_INPUT"> + <g transform="translate(10.5 3)"><svg id="RISE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">MIN</text> - <g transform="translate(40.5 3)"><svg id="RISE_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RISE</text> + <g transform="translate(40.5 3)"><svg id="MINIMUM_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(52.5 35)">RISE</text> - <g transform="translate(10.5 40)"><svg id="VELOCITY_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">MIN</text> + <g transform="translate(10.5 40)"><svg id="FALL_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">VELO</text> - <g transform="translate(40.5 40)"><svg id="FALL_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">FALL</text> + <g transform="translate(40.5 40)"><svg id="SHAPE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">FALL</text> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 72)">SHAPE</text> <g transform="translate(10.5 77)"><svg id="GATE_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/Vish-pp.svg b/res-pp/Vish-pp.svg @@ -248,34 +248,34 @@ polyline.knob-tick { <g transform="translate(0 248)"> <rect class="input-background" width="64" height="112" rx="5" transform="translate(5.5 0)"/> - <g transform="translate(10.5 3)"><svg id="MINIMUM_GATE_INPUT"> + <g transform="translate(10.5 3)"><svg id="RISE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">MIN</text> - <g transform="translate(40.5 3)"><svg id="RISE_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RISE</text> + <g transform="translate(40.5 3)"><svg id="MINIMUM_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(52.5 35)">RISE</text> - <g transform="translate(10.5 40)"><svg id="VELOCITY_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">MIN</text> + <g transform="translate(10.5 40)"><svg id="FALL_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">VELO</text> - <g transform="translate(40.5 40)"><svg id="FALL_INPUT"> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">FALL</text> + <g transform="translate(40.5 40)"><svg id="SHAPE_INPUT"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/> <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/> </g> </svg></g> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">FALL</text> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 72)">SHAPE</text> <g transform="translate(10.5 77)"><svg id="GATE_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/MegaGate-src.svg b/res-src/MegaGate-src.svg @@ -117,21 +117,24 @@ </g> <g class="io-group" transform="translate(8 284)"> - <rect class="input-background" width="120" height="37.5" rx="5" transform="translate(7 0)" /> + <rect class="input-background" width="120" height="76.5" rx="5" transform="translate(7 0)" /> <rect class="input-background-filler" width="10" height="10" transform="translate(117 27.5)" /> - <def id="GATE_INPUT" xlink:href="#input" transform="translate(10.5 3)"/> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">GATE</text> - <def id="VELOCITY_INPUT" xlink:href="#input" transform="translate(40.5 3)"/> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">VELO</text> + <def id="VELOCITY_INPUT" xlink:href="#input" transform="translate(10.5 3)"/> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">VELO</text> + <def id="SHAPE_INPUT" xlink:href="#input" transform="translate(40.5 3)"/> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 35)">SHAPE</text> <def id="LEFT_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)">L</text> <def id="RIGHT_INPUT" xlink:href="#input" transform="translate(100.5 3)"/> <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(112.5 35)">R(L)</text> + <def id="GATE_INPUT" xlink:href="#input" transform="translate(10.5 40)"/> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">GATE</text> <g transform="translate(30, 0)"> <rect class="output-background" width="90" height="39" rx="5" transform="translate(7 37.5)"/> <rect class="output-background-filler" width="90" height="10" transform="translate(7 37.5)"/> + <rect class="output-background-filler" width="10" height="10" transform="translate(7 66.5)"/> <def id="ENV_OUTPUT" xlink:href="#output" transform="translate(10.5 40)"/> <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">ENV</text> <def id="LEFT_OUTPUT" xlink:href="#output" transform="translate(40.5 40)"/> diff --git a/res-src/Vish-src.svg b/res-src/Vish-src.svg @@ -39,14 +39,14 @@ <g transform="translate(0 248)"> <rect class="input-background" width="64" height="112" rx="5" transform="translate(5.5 0)"/> - <def id="MINIMUM_GATE_INPUT" xlink:href="#input" transform="translate(10.5 3)"/> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">MIN</text> - <def id="RISE_INPUT" xlink:href="#input" transform="translate(40.5 3)"/> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">RISE</text> - <def id="VELOCITY_INPUT" xlink:href="#input" transform="translate(10.5 40)"/> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">VELO</text> - <def id="FALL_INPUT" xlink:href="#input" transform="translate(40.5 40)"/> - <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 72)">FALL</text> + <def id="RISE_INPUT" xlink:href="#input" transform="translate(10.5 3)"/> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 35)">RISE</text> + <def id="MINIMUM_GATE_INPUT" xlink:href="#input" transform="translate(40.5 3)"/> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(52.5 35)">MIN</text> + <def id="FALL_INPUT" xlink:href="#input" transform="translate(10.5 40)"/> + <text class="input-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 72)">FALL</text> + <def id="SHAPE_INPUT" xlink:href="#input" transform="translate(40.5 40)"/> + <text class="input-label" font-size="5pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(52.5 72)">SHAPE</text> <def id="GATE_INPUT" xlink:href="#input" transform="translate(10.5 77)"/> <text class="input-label" font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(22.5 109)">GATE</text> <g class="io-group" transform="translate(30 72)"> diff --git a/res/MegaGate-dark.svg b/res/MegaGate-dark.svg Binary files differ. diff --git a/res/MegaGate-lowcontrast.svg b/res/MegaGate-lowcontrast.svg Binary files differ. diff --git a/res/MegaGate.svg b/res/MegaGate.svg Binary files differ. diff --git a/res/Vish-dark.svg b/res/Vish-dark.svg Binary files differ. diff --git a/res/Vish-lowcontrast.svg b/res/Vish-lowcontrast.svg Binary files differ. diff --git a/res/Vish.svg b/res/Vish.svg Binary files differ. diff --git a/src/MegaGate.cpp b/src/MegaGate.cpp @@ -2,6 +2,8 @@ #include "MegaGate.hpp" #include "dsp/pitch.hpp" +#define VELOCITY_MINIMUM_DECIBELS "velocity_minimum_decibels" + void MegaGate::Engine::reset() { trigger.reset(); gatePulseGen.process(10.0); @@ -30,6 +32,20 @@ void MegaGate::sampleRateChange() { } } +json_t* MegaGate::toJson(json_t* root) { + root = LPGEnvBaseModule::toJson(root); + json_object_set_new(root, VELOCITY_MINIMUM_DECIBELS, json_real(_minVelocityDb)); + return root; +} + +void MegaGate::fromJson(json_t* root) { + LPGEnvBaseModule::fromJson(root); + json_t* mdb = json_object_get(root, VELOCITY_MINIMUM_DECIBELS); + if (mdb) { + _minVelocityDb = json_real_value(mdb); + } +} + bool MegaGate::active() { return outputs[LEFT_OUTPUT].isConnected() || outputs[RIGHT_OUTPUT].isConnected() || outputs[ENV_OUTPUT].isConnected(); } @@ -60,7 +76,11 @@ void MegaGate::modulateChannel(int c) { &inputs[FALL_INPUT], 1000.0f * _timeScale, params[FALL_SHAPE_PARAM], - c + c, + false, + &inputs[SHAPE_INPUT], + _riseShapeMode, + _fallShapeMode ); } @@ -329,10 +349,11 @@ struct MegaGateWidget : LPGEnvBaseWidget { auto fallInputPosition = Vec(75.5, 118.0); auto minimumGateInputPosition = Vec(20.5, 220.0); auto tiltInputPosition = Vec(75.5, 220.0); - auto gateInputPosition = Vec(8.5, 287.0); - auto velocityInputPosition = Vec(38.5, 287.0); + auto velocityInputPosition = Vec(8.5, 287.0); + auto shapeInputPosition = Vec(38.5, 287.0); auto leftInputPosition = Vec(68.5, 287.0); auto rightInputPosition = Vec(98.5, 287.0); + auto gateInputPosition = Vec(8.5, 324.0); auto lpfEnvInputPosition = Vec(139.0, 106.0); auto lpfBiasInputPosition = Vec(189.0, 106.0); auto hpfEnvInputPosition = Vec(139.0, 221.0); @@ -383,10 +404,11 @@ struct MegaGateWidget : LPGEnvBaseWidget { addInput(createInput<Port24>(fallInputPosition, module, MegaGate::FALL_INPUT)); addInput(createInput<Port24>(minimumGateInputPosition, module, MegaGate::MINIMUM_GATE_INPUT)); addInput(createInput<Port24>(tiltInputPosition, module, MegaGate::TILT_INPUT)); - addInput(createInput<Port24>(gateInputPosition, module, MegaGate::GATE_INPUT)); addInput(createInput<Port24>(velocityInputPosition, module, MegaGate::VELOCITY_INPUT)); + addInput(createInput<Port24>(shapeInputPosition, module, MegaGate::SHAPE_INPUT)); addInput(createInput<Port24>(leftInputPosition, module, MegaGate::LEFT_INPUT)); addInput(createInput<Port24>(rightInputPosition, module, MegaGate::RIGHT_INPUT)); + addInput(createInput<Port24>(gateInputPosition, module, MegaGate::GATE_INPUT)); addInput(createInput<Port24>(lpfEnvInputPosition, module, MegaGate::LPF_ENV_INPUT)); addInput(createInput<Port24>(lpfBiasInputPosition, module, MegaGate::LPF_BIAS_INPUT)); addInput(createInput<Port24>(hpfEnvInputPosition, module, MegaGate::HPF_ENV_INPUT)); @@ -407,6 +429,19 @@ struct MegaGateWidget : LPGEnvBaseWidget { addChild(createLight<SmallLight<GreenLight>>(hpfPoles3LightPosition, module, MegaGate::HPF_POLES_3_LIGHT)); addChild(createLight<SmallLight<GreenLight>>(hpfPoles4LightPosition, module, MegaGate::HPF_POLES_4_LIGHT)); } + + void contextMenu(Menu* menu) { + LPGEnvBaseWidget::contextMenu(menu); + auto m = dynamic_cast<MegaGate*>(module); + assert(m); + OptionsMenuItem* mi = new OptionsMenuItem("Minimum velocity output gain"); + mi->addItem(OptionMenuItem("-3db", [m]() { return m->_minVelocityDb == -3.0f; }, [m]() { m->_minVelocityDb = -3.0f; })); + mi->addItem(OptionMenuItem("-6db", [m]() { return m->_minVelocityDb == -6.0f; }, [m]() { m->_minVelocityDb = -6.0f; })); + mi->addItem(OptionMenuItem("-12db", [m]() { return m->_minVelocityDb == -12.0f; }, [m]() { m->_minVelocityDb = -12.0f; })); + mi->addItem(OptionMenuItem("-24db", [m]() { return m->_minVelocityDb == -24.0f; }, [m]() { m->_minVelocityDb = -24.0f; })); + mi->addItem(OptionMenuItem("-60db", [m]() { return m->_minVelocityDb == -60.0f; }, [m]() { m->_minVelocityDb = -60.0f; })); + OptionsMenuItem::addToMenu(mi, menu); + } }; Model* modelMegaGate = createModel<MegaGate, MegaGateWidget>("Bogaudio-MegaGate", "MEGAGATE", "Low- and high-pass gate", "Low-pass gate", "Dual", "Polyphonic"); diff --git a/src/MegaGate.hpp b/src/MegaGate.hpp @@ -41,10 +41,11 @@ struct MegaGate : LPGEnvBaseModule { FALL_INPUT, MINIMUM_GATE_INPUT, TILT_INPUT, - GATE_INPUT, VELOCITY_INPUT, + SHAPE_INPUT, LEFT_INPUT, RIGHT_INPUT, + GATE_INPUT, LPF_ENV_INPUT, LPF_BIAS_INPUT, HPF_ENV_INPUT, @@ -97,6 +98,8 @@ struct MegaGate : LPGEnvBaseModule { Engine* _engines[maxChannels] {}; float _sampleRate = 0.0f; float _sampleTime = 0.0f; + const float _maxVelocityDb = 0.0f; + float _minVelocityDb = -6.0f; MegaGate() : LPGEnvBaseModule(GATE_TO_TRIGGER_PARAM, TIMES_10X_PARAM) @@ -130,6 +133,8 @@ struct MegaGate : LPGEnvBaseModule { void reset() override; void sampleRateChange() override; + json_t* toJson(json_t* root) override; + void fromJson(json_t* root) override; bool active() override; int channels() override; void addChannel(int c) override; diff --git a/src/Vish.cpp b/src/Vish.cpp @@ -6,10 +6,6 @@ void Vish::Engine::reset() { gatePulseGen.process(10.0); } -void Vish::Engine::setSampleRate(float sr) { - velocitySL.setParams(sr, 5.0f, 1.0f); -} - void Vish::reset() { for (int c = 0; c < _channels; ++c) { _engines[c]->reset(); @@ -19,9 +15,6 @@ void Vish::reset() { void Vish::sampleRateChange() { _sampleRate = APP->engine->getSampleRate(); _sampleTime = APP->engine->getSampleTime(); - for (int i = 0; i < _channels; ++i) { - _engines[i]->setSampleRate(_sampleRate); - } } bool Vish::active() { @@ -35,7 +28,6 @@ int Vish::channels() { void Vish::addChannel(int c) { _engines[c] = new Engine(); _engines[c]->reset(); - _engines[c]->setSampleRate(_sampleRate); } void Vish::removeChannel(int c) { @@ -54,7 +46,11 @@ void Vish::modulateChannel(int c) { &inputs[FALL_INPUT], 1000.0f * _timeScale, params[FALL_SHAPE_PARAM], - c + c, + false, + &inputs[SHAPE_INPUT], + _riseShapeMode, + _fallShapeMode ); } @@ -91,15 +87,8 @@ void Vish::processChannel(const ProcessArgs& args, int c) { gate = in; } - float velocity = 1.0f; - if (inputs[VELOCITY_INPUT].isConnected()) { - velocity = clamp(inputs[VELOCITY_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); - } - velocity = e.velocitySL.next(velocity); - e.velocityAmp.setLevel(_minVelocityDb + velocity * (_maxVelocityDb - _minVelocityDb)); - outputs[OUT_OUTPUT].setChannels(_channels); - outputs[OUT_OUTPUT].setVoltage(e.velocityAmp.next(e.slew.next(gate)), c); + outputs[OUT_OUTPUT].setVoltage(e.slew.next(gate), c); } struct VishWidget : LPGEnvBaseWidget { @@ -120,10 +109,10 @@ struct VishWidget : LPGEnvBaseWidget { auto gateToTriggerParamPosition = Vec(57.0, 220.0); auto times10xParamPosition = Vec(55.0, 234.0); - auto minimumGateInputPosition = Vec(10.5, 251.0); - auto riseInputPosition = Vec(40.5, 251.0); - auto velocityInputPosition = Vec(10.5, 288.0); - auto fallInputPosition = Vec(40.5, 288.0); + auto riseInputPosition = Vec(10.5, 251.0); + auto minimumGateInputPosition = Vec(40.5, 251.0); + auto fallInputPosition = Vec(10.5, 288.0); + auto shapeInputPosition = Vec(40.5, 288.0); auto gateInputPosition = Vec(10.5, 325.0); auto outOutputPosition = Vec(40.5, 325.0); @@ -137,10 +126,10 @@ struct VishWidget : LPGEnvBaseWidget { addParam(createParam<IndicatorButtonGreen9>(gateToTriggerParamPosition, module, Vish::GATE_TO_TRIGGER_PARAM)); addParam(createParam<IndicatorButtonGreen9>(times10xParamPosition, module, Vish::TIMES_10X_PARAM)); - addInput(createInput<Port24>(minimumGateInputPosition, module, Vish::MINIMUM_GATE_INPUT)); addInput(createInput<Port24>(riseInputPosition, module, Vish::RISE_INPUT)); - addInput(createInput<Port24>(velocityInputPosition, module, Vish::VELOCITY_INPUT)); + addInput(createInput<Port24>(minimumGateInputPosition, module, Vish::MINIMUM_GATE_INPUT)); addInput(createInput<Port24>(fallInputPosition, module, Vish::FALL_INPUT)); + addInput(createInput<Port24>(shapeInputPosition, module, Vish::SHAPE_INPUT)); addInput(createInput<Port24>(gateInputPosition, module, Vish::GATE_INPUT)); addOutput(createOutput<Port24>(outOutputPosition, module, Vish::OUT_OUTPUT)); diff --git a/src/Vish.hpp b/src/Vish.hpp @@ -19,10 +19,10 @@ struct Vish : LPGEnvBaseModule { }; enum InputsIds { - MINIMUM_GATE_INPUT, RISE_INPUT, - VELOCITY_INPUT, + MINIMUM_GATE_INPUT, FALL_INPUT, + SHAPE_INPUT, GATE_INPUT, NUM_INPUTS }; @@ -38,11 +38,8 @@ struct Vish : LPGEnvBaseModule { float gateSeconds = 0.0f; float gateElapsedSeconds = 0.0f; RiseFallShapedSlewLimiter slew; - Amplifier velocityAmp; - bogaudio::dsp::SlewLimiter velocitySL; void reset(); - void setSampleRate(float sr); }; Engine* _engines[maxChannels] {}; diff --git a/src/lpg_common.cpp b/src/lpg_common.cpp @@ -1,17 +1,72 @@ #include "lpg_common.hpp" -#define VELOCITY_MINIMUM_DECIBELS "velocity_minimum_decibels" +#define RISE_SHAPE_MODE "rise_shape_mode" +#define FALL_SHAPE_MODE "fall_shape_mode" +#define SHAPE_MODE_OFF "off" +#define SHAPE_MODE_ON "on" +#define SHAPE_MODE_INVERTED "inverted" json_t* LPGEnvBaseModule::toJson(json_t* root) { - json_object_set_new(root, VELOCITY_MINIMUM_DECIBELS, json_real(_minVelocityDb)); + switch (_riseShapeMode) { + case RiseFallShapedSlewLimiter::OFF_SCVM: { + json_object_set_new(root, RISE_SHAPE_MODE, json_string(SHAPE_MODE_OFF)); + break; + } + case RiseFallShapedSlewLimiter::ON_SCVM: { + json_object_set_new(root, RISE_SHAPE_MODE, json_string(SHAPE_MODE_ON)); + break; + } + case RiseFallShapedSlewLimiter::INVERTED_SCVM: { + json_object_set_new(root, RISE_SHAPE_MODE, json_string(SHAPE_MODE_INVERTED)); + break; + } + default:; + } + switch (_fallShapeMode) { + case RiseFallShapedSlewLimiter::OFF_SCVM: { + json_object_set_new(root, FALL_SHAPE_MODE, json_string(SHAPE_MODE_OFF)); + break; + } + case RiseFallShapedSlewLimiter::ON_SCVM: { + json_object_set_new(root, FALL_SHAPE_MODE, json_string(SHAPE_MODE_ON)); + break; + } + case RiseFallShapedSlewLimiter::INVERTED_SCVM: { + json_object_set_new(root, FALL_SHAPE_MODE, json_string(SHAPE_MODE_INVERTED)); + break; + } + default:; + } return root; } void LPGEnvBaseModule::fromJson(json_t* root) { - json_t* mdb = json_object_get(root, VELOCITY_MINIMUM_DECIBELS); - if (mdb) { - _minVelocityDb = json_real_value(mdb); + json_t* rsm = json_object_get(root, RISE_SHAPE_MODE); + if (rsm) { + std::string s = json_string_value(rsm); + if (s == SHAPE_MODE_OFF) { + _riseShapeMode = RiseFallShapedSlewLimiter::OFF_SCVM; + } + else if (s == SHAPE_MODE_ON) { + _riseShapeMode = RiseFallShapedSlewLimiter::ON_SCVM; + } + else if (s == SHAPE_MODE_INVERTED) { + _riseShapeMode = RiseFallShapedSlewLimiter::INVERTED_SCVM; + } + } + json_t* fsm = json_object_get(root, FALL_SHAPE_MODE); + if (fsm) { + std::string s = json_string_value(fsm); + if (s == SHAPE_MODE_OFF) { + _fallShapeMode = RiseFallShapedSlewLimiter::OFF_SCVM; + } + else if (s == SHAPE_MODE_ON) { + _fallShapeMode = RiseFallShapedSlewLimiter::ON_SCVM; + } + else if (s == SHAPE_MODE_INVERTED) { + _fallShapeMode = RiseFallShapedSlewLimiter::INVERTED_SCVM; + } } } @@ -24,11 +79,40 @@ void LPGEnvBaseModule::modulate() { void LPGEnvBaseWidget::contextMenu(Menu* menu) { auto m = dynamic_cast<LPGEnvBaseModule*>(module); assert(m); - OptionsMenuItem* mi = new OptionsMenuItem("Minimum velocity output gain"); - mi->addItem(OptionMenuItem("-3db", [m]() { return m->_minVelocityDb == -3.0f; }, [m]() { m->_minVelocityDb = -3.0f; })); - mi->addItem(OptionMenuItem("-6db", [m]() { return m->_minVelocityDb == -6.0f; }, [m]() { m->_minVelocityDb = -6.0f; })); - mi->addItem(OptionMenuItem("-12db", [m]() { return m->_minVelocityDb == -12.0f; }, [m]() { m->_minVelocityDb = -12.0f; })); - mi->addItem(OptionMenuItem("-24db", [m]() { return m->_minVelocityDb == -24.0f; }, [m]() { m->_minVelocityDb = -24.0f; })); - mi->addItem(OptionMenuItem("-60db", [m]() { return m->_minVelocityDb == -60.0f; }, [m]() { m->_minVelocityDb = -60.0f; })); - OptionsMenuItem::addToMenu(mi, menu); + + OptionsMenuItem* rm = new OptionsMenuItem("Rise shape CV"); + rm->addItem(OptionMenuItem( + "Enable", + [m]() { return m->_riseShapeMode == RiseFallShapedSlewLimiter::ON_SCVM; }, + [m]() { m->_riseShapeMode = RiseFallShapedSlewLimiter::ON_SCVM; } + )); + rm->addItem(OptionMenuItem( + "Enable inverted", + [m]() { return m->_riseShapeMode == RiseFallShapedSlewLimiter::INVERTED_SCVM; }, + [m]() { m->_riseShapeMode = RiseFallShapedSlewLimiter::INVERTED_SCVM; } + )); + rm->addItem(OptionMenuItem( + "Disable", + [m]() { return m->_riseShapeMode == RiseFallShapedSlewLimiter::OFF_SCVM; }, + [m]() { m->_riseShapeMode = RiseFallShapedSlewLimiter::OFF_SCVM; } + )); + OptionsMenuItem::addToMenu(rm, menu); + + OptionsMenuItem* fm = new OptionsMenuItem("Fall shape CV"); + fm->addItem(OptionMenuItem( + "Enable", + [m]() { return m->_fallShapeMode == RiseFallShapedSlewLimiter::ON_SCVM; }, + [m]() { m->_fallShapeMode = RiseFallShapedSlewLimiter::ON_SCVM; } + )); + fm->addItem(OptionMenuItem( + "Enable inverted", + [m]() { return m->_fallShapeMode == RiseFallShapedSlewLimiter::INVERTED_SCVM; }, + [m]() { m->_fallShapeMode = RiseFallShapedSlewLimiter::INVERTED_SCVM; } + )); + fm->addItem(OptionMenuItem( + "Disable", + [m]() { return m->_fallShapeMode == RiseFallShapedSlewLimiter::OFF_SCVM; }, + [m]() { m->_fallShapeMode = RiseFallShapedSlewLimiter::OFF_SCVM; } + )); + OptionsMenuItem::addToMenu(fm, menu); } diff --git a/src/lpg_common.hpp b/src/lpg_common.hpp @@ -8,8 +8,8 @@ struct LPGEnvBaseModule : BGModule { float _longTimeScale; bool _gateToTrigger = true; float _timeScale = 1.0f; - const float _maxVelocityDb = 0.0f; - float _minVelocityDb = -6.0f; + RiseFallShapedSlewLimiter::ShapeCVMode _riseShapeMode = RiseFallShapedSlewLimiter::INVERTED_SCVM; + RiseFallShapedSlewLimiter::ShapeCVMode _fallShapeMode = RiseFallShapedSlewLimiter::ON_SCVM; LPGEnvBaseModule(int gateToTriggerParamID = -1, int timeScaleParamID = -1, float longTimeScale = 10.0f) : _gateToTriggerParamID(gateToTriggerParamID) diff --git a/src/slew_common.cpp b/src/slew_common.cpp @@ -1,7 +1,7 @@ #include "slew_common.hpp" -float RiseFallShapedSlewLimiter::timeMS(Param& param, Input* input, float maxMS, int c) { +float RiseFallShapedSlewLimiter::timeMS(int c, Param& param, Input* input, float maxMS) { float time = clamp(param.getValue(), 0.0f, 1.0f); if (input && input->isConnected()) { time *= clamp(input->getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); @@ -9,11 +9,18 @@ float RiseFallShapedSlewLimiter::timeMS(Param& param, Input* input, float maxMS, return time * time * maxMS; } -float RiseFallShapedSlewLimiter::shape(Param& param, bool invert) { - float shape = clamp(param.getValue(), -1.0f, 1.0f); +float RiseFallShapedSlewLimiter::shape(int c, Param& param, bool invert, Input* cv, ShapeCVMode mode) { + float shape = param.getValue(); if (invert) { shape *= -1.0f; } + if (cv && mode != OFF_SCVM) { + float v = cv->getPolyVoltage(c) / 5.0f; + if (mode == INVERTED_SCVM) { + v = -v; + } + shape = clamp(shape + v, -1.0f, 1.0f); + } if (shape < 0.0) { shape = 1.0f + shape; shape = _rise.minShape + shape * (1.0f - _rise.minShape); @@ -35,17 +42,20 @@ void RiseFallShapedSlewLimiter::modulate( float fallMaxMS, Param& fallShapeParam, int c, - bool invertRiseShape + bool invertRiseShape, + Input* shapeCV, + ShapeCVMode riseShapeMode, + ShapeCVMode fallShapeMode ) { _rise.setParams( sampleRate, - timeMS(riseParam, riseInput, riseMaxMS, c), - shape(riseShapeParam, invertRiseShape) + timeMS(c, riseParam, riseInput, riseMaxMS), + shape(c, riseShapeParam, invertRiseShape, shapeCV, riseShapeMode) ); _fall.setParams( sampleRate, - timeMS(fallParam, fallInput, fallMaxMS, c), - shape(fallShapeParam) + timeMS(c, fallParam, fallInput, fallMaxMS), + shape(c, fallShapeParam, false, shapeCV, fallShapeMode) ); } diff --git a/src/slew_common.hpp b/src/slew_common.hpp @@ -6,13 +6,19 @@ using namespace bogaudio::dsp; struct RiseFallShapedSlewLimiter { + enum ShapeCVMode { + OFF_SCVM, + ON_SCVM, + INVERTED_SCVM + }; + bool _rising = true; float _last = 0.0f; ShapedSlewLimiter _rise; ShapedSlewLimiter _fall; - float timeMS(Param& param, Input* input, float maxMS, int c); - float shape(Param& param, bool invert = false); + float timeMS(int c, Param& param, Input* input, float maxMS); + float shape(int c, Param& param, bool invert = false, Input* cv = NULL, ShapeCVMode mode = OFF_SCVM); void modulate( float sampleRate, Param& riseParam, @@ -24,7 +30,10 @@ struct RiseFallShapedSlewLimiter { float fallMaxMS, Param& fallShapeParam, int c, - bool invertRiseShape = false + bool invertRiseShape = false, + Input* shapeCV = NULL, + ShapeCVMode riseShapeMode = OFF_SCVM, + ShapeCVMode fallShapeMode = OFF_SCVM ); float next(float sample); };