commit 0a918e91fdb886b7693841a45de7cc8d2012a8e5
parent 6e4935d47e7a29bb3895aaff9fe62b38bfc348d5
Author: Matt Demanett <matt@demanett.net>
Date: Fri, 28 Aug 2020 21:52:26 -0400
VISH: vactrol-ish envelope.
Diffstat:
24 files changed, 1679 insertions(+), 199 deletions(-)
diff --git a/README-prerelease.md b/README-prerelease.md
@@ -371,6 +371,29 @@ By default, the attack, decay and release envelope segments have an exponential
_Polyphony:_ <a href="#polyphony">Polyphonic</a>, with channels defined by the GATE input.
+#### <a name="vish"></a> VISH
+
+VISH ("vactrol-ish") is an envelope generator designed to simulate the voltage shapes produced by the [vactrol](https://en.wikipedia.org/wiki/Opto-isolator) control circuits of hardware LPGs (low pass gates). It lends itself to percussive envelopes, though long envelopes are possible.
+
+It operates by generating an internal 10V square envelope, which is fed through a slew limiter.
+
+When a trigger is received at the GATE input, or if any rising edge is received and GT TO TRIG is enabled, the internal envelop triggers and runs for the time set by the MIN GATE knob. This parameter may be controlled by CV at the MIN input, expecting a unipolar (0-10V) input, which is scaled by the knob position.
+
+When GT TO TRIG is not enabled, then a rising edge at GATE will trigger the internal envelope in the same way, but when the envelope completes, whatever voltage is at GATE is fed to the slew limiter. This can be used several ways:
+ 1. If the input is a full 10V, the output will sustain for as long as the GATE input remains high, with a minimum time set by MIN GATE.
+ 2. If the input is less than 10V, there is an ADSR-like effect, where the output, subject to the slew, will go to 10V for the duration of MIN GATE, then fall to whatever the input is.
+ 3. If MIN GATE is zero, the input is simply fed to the slew as-is.
+
+The slew limiter is controlled by the RISE and FALL controls, which behave exactly like they do on the <a href="#slew">SLEW</a> module. The time knobs control how much the rise and fall of the internal envelope are slewed, while the shape knob control the shapes of each segment. The time knobs have unipolar (0-10V) CVs.
+
+If the TIMES 10X option is enabled, the values of the rise and fall times, and MIN GATE, subject to their CVs, are multiplied by 10. Thus fall and MIN GATE can go to a maximum of 10 seconds, and rise to 3 seconds.
+
+The VELO input provides control of the level of the final output. It can be used to implement velocity from a MIDI controller, or to add accents, or otherwise manipulate the output. It expects a 0-10V input voltage: when this 0, the output gain is -6dB (it is cut in half); when VELO is 10V the output is unchanged (a 0dB gain). Intermediate values will set the output gain linearly to values between -6dB and 0dB.
+
+The velocity-zero gain of -6dB can be set to other values on the context menu, to make the velocity response stronger (-12dB, -24dB) or weaker (-3dB). It can also be set to -60dB, such that a 0V velocity input will completely cut the output.
+
+_Polyphony:_ <a href="#polyphony">Polyphonic</a>, with channels defined by the GATE input.
+
#### <a name="follow"></a> FOLLOW
An envelope follower (a utility that converts its input to a CV proportional to the level of the input's amplitude). The DAMP knob and CV (0-10V) affect how quickly the output responds to changes in the input -- higher DAMP values effectively slow down and smooth out the response.
diff --git a/plugin.json b/plugin.json
@@ -299,6 +299,16 @@
]
},
{
+ "slug": "Bogaudio-Vish",
+ "name": "VISH",
+ "description": "Vactrol-ish envelope generator",
+ "manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#vish",
+ "tags": [
+ "Envelope generator",
+ "Polyphonic"
+ ]
+ },
+ {
"slug": "Bogaudio-Follow",
"name": "FOLLOW",
"description": "Envelope follower",
diff --git a/res-pp/Slew-dark-pp.svg b/res-pp/Slew-dark-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -147,38 +150,6 @@ polyline.knob-tick {
<text font-size="5.0pt" transform="rotate(60) translate(18 0) rotate(-60) translate(-1.9 2.2)">10</text>
</g>
</symbol>
-
- <symbol id="dial-rise-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
- </g>
- </symbol>
-
- <symbol id="dial-fall-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
- </g>
- </symbol>
</defs>
@@ -216,7 +187,21 @@ polyline.knob-tick {
<circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- <use xlink:href="#dial-rise-shape-slew" transform="translate(2.5 39)" href="#dial-rise-shape-slew"/>
+ <g transform="translate(2.5 39)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </g>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<g transform="translate(3 3)"><svg id="RISE_INPUT">
@@ -246,7 +231,21 @@ polyline.knob-tick {
<circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- <use xlink:href="#dial-fall-shape-slew" transform="translate(2.5 39)" href="#dial-fall-shape-slew"/>
+ <g transform="translate(2.5 39)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </g>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<g transform="translate(3 3)"><svg id="FALL_INPUT">
diff --git a/res-pp/Slew-lowcontrast-pp.svg b/res-pp/Slew-lowcontrast-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -115,7 +118,7 @@ polyline.output-label, path.output-label {
}
circle.port-rim {
- stroke: #ccc;
+ stroke: #bbb;
}
circle.port-barrel {
stroke: #222;
@@ -147,38 +150,6 @@ polyline.knob-tick {
<text font-size="5.0pt" transform="rotate(60) translate(18 0) rotate(-60) translate(-1.9 2.2)">10</text>
</g>
</symbol>
-
- <symbol id="dial-rise-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
- </g>
- </symbol>
-
- <symbol id="dial-fall-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
- </g>
- </symbol>
</defs>
@@ -216,7 +187,21 @@ polyline.knob-tick {
<circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- <use xlink:href="#dial-rise-shape-slew" transform="translate(2.5 39)" href="#dial-rise-shape-slew"/>
+ <g transform="translate(2.5 39)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </g>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<g transform="translate(3 3)"><svg id="RISE_INPUT">
@@ -246,7 +231,21 @@ polyline.knob-tick {
<circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- <use xlink:href="#dial-fall-shape-slew" transform="translate(2.5 39)" href="#dial-fall-shape-slew"/>
+ <g transform="translate(2.5 39)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </g>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<g transform="translate(3 3)"><svg id="FALL_INPUT">
diff --git a/res-pp/Slew-pp.svg b/res-pp/Slew-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -83,38 +86,6 @@ polyline.knob-tick {
<text font-size="5.0pt" transform="rotate(60) translate(18 0) rotate(-60) translate(-1.9 2.2)">10</text>
</g>
</symbol>
-
- <symbol id="dial-rise-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
- </g>
- </symbol>
-
- <symbol id="dial-fall-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
- </g>
- </symbol>
</defs>
@@ -152,7 +123,21 @@ polyline.knob-tick {
<circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- <use xlink:href="#dial-rise-shape-slew" transform="translate(2.5 39)" href="#dial-rise-shape-slew"/>
+ <g transform="translate(2.5 39)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </g>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<g transform="translate(3 3)"><svg id="RISE_INPUT">
@@ -182,7 +167,21 @@ polyline.knob-tick {
<circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- <use xlink:href="#dial-fall-shape-slew" transform="translate(2.5 39)" href="#dial-fall-shape-slew"/>
+ <g transform="translate(2.5 39)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </g>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<g transform="translate(3 3)"><svg id="FALL_INPUT">
diff --git a/res-pp/Vish-dark-pp.svg b/res-pp/Vish-dark-pp.svg
@@ -0,0 +1,359 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="75.0" height="380.0" viewBox="0 0 75.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-rise-time-vish" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-240) translate(20.0 0) rotate(240.0) translate(0 3)">0MS</text>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-185.22774424948338) translate(19 0) rotate(185.22774424948338) translate(0 3)">10</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-153.39745962155612) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-117.52551286084109) translate(19 0) rotate(117.52551286084109) translate(0 3)">50</text>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-66.79491924311225) translate(19 0) rotate(66.79491924311225) translate(0 3)">100</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-27.867965644035735) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(4.94897427831782) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(33.861278752583075) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(60) translate(20.0 0) rotate(-60.0) translate(0 3)">300</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-fall-time-vish" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-240) translate(19.0 0) rotate(240.0) translate(0 3)">0S</text>
+ <polyline points="0,0 2,0" stroke-width="0.7" transform="rotate(-210.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-172.91796067500633) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-145.1316701949486) translate(20 0) rotate(145.1316701949486) translate(0 3)">0.1</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-105.83592135001263) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-75.68323274845017) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-50.26334038989722) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-27.867965644035735) translate(20 0) rotate(27.867965644035735) translate(0 3)">0.5</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-7.620999227554989) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(10.99800796022268) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(28.328157299974748) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(44.60498941515414) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(60) translate(19.0 0) rotate(-60.0) translate(0 3)">1</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-mingate-vish" viewBox="0 0 75.0px 75.0px">
+ <g transform="translate(37.5 37.5)">
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-240) translate(21 0) rotate(240.0) translate(0 3)">0S</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-172.91796067500633) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-145.1316701949486) translate(23 0) rotate(145.1316701949486) translate(0 3)">0.1</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-105.83592135001263) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-75.68323274845017) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-50.26334038989722) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-27.867965644035735) translate(23 0) rotate(27.867965644035735) translate(0 3)">0.5</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-7.620999227554989) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(10.99800796022268) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(28.328157299974748) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(44.60498941515414) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(60) translate(21 0) rotate(-60.0) translate(0 3)">1</text>
+ </g>
+ </symbol>
+ </defs>
+
+
+
+ <rect class="module-background background-fill" width="75.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 74.0,1 74.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 74.5,0.5 74.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 75.0,0 75.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="9pt" letter-spacing="3px" text-anchor="end" transform="translate(72.0 17)">VISH</text>
+ <g transform="translate(25 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BGA</text>
+ <rect class="background-fill" width="2" height="2" fill="#ddd" transform="translate(11.5 -4)"/>
+ </g>
+
+
+ <g transform="translate(0 35)">
+
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate(37.5 0)">RISE</text>
+ <g transform="translate(12.5 12.0)"><svg id="RISE_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>
+ <use xlink:href="#dial-rise-time-vish" transform="translate(3 2.0)" href="#dial-rise-time-vish"/>
+ <g transform="translate(52 17.0)"><svg id="RISE_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(40 5.0)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 101)">
+
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate(37.5 0)">FALL</text>
+ <g transform="translate(12.5 10.0)"><svg id="FALL_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>
+ <use xlink:href="#dial-fall-time-vish" transform="translate(3 0.0)" href="#dial-fall-time-vish"/>
+ <g transform="translate(52 15.0)"><svg id="FALL_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(40 3.0)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#ccc" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 164)">
+ <text font-size="8pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(37.5 0)">MIN GATE</text>
+ <g transform="translate(15 3.0)"><svg id="MINIMUM_GATE_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>
+ <use xlink:href="#dial-mingate-vish" transform="translate(0 -12.0)" href="#dial-mingate-vish"/>
+ </g>
+
+ <g transform="translate(-6 221)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(37.5 6)">GT TO TRIG</text>
+ <g transform="translate(63 -1)"><svg id="GATE_TO_TRIGGER_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+ <g transform="translate(-6 235)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(37.5 6)">TIMES 10X</text>
+ <g transform="translate(61 -1)"><svg id="TIMES_10X_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+ <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(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">
+ <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">
+ <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">
+ <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>
+ <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"/>
+ <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="1px" text-anchor="middle" transform="translate(22.5 109)">GATE</text>
+ <g class="io-group" transform="translate(30 72)">
+ <rect class="output-background" width="32" height="38" rx="5" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="32" height="10" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(7.5 30)"/>
+ <g transform="translate(10.5 5)"><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(22.5 37)">OUT</text>
+ </g>
+ </g>
+</svg>
diff --git a/res-pp/Vish-lowcontrast-pp.svg b/res-pp/Vish-lowcontrast-pp.svg
@@ -0,0 +1,359 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="75.0" height="380.0" viewBox="0 0 75.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-rise-time-vish" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-240) translate(20.0 0) rotate(240.0) translate(0 3)">0MS</text>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-185.22774424948338) translate(19 0) rotate(185.22774424948338) translate(0 3)">10</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-153.39745962155612) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-117.52551286084109) translate(19 0) rotate(117.52551286084109) translate(0 3)">50</text>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-66.79491924311225) translate(19 0) rotate(66.79491924311225) translate(0 3)">100</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-27.867965644035735) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(4.94897427831782) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(33.861278752583075) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(60) translate(20.0 0) rotate(-60.0) translate(0 3)">300</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-fall-time-vish" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-240) translate(19.0 0) rotate(240.0) translate(0 3)">0S</text>
+ <polyline points="0,0 2,0" stroke-width="0.7" transform="rotate(-210.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-172.91796067500633) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-145.1316701949486) translate(20 0) rotate(145.1316701949486) translate(0 3)">0.1</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-105.83592135001263) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-75.68323274845017) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-50.26334038989722) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-27.867965644035735) translate(20 0) rotate(27.867965644035735) translate(0 3)">0.5</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-7.620999227554989) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(10.99800796022268) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(28.328157299974748) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(44.60498941515414) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(60) translate(19.0 0) rotate(-60.0) translate(0 3)">1</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-mingate-vish" viewBox="0 0 75.0px 75.0px">
+ <g transform="translate(37.5 37.5)">
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-240) translate(21 0) rotate(240.0) translate(0 3)">0S</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-172.91796067500633) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-145.1316701949486) translate(23 0) rotate(145.1316701949486) translate(0 3)">0.1</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-105.83592135001263) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-75.68323274845017) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-50.26334038989722) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-27.867965644035735) translate(23 0) rotate(27.867965644035735) translate(0 3)">0.5</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-7.620999227554989) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(10.99800796022268) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(28.328157299974748) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(44.60498941515414) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(60) translate(21 0) rotate(-60.0) translate(0 3)">1</text>
+ </g>
+ </symbol>
+ </defs>
+
+
+
+ <rect class="module-background background-fill" width="75.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 74.0,1 74.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 74.5,0.5 74.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 75.0,0 75.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="9pt" letter-spacing="3px" text-anchor="end" transform="translate(72.0 17)">VISH</text>
+ <g transform="translate(25 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BGA</text>
+ <rect class="background-fill" width="2" height="2" fill="#ddd" transform="translate(11.5 -4)"/>
+ </g>
+
+
+ <g transform="translate(0 35)">
+
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate(37.5 0)">RISE</text>
+ <g transform="translate(12.5 12.0)"><svg id="RISE_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>
+ <use xlink:href="#dial-rise-time-vish" transform="translate(3 2.0)" href="#dial-rise-time-vish"/>
+ <g transform="translate(52 17.0)"><svg id="RISE_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(40 5.0)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 101)">
+
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate(37.5 0)">FALL</text>
+ <g transform="translate(12.5 10.0)"><svg id="FALL_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>
+ <use xlink:href="#dial-fall-time-vish" transform="translate(3 0.0)" href="#dial-fall-time-vish"/>
+ <g transform="translate(52 15.0)"><svg id="FALL_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(40 3.0)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#b3b3b3" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 164)">
+ <text font-size="8pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(37.5 0)">MIN GATE</text>
+ <g transform="translate(15 3.0)"><svg id="MINIMUM_GATE_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>
+ <use xlink:href="#dial-mingate-vish" transform="translate(0 -12.0)" href="#dial-mingate-vish"/>
+ </g>
+
+ <g transform="translate(-6 221)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(37.5 6)">GT TO TRIG</text>
+ <g transform="translate(63 -1)"><svg id="GATE_TO_TRIGGER_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+ <g transform="translate(-6 235)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(37.5 6)">TIMES 10X</text>
+ <g transform="translate(61 -1)"><svg id="TIMES_10X_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+ <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(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">
+ <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">
+ <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">
+ <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>
+ <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"/>
+ <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="1px" text-anchor="middle" transform="translate(22.5 109)">GATE</text>
+ <g class="io-group" transform="translate(30 72)">
+ <rect class="output-background" width="32" height="38" rx="5" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="32" height="10" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(7.5 30)"/>
+ <g transform="translate(10.5 5)"><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(22.5 37)">OUT</text>
+ </g>
+ </g>
+</svg>
diff --git a/res-pp/Vish-pp.svg b/res-pp/Vish-pp.svg
@@ -0,0 +1,295 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="75.0" height="380.0" viewBox="0 0 75.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-rise-time-vish" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-240) translate(20.0 0) rotate(240.0) translate(0 3)">0MS</text>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-185.22774424948338) translate(19 0) rotate(185.22774424948338) translate(0 3)">10</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-153.39745962155612) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-117.52551286084109) translate(19 0) rotate(117.52551286084109) translate(0 3)">50</text>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-66.79491924311225) translate(19 0) rotate(66.79491924311225) translate(0 3)">100</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-27.867965644035735) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(4.94897427831782) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(33.861278752583075) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(60) translate(20.0 0) rotate(-60.0) translate(0 3)">300</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-fall-time-vish" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-240) translate(19.0 0) rotate(240.0) translate(0 3)">0S</text>
+ <polyline points="0,0 2,0" stroke-width="0.7" transform="rotate(-210.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-172.91796067500633) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-145.1316701949486) translate(20 0) rotate(145.1316701949486) translate(0 3)">0.1</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-105.83592135001263) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-75.68323274845017) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-50.26334038989722) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(-27.867965644035735) translate(20 0) rotate(27.867965644035735) translate(0 3)">0.5</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-7.620999227554989) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(10.99800796022268) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(28.328157299974748) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(44.60498941515414) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" transform="rotate(60) translate(19.0 0) rotate(-60.0) translate(0 3)">1</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-mingate-vish" viewBox="0 0 75.0px 75.0px">
+ <g transform="translate(37.5 37.5)">
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-240) translate(21 0) rotate(240.0) translate(0 3)">0S</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-172.91796067500633) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-145.1316701949486) translate(23 0) rotate(145.1316701949486) translate(0 3)">0.1</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-105.83592135001263) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-75.68323274845017) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-50.26334038989722) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(-27.867965644035735) translate(23 0) rotate(27.867965644035735) translate(0 3)">0.5</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(-7.620999227554989) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(10.99800796022268) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(28.328157299974748) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(44.60498941515414) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" transform="rotate(60) translate(21 0) rotate(-60.0) translate(0 3)">1</text>
+ </g>
+ </symbol>
+ </defs>
+
+
+
+ <rect class="module-background background-fill" width="75.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 74.0,1 74.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 74.5,0.5 74.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 75.0,0 75.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="9pt" letter-spacing="3px" text-anchor="end" transform="translate(72.0 17)">VISH</text>
+ <g transform="translate(25 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BGA</text>
+ <rect class="background-fill" width="2" height="2" fill="#ddd" transform="translate(11.5 -4)"/>
+ </g>
+
+
+ <g transform="translate(0 35)">
+
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate(37.5 0)">RISE</text>
+ <g transform="translate(12.5 12.0)"><svg id="RISE_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>
+ <use xlink:href="#dial-rise-time-vish" transform="translate(3 2.0)" href="#dial-rise-time-vish"/>
+ <g transform="translate(52 17.0)"><svg id="RISE_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(40 5.0)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 101)">
+
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate(37.5 0)">FALL</text>
+ <g transform="translate(12.5 10.0)"><svg id="FALL_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>
+ <use xlink:href="#dial-fall-time-vish" transform="translate(3 0.0)" href="#dial-fall-time-vish"/>
+ <g transform="translate(52 15.0)"><svg id="FALL_SHAPE_PARAM">
+ <g transform="translate(8 8)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle r="7.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(40 3.0)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-52.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-15) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(22.5) translate(10 0)"/>
+
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-127.5) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-165) translate(10 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-202.5) translate(10 0)"/>
+
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0 164)">
+ <text font-size="8pt" letter-spacing="1.5px" text-anchor="middle" transform="translate(37.5 0)">MIN GATE</text>
+ <g transform="translate(15 3.0)"><svg id="MINIMUM_GATE_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>
+ <use xlink:href="#dial-mingate-vish" transform="translate(0 -12.0)" href="#dial-mingate-vish"/>
+ </g>
+
+ <g transform="translate(-6 221)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(37.5 6)">GT TO TRIG</text>
+ <g transform="translate(63 -1)"><svg id="GATE_TO_TRIGGER_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+ <g transform="translate(-6 235)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate(37.5 6)">TIMES 10X</text>
+ <g transform="translate(61 -1)"><svg id="TIMES_10X_PARAM">
+ <g transform="translate(4.5 4.5)">
+ <circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+ <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(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">
+ <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">
+ <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">
+ <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>
+ <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"/>
+ <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="1px" text-anchor="middle" transform="translate(22.5 109)">GATE</text>
+ <g class="io-group" transform="translate(30 72)">
+ <rect class="output-background" width="32" height="38" rx="5" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="32" height="10" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(7.5 30)"/>
+ <g transform="translate(10.5 5)"><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(22.5 37)">OUT</text>
+ </g>
+ </g>
+</svg>
diff --git a/res-src/Slew-src.svg b/res-src/Slew-src.svg
@@ -14,38 +14,6 @@
<text font-size="5.0pt" transform="rotate(60) translate(18 0) rotate(-60) translate(-1.9 2.2)">10</text>
</g>
</symbol>
-
- <symbol id="dial-rise-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
- </g>
- </symbol>
-
- <symbol id="dial-fall-shape-slew" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
- <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
- <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
- </g>
- </symbol>
</defs>
<def xlink:href="#module3" var-name="SLEW"/>
@@ -55,7 +23,7 @@
<def id="RISE_PARAM" xlink:href="#knob26" transform="translate(9.5 9)"/>
<use xlink:href="#dial-time-slew" transform="translate(0 -1)"/>
<def id="RISE_SHAPE_PARAM" xlink:href="#knob16" transform="translate(14.5 51)"/>
- <use xlink:href="#dial-rise-shape-slew" transform="translate(2.5 39)"/>
+ <def xlink:href="#dial-shape-rise" transform="translate(2.5 39)"/>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<def id="RISE_INPUT" xlink:href="#input" transform="translate(3 3)"/>
@@ -68,7 +36,7 @@
<def id="FALL_PARAM" xlink:href="#knob26" transform="translate(9.5 9)"/>
<use xlink:href="#dial-time-slew" transform="translate(0 -1)"/>
<def id="FALL_SHAPE_PARAM" xlink:href="#knob16" transform="translate(14.5 51)"/>
- <use xlink:href="#dial-fall-shape-slew" transform="translate(2.5 39)"/>
+ <def xlink:href="#dial-shape-fall" transform="translate(2.5 39)"/>
<g class="io-group" transform="translate(7.5 77)">
<rect class="input-background" width="30" height="30" rx="5"/>
<def id="FALL_INPUT" xlink:href="#input" transform="translate(3 3)"/>
diff --git a/res-src/Vish-src.svg b/res-src/Vish-src.svg
@@ -0,0 +1,112 @@
+<module hp="5">
+ <style/>
+
+ <defs>
+ <symbol id="dial-rise-time-vish" viewBox="0 0 45px 45px">
+ <g var-tt="19" transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" var-r="-240" transform="rotate($r) translate($tt+1.0 0) rotate(-1.0*$r) translate(0 3)">0MS</text>
+ <text font-size="5pt" text-anchor="middle" var-r="0.01**0.5/0.3**0.5*300.0-240.0" transform="rotate($r) translate($tt 0) rotate(-1.0*$r) translate(0 3)">10</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.025**0.5/0.3**0.5*300.0-240.0) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" var-r="0.05**0.5/0.3**0.5*300.0-240.0" transform="rotate($r) translate($tt 0) rotate(-1.0*$r) translate(0 3)">50</text>
+ <text font-size="5pt" text-anchor="middle" var-r="0.1**0.5/0.3**0.5*300.0-240.0" transform="rotate($r) translate($tt 0) rotate(-1.0*$r) translate(0 3)">100</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.15**0.5/0.3**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.2**0.5/0.3**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.25**0.5/0.3**0.5*300.0-240.0) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" var-r="60" transform="rotate($r) translate($tt+1.0 0) rotate(-1.0*$r) translate(0 3)">300</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-fall-time-vish" viewBox="0 0 45px 45px">
+ <g var-tt="20" transform="translate(22.5 22.5)">
+ <text font-size="5pt" text-anchor="middle" var-r="-240" transform="rotate($r) translate($tt-1.0 0) rotate(-1.0*$r) translate(0 3)">0S</text>
+ <polyline points="0,0 2,0" stroke-width="0.7" transform="rotate(0.01**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.05**0.5*300.0-240.0) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" var-r="0.1**0.5*300.0-240.0" transform="rotate($r) translate($tt 0) rotate(-1.0*$r) translate(0 3)">0.1</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.2**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.3**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.4**0.5*300.0-240.0) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" var-r="0.5**0.5*300.0-240.0" transform="rotate($r) translate($tt 0) rotate(-1.0*$r) translate(0 3)">0.5</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.6**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.7**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.8**0.5*300.0-240.0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.9**0.5*300.0-240.0) translate(15 0)"/>
+ <text font-size="5pt" text-anchor="middle" var-r="60" transform="rotate($r) translate($tt-1.0 0) rotate(-1.0*$r) translate(0 3)">1</text>
+ </g>
+ </symbol>
+
+ <symbol id="dial-mingate-vish" viewBox="0 0 ${width}px ${width}px">
+ <g transform="translate($width/2.0 $width/2.0)">
+ <text font-size="6pt" text-anchor="middle" var-r="-240" transform="rotate($r) translate(21 0) rotate(-1.0*$r) translate(0 3)">0S</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0.01**0.5*300.0-240.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.05**0.5*300.0-240.0) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" var-r="0.1**0.5*300.0-240.0" transform="rotate($r) translate(23 0) rotate(-1.0*$r) translate(0 3)">0.1</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.2**0.5*300.0-240.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.3**0.5*300.0-240.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.4**0.5*300.0-240.0) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" var-r="0.5**0.5*300.0-240.0" transform="rotate($r) translate(23 0) rotate(-1.0*$r) translate(0 3)">0.5</text>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.6**0.5*300.0-240.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.7**0.5*300.0-240.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.8**0.5*300.0-240.0) translate(17 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="0.7" transform="rotate(0.9**0.5*300.0-240.0) translate(17 0)"/>
+ <text font-size="6pt" text-anchor="middle" var-r="60" transform="rotate($r) translate(21 0) rotate(-1.0*$r) translate(0 3)">1</text>
+ </g>
+ </symbol>
+ </defs>
+
+ <def xlink:href="#module5" var-name="VISH"/>
+
+ <g transform="translate(0 35)" var-pad="3.0">
+ <!-- <polyline class="guide" points="0,0 $width,0" stroke-width="1" fill="none" transform="translate(0 $pad+22)"/> -->
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate($width/2.0 0)">RISE</text>
+ <def id="RISE_PARAM" xlink:href="#knob26" transform="translate(12.5 $pad+9)"/>
+ <use xlink:href="#dial-rise-time-vish" transform="translate(3 $pad-1)"/>
+ <def id="RISE_SHAPE_PARAM" xlink:href="#knob16" transform="translate(52 $pad+14)"/>
+ <def xlink:href="#dial-shape-rise" transform="translate(40 $pad+2)"/>
+ </g>
+
+ <g transform="translate(0 101)" var-pad="1.0">
+ <!-- <polyline class="guide" points="0,0 $width,0" stroke-width="1" fill="none" transform="translate(0 $pad+22)"/> -->
+ <text font-size="8pt" letter-spacing="2.0px" text-anchor="middle" transform="translate($width/2.0 0)">FALL</text>
+ <def id="FALL_PARAM" xlink:href="#knob26" transform="translate(12.5 $pad+9)"/>
+ <use xlink:href="#dial-fall-time-vish" transform="translate(3 $pad-1)"/>
+ <def id="FALL_SHAPE_PARAM" xlink:href="#knob16" transform="translate(52 $pad+14)"/>
+ <def xlink:href="#dial-shape-fall" transform="translate(40 $pad+2)"/>
+ </g>
+
+ <g transform="translate(0 164)" var-pad="3.0">
+ <text font-size="8pt" letter-spacing="1.5px" text-anchor="middle" transform="translate($width/2.0 0)">MIN GATE</text>
+ <def id="MINIMUM_GATE_PARAM" xlink:href="#knob29" transform="translate(15 $pad)"/>
+ <use xlink:href="#dial-mingate-vish" transform="translate(0 $pad+45.0/2.0-$width/2.0)"/>
+ </g>
+
+ <g transform="translate(-6 221)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate($width/2.0 6)">GT TO TRIG</text>
+ <def id="GATE_TO_TRIGGER_PARAM" xlink:href="#button-small" transform="translate(63 -1)"/>
+ </g>
+
+ <g transform="translate(-6 235)">
+ <text font-size="5pt" letter-spacing="1px" text-anchor="middle" transform="translate($width/2.0 6)">TIMES 10X</text>
+ <def id="TIMES_10X_PARAM" xlink:href="#button-small" transform="translate(61 -1)"/>
+ </g>
+
+ <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="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)">
+ <rect class="output-background" width="32" height="38" rx="5" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="32" height="10" transform="translate(7.5 2)"/>
+ <rect class="output-background-filler" width="10" height="10" transform="translate(7.5 30)"/>
+ <def id="OUT_OUTPUT" xlink:href="#output" transform="translate(10.5 5)"/>
+ <text class="output-label" font-size="5pt" letter-spacing="2px" text-anchor="middle" transform="translate(22.5 37)">OUT</text>
+ </g>
+ </g>
+</module>
diff --git a/res-src/defs.svg b/res-src/defs.svg
@@ -664,6 +664,38 @@
</g>
</symbol>
+ <symbol id="dial-shape-rise" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-45) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(-45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(135) translate(0 0)"/>
+ </g>
+ </symbol>
+
+ <symbol id="dial-shape-fall" 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 -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(60) translate(13 0) rotate(-60) translate(2 0) rotate(-135) translate(0 0)"/>
+ <polyline points="-3.5,0 3.5,0" stroke-width="1" fill="none" transform="rotate(-90) translate(13 0) rotate(90) rotate(45) translate(0 0)"/>
+ <path d="M -3.5 0 Q 0 3.5, 3.5 0" stroke-width="1" stroke="#333" fill="none" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 0) rotate(45) translate(0 0)"/>
+ </g>
+ </symbol>
+
<symbol id="dial-steps" viewBox="0 0 40px 40px">
<g transform="translate(20 20)">
<text font-size="5.0pt" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 2)">1</text>
diff --git a/res/Slew-dark.svg b/res/Slew-dark.svg
Binary files differ.
diff --git a/res/Slew-lowcontrast.svg b/res/Slew-lowcontrast.svg
Binary files differ.
diff --git a/res/Slew.svg b/res/Slew.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/Slew.cpp b/src/Slew.cpp
@@ -9,56 +9,24 @@ int Slew::channels() {
return inputs[IN_INPUT].getChannels();
}
-void Slew::modulate() {
- _riseShape = shape(params[RISE_SHAPE_PARAM]);
- _fallShape = shape(params[FALL_SHAPE_PARAM]);
-}
-
void Slew::modulateChannel(int c) {
- float riseTime = time(params[RISE_PARAM], inputs[RISE_INPUT], c);
- float fallTime = time(params[FALL_PARAM], inputs[FALL_INPUT], c);
- _rise[c].setParams(APP->engine->getSampleRate(), riseTime, _riseShape);
- _fall[c].setParams(APP->engine->getSampleRate(), fallTime, _fallShape);
+ _slew[c].modulate(
+ APP->engine->getSampleRate(),
+ params[RISE_PARAM],
+ inputs[RISE_INPUT],
+ 10000.0f,
+ params[RISE_SHAPE_PARAM],
+ params[FALL_PARAM],
+ inputs[FALL_INPUT],
+ 10000.0f,
+ params[FALL_SHAPE_PARAM],
+ c
+ );
}
void Slew::processChannel(const ProcessArgs& args, int c) {
- float sample = inputs[IN_INPUT].getPolyVoltage(c);
-
outputs[OUT_OUTPUT].setChannels(_channels);
- if (sample > _last[c]) {
- if (!_rising[c]) {
- _rising[c] = true;
- _rise[c]._last = _last[c];
- }
- outputs[OUT_OUTPUT].setVoltage(_last[c] = _rise[c].next(sample), c);
- }
- else {
- if (_rising[c]) {
- _rising[c] = false;
- _fall[c]._last = _last[c];
- }
- outputs[OUT_OUTPUT].setVoltage(_last[c] = _fall[c].next(sample), c);
- }
-}
-
-float Slew::time(Param& param, Input& input, int c) {
- float time = param.getValue();
- if (input.isConnected()) {
- time *= clamp(input.getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
- }
- return time * time * 10000.0f;
-}
-
-float Slew::shape(Param& param) {
- float shape = param.getValue();
- if (shape < 0.0) {
- shape = 1.0f + shape;
- shape = _rise[0].minShape + shape * (1.0f - _rise[0].minShape);
- }
- else {
- shape += 1.0f;
- }
- return shape;
+ outputs[OUT_OUTPUT].setVoltage(_slew[c].next(inputs[IN_INPUT].getPolyVoltage(c)), c);
}
struct SlewWidget : BGModuleWidget {
diff --git a/src/Slew.hpp b/src/Slew.hpp
@@ -1,9 +1,6 @@
#pragma once
-#include "bogaudio.hpp"
-#include "dsp/signal.hpp"
-
-using namespace bogaudio::dsp;
+#include "slew_common.hpp"
extern Model* modelSlew;
@@ -30,12 +27,7 @@ struct Slew : BGModule {
NUM_OUTPUTS
};
- float _riseShape = 0.0f;
- float _fallShape = 0.0f;
- bool _rising[maxChannels];
- float _last[maxChannels] {};
- ShapedSlewLimiter _rise[maxChannels];
- ShapedSlewLimiter _fall[maxChannels];
+ RiseFallShapedSlewLimiter _slew[maxChannels];
Slew() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
@@ -43,19 +35,12 @@ struct Slew : BGModule {
configParam(RISE_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Rise shape");
configParam<EnvelopeSegmentParamQuantity>(FALL_PARAM, 0.0f, 1.0f, 0.31623f, "Fall", " s");
configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Fall shape");
-
- for (int i = 0; i < maxChannels; ++i) {
- _rising[i] = true;
- }
}
bool active() override;
int channels() override;
- void modulate() override;
void modulateChannel(int c) override;
void processChannel(const ProcessArgs& args, int c) override;
- float time(Param& param, Input& input, int c);
- float shape(Param& param);
};
} // namespace bogaudio
diff --git a/src/Vish.cpp b/src/Vish.cpp
@@ -0,0 +1,181 @@
+
+#include "Vish.hpp"
+
+#define VELOCITY_MINIMUM_DECIBELS "velocity_minimum_decibels"
+
+void Vish::Engine::reset() {
+ trigger.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();
+ }
+}
+
+void Vish::sampleRateChange() {
+ _sampleRate = APP->engine->getSampleRate();
+ _sampleTime = APP->engine->getSampleTime();
+ for (int i = 0; i < _channels; ++i) {
+ _engines[i]->setSampleRate(_sampleRate);
+ }
+}
+
+json_t* Vish::toJson(json_t* root) {
+ json_object_set_new(root, VELOCITY_MINIMUM_DECIBELS, json_real(_minVelocityDb));
+ return root;
+}
+
+void Vish::fromJson(json_t* root) {
+ json_t* mdb = json_object_get(root, VELOCITY_MINIMUM_DECIBELS);
+ if (mdb) {
+ _minVelocityDb = json_real_value(mdb);
+ }
+}
+
+bool Vish::active() {
+ return outputs[OUT_OUTPUT].isConnected();
+}
+
+int Vish::channels() {
+ return inputs[GATE_INPUT].getChannels();
+}
+
+void Vish::addChannel(int c) {
+ _engines[c] = new Engine();
+ _engines[c]->reset();
+ _engines[c]->setSampleRate(_sampleRate);
+}
+
+void Vish::removeChannel(int c) {
+ delete _engines[c];
+ _engines[c] = NULL;
+}
+
+void Vish::modulate() {
+ _gateToTrigger = params[GATE_TO_TRIGGER_PARAM].getValue() > 0.5f;
+ _timeScale = params[TIMES_10X_PARAM].getValue() > 0.5f ? 10.0f : 1.0f;
+}
+
+void Vish::modulateChannel(int c) {
+ _engines[c]->slew.modulate(
+ _sampleRate,
+ params[RISE_PARAM],
+ inputs[RISE_INPUT],
+ 300.0f * _timeScale,
+ params[RISE_SHAPE_PARAM],
+ params[FALL_PARAM],
+ inputs[FALL_INPUT],
+ 1000.0f * _timeScale,
+ params[FALL_SHAPE_PARAM],
+ c
+ );
+}
+
+void Vish::processChannel(const ProcessArgs& args, int c) {
+ Engine& e = *_engines[c];
+
+ float in = inputs[GATE_INPUT].getPolyVoltage(c);
+ if (e.trigger.process(in)) {
+ float time = clamp(params[MINIMUM_GATE_PARAM].getValue(), 0.0f, 1.0f);
+ if (inputs[MINIMUM_GATE_INPUT].isConnected()) {
+ time *= clamp(inputs[MINIMUM_GATE_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
+ }
+ time *= time;
+ time *= _timeScale;
+ e.gateSeconds = time;
+
+ e.gateElapsedSeconds = 0.0f;
+ if (_gateToTrigger) {
+ e.gateSeconds = std::max(0.01f, time);
+ }
+ else {
+ e.gateSeconds = time;
+ }
+ }
+ else {
+ e.gateElapsedSeconds += _sampleTime;
+ }
+
+ float gate = 0.0f;
+ if (e.gateElapsedSeconds < e.gateSeconds) {
+ gate = 10.0f;
+ }
+ else if (!_gateToTrigger) {
+ 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);
+}
+
+struct VishWidget : BGModuleWidget {
+ static constexpr int hp = 5;
+
+ VishWidget(Vish* module) {
+ setModule(module);
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+ setPanel(box.size, "Vish");
+ createScrews();
+
+ // generated by svg_widgets.rb
+ auto riseParamPosition = Vec(12.5, 47.0);
+ auto riseShapeParamPosition = Vec(52.0, 52.0);
+ auto fallParamPosition = Vec(12.5, 111.0);
+ auto fallShapeParamPosition = Vec(52.0, 116.0);
+ auto minimumGateParamPosition = Vec(23.0, 175.0);
+ 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 gateInputPosition = Vec(10.5, 325.0);
+
+ auto outOutputPosition = Vec(40.5, 325.0);
+ // end generated by svg_widgets.rb
+
+ addParam(createParam<Knob26>(riseParamPosition, module, Vish::RISE_PARAM));
+ addParam(createParam<Knob16>(riseShapeParamPosition, module, Vish::RISE_SHAPE_PARAM));
+ addParam(createParam<Knob26>(fallParamPosition, module, Vish::FALL_PARAM));
+ addParam(createParam<Knob16>(fallShapeParamPosition, module, Vish::FALL_SHAPE_PARAM));
+ addParam(createParam<Knob29>(minimumGateParamPosition, module, Vish::MINIMUM_GATE_PARAM));
+ 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>(fallInputPosition, module, Vish::FALL_INPUT));
+ addInput(createInput<Port24>(gateInputPosition, module, Vish::GATE_INPUT));
+
+ addOutput(createOutput<Port24>(outOutputPosition, module, Vish::OUT_OUTPUT));
+ }
+
+ void contextMenu(Menu* menu) override {
+ auto m = dynamic_cast<Vish*>(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* modelVish = createModel<Vish, VishWidget>("Bogaudio-Vish", "VISH", "Vactrol-ish envelope generator", "Envelope generator", "Polyphonic");
diff --git a/src/Vish.hpp b/src/Vish.hpp
@@ -0,0 +1,98 @@
+#pragma once
+
+#include "slew_common.hpp"
+#include "dsp/signal.hpp"
+
+extern Model* modelVish;
+
+namespace bogaudio {
+
+struct Vish : BGModule {
+ enum ParamsIds {
+ RISE_PARAM,
+ RISE_SHAPE_PARAM,
+ FALL_PARAM,
+ FALL_SHAPE_PARAM,
+ MINIMUM_GATE_PARAM,
+ GATE_TO_TRIGGER_PARAM,
+ TIMES_10X_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ MINIMUM_GATE_INPUT,
+ RISE_INPUT,
+ VELOCITY_INPUT,
+ FALL_INPUT,
+ GATE_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ template <int SCALE>
+ struct TimeParamQuantity : ScaledSquaringParamQuantity<SCALE> {
+ typedef ScaledSquaringParamQuantity<SCALE> Base;
+
+ float getDisplayValue() override {
+ auto m = dynamic_cast<Vish*>(Base::module);
+ assert(m);
+ return m->_timeScale * Base::getDisplayValue();
+ }
+
+ void setDisplayValue(float displayValue) override {
+ auto m = dynamic_cast<Vish*>(Base::module);
+ assert(m);
+ return Base::setDisplayValue(displayValue / m->_timeScale);
+ }
+ };
+
+ struct Engine {
+ Trigger trigger;
+ rack::dsp::PulseGenerator gatePulseGen;
+ 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] {};
+ float _sampleRate = 0.0f;
+ float _sampleTime = 0.0f;
+ bool _gateToTrigger = false;
+ float _timeScale = 1.0f;
+ const float _maxVelocityDb = 0.0f;
+ float _minVelocityDb = -6.0f;
+
+ Vish() {
+ config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ configParam<TimeParamQuantity<300>>(RISE_PARAM, 0.0f, 1.0f, 0.57735f, "Rise time", " ms");
+ configParam(RISE_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Rise shape");
+ configParam<TimeParamQuantity<1>>(FALL_PARAM, 0.0f, 1.0f, 0.5477226f, "Fall time", " s");
+ configParam(FALL_SHAPE_PARAM, -1.0f, 1.0f, 0.0f, "Fall shape");
+ configParam<TimeParamQuantity<1>>(MINIMUM_GATE_PARAM, 0.0f, 1.0f, 0.3162278f, "Minimum gate", " s");
+ configParam(GATE_TO_TRIGGER_PARAM, 0.0f, 1.0f, 0.0f, "Gate to trigger mode");
+ configParam(TIMES_10X_PARAM, 0.0f, 1.0f, 0.0f, "Timings 10X mode");
+ }
+
+ void reset() override;
+ void sampleRateChange() override;
+ json_t* toJson(json_t* root) override;
+ void fromJson(json_t* root) override;
+ bool active() override;
+ int channels() override;
+ void addChannel(int c) override;
+ void removeChannel(int c) override;
+ void modulate() override;
+ void modulateChannel(int c) override;
+ void processChannel(const ProcessArgs& args, int c) override;
+};
+
+} // namespace bogaudio
diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp
@@ -97,6 +97,7 @@
#include "VCF.hpp"
#include "VCM.hpp"
#include "VCO.hpp"
+#include "Vish.hpp"
#include "VU.hpp"
#include "Walk.hpp"
#include "Walk2.hpp"
@@ -146,6 +147,7 @@ void init(rack::Plugin *p) {
p->addModel(modelAD);
p->addModel(modelASR);
p->addModel(modelADSR);
+ p->addModel(modelVish);
p->addModel(modelFollow);
p->addModel(modelDGate);
p->addModel(modelRGate);
diff --git a/src/slew_common.cpp b/src/slew_common.cpp
@@ -0,0 +1,62 @@
+
+#include "slew_common.hpp"
+
+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);
+ }
+ return time * time * maxMS;
+}
+
+float RiseFallShapedSlewLimiter::shape(Param& param) {
+ float shape = clamp(param.getValue(), -1.0f, 1.0f);
+ if (shape < 0.0) {
+ shape = 1.0f + shape;
+ shape = _rise.minShape + shape * (1.0f - _rise.minShape);
+ }
+ else {
+ shape += 1.0f;
+ }
+ return shape;
+}
+
+void RiseFallShapedSlewLimiter::modulate(
+ float sampleRate,
+ Param& riseParam,
+ Input& riseInput,
+ float riseMaxMS,
+ Param& riseShapeParam,
+ Param& fallParam,
+ Input& fallInput,
+ float fallMaxMS,
+ Param& fallShapeParam,
+ int c
+) {
+ _rise.setParams(
+ sampleRate,
+ timeMS(riseParam, riseInput, riseMaxMS, c),
+ shape(riseShapeParam)
+ );
+ _fall.setParams(
+ sampleRate,
+ timeMS(fallParam, fallInput, fallMaxMS, c),
+ shape(fallShapeParam)
+ );
+}
+
+float RiseFallShapedSlewLimiter::next(float sample) {
+ if (sample > _last) {
+ if (!_rising) {
+ _rising = true;
+ _rise._last = _last;
+ }
+ return _last = _rise.next(sample);
+ }
+
+ if (_rising) {
+ _rising = false;
+ _fall._last = _last;
+ }
+ return _last = _fall.next(sample);
+}
diff --git a/src/slew_common.hpp b/src/slew_common.hpp
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "bogaudio.hpp"
+#include "dsp/signal.hpp"
+
+using namespace bogaudio::dsp;
+
+struct RiseFallShapedSlewLimiter {
+ 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);
+ void modulate(
+ float sampleRate,
+ Param& riseParam,
+ Input& riseInput,
+ float riseMaxMS,
+ Param& riseShapeParam,
+ Param& fallParam,
+ Input& fallInput,
+ float fallMaxMS,
+ Param& fallShapeParam,
+ int c
+ );
+ float next(float sample);
+};