commit 2cd6ae90343480394d5df44a2aa297e331869913
parent 24e75e9c268575f2c638ed2259413b1877a15098
Author: Matt Demanett <matt@demanett.net>
Date: Thu, 18 Feb 2021 23:00:48 -0500
LFO, LLFO, 8FO: stepped-random outputs and output smoothing.
Diffstat:
34 files changed, 1029 insertions(+), 365 deletions(-)
diff --git a/README-prerelease.md b/README-prerelease.md
@@ -162,26 +162,41 @@ _Polyphony:_ <a href="#polyphony">Polyphonic</a>, with channels defined by the V
#### <a name="lfo"></a> LFO
A standard LFO featuring:
- - Simultaneous ramp-down, ramp-up (saw), square, triangle and sine wave outputs.
+ - Simultaneous ramp-down, ramp-up (saw), triangle, stepped random, square and sine wave outputs.
- Knob and CV control of the pulse width of the square wave.
- A CV-controllable "sample" modifier, which turns the output into a step function.
- Onboard CV-controllable offset and scale of the output voltages.
+ - CV-controllable output smoothing (the CV input is shared with offset, see below).
- Reset (hard sync) input.
- Slow mode.
LFO tracks pitch CVs at the V/OCT input seven octaves lower than a normal oscillator: with a 0V input, the output frequency is note C-3 (2.04HZ). The frequency knob is calibrated in linear volts (the small ticks), and its value is added to the input V/OCT. With no input, the frequency range is from approximately 0.1 to 400HZ; with CV the frequency may be driven up to 2000HZ or down to arbitrarily low values. In slow mode, the output frequency tracks the controls four octaves lower than otherwise (11 octaves below a normal oscillator). Output is `(lfo * scale / 100) + offset`.
+The stepped random output selects a new random value in the range +/-5V once each cycle, each time the oscillator phase crosses 0. Triggering RESET will select a new value.
+
+The sampling feature is not used with the square and stepped outputs, but applies to the others.
+
+Output smoothing is applied to the signal last, after offset and scale.
+
+To save space, OFF and SMTH share a CV input port. By default this will route CV to offset. A context-menu option allows the CV to be routed to smoothing instead.
+
_Polyphony:_ <a href="#polyphony">Polyphonic</a>, with channels defined by the V/OCT input.
#### <a name="llfo"></a> LLFO
-A 3HP LFO, with selectable waveform. The features are a subset of LFO, with the addition of a sixth 10%-pulse waveform.
+A 3HP LFO, with selectable waveform. The features are a subset of LFO. There are separate square and pulse waveform options: square is fixed at a 50% duty cycle, while pulse defaults to 10% but may be adjusted with the "Pulse width" option on the context menu.
+
+Sampling and smoothing functions are available on the context menu.
_Polyphony:_ <a href="#polyphony">Polyphonic</a>, with channels defined by the V/OCT input.
#### <a name="eightfo"></a> 8FO
-An LFO with outputs at 8 different phases. The phases may be set by knobs and CVs; by default they are 0, 45, 90, etc, degrees from the fundamental. Otherwise, functionality is the same as with LFO, excepting that the wave shape is selectable, and all outputs are of the same (phase-shifted) wave.
+An LFO with outputs at 8 different phases. The phases may be set by knobs and CVs; by default they are 0, 45, 90, etc, degrees from the fundamental. Otherwise, functionality is the same as with LFO, except that:
+ - The wave shape is selectable, and all outputs are of the same (phase-shifted) wave.
+ - The sampling and pulse width knobs and CVs are combined, with their function depending on the selected wave.
+
+Note that with the stepped random output, each output will update its output when its phase crosses 0. Each draws from the same random sequence, rather than separate ones -- the outputs only vary in phase.
_Polyphony:_ <a href="#polyphony">Polyphonic</a>, with channels defined by the V/OCT input.
diff --git a/plugin.json b/plugin.json
@@ -101,6 +101,7 @@
"manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#lfo",
"tags": [
"LFO",
+ "Random",
"Polyphonic"
]
},
@@ -111,6 +112,7 @@
"manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#eightfo",
"tags": [
"LFO",
+ "Random",
"Polyphonic"
]
},
@@ -121,6 +123,7 @@
"manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#llfo",
"tags": [
"LFO",
+ "Random",
"Polyphonic"
]
},
diff --git a/res-pp/EightFO-dark-pp.svg b/res-pp/EightFO-dark-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -141,32 +144,37 @@ polyline.knob-tick {
<g transform="translate(20 35)">
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(-90) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-45) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(0) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(45) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-54) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(54) translate(11 0)"/>
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(90) translate(11 0)"/>
</g>
- <g transform="translate(14 8)">
+ <g transform="translate(13 8)">
<polyline points="0,8 12,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(33.5 13.5)">
+ <g transform="translate(30 11)">
<polyline points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(39 31)">
+ <g transform="translate(38 24)">
<path d="M 0 4 A 2 3 0 0 1 6 4" stroke-width="1" stroke="#ccc" fill="none"/>
<path d="M 6 4 A 2 3 0 0 0 12 4" stroke-width="1" stroke="#ccc" fill="none"/>
</g>
- <g transform="translate(33.5 48.5)">
+ <g transform="translate(38 38)">
<polyline points="0,4 3,0 9,8 12,4" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(14 54)">
+ <g transform="translate(30 51)">
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
+ <g transform="translate(13 54)">
+
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
</symbol>
<symbol id="dial-phase-eightfo" viewBox="0 0 40px 40px">
@@ -202,6 +210,8 @@ polyline.knob-tick {
+
+
<g transform="translate(20 20)"><svg id="FREQUENCY_PARAM">
<g transform="translate(34 34)">
<polyline points="-10,0 10,0" stroke-width="1" stroke="#00f"/>
@@ -266,9 +276,9 @@ polyline.knob-tick {
- <text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
+ <text font-size="6pt" letter-spacing="1px" transform="translate(34 130)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(78 335)">
+ <g transform="translate(10 141)">
<text font-size="6pt" letter-spacing="2px" transform="translate(9 6.1)">SLOW</text>
<g transform="translate(40 -1.3)"><svg id="SLOW_PARAM">
<g transform="translate(4.5 4.5)">
@@ -277,34 +287,32 @@ polyline.knob-tick {
</svg></g>
</g>
-
- <g transform="translate(10 163)">
-
- <g transform="translate(10 0)">
- <g transform="translate(0 5)"><svg id="WAVE_PARAM">
+ <g transform="translate(20 173)">
+ <g transform="translate(0 5)"><svg id="WAVE_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>
- <g transform="translate(70 0)">
-
-
-
-
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 38) rotate(270)">SAM/PW</text>
- <g transform="translate(20 0)"><svg id="SAMPLE_PWM_PARAM">
+
+ <use xlink:href="#waves-eightfo" transform="translate(-12 -22)" href="#waves-eightfo"/>
+ </g>
+
+ <g transform="translate(80 143)">
+
+
+
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 30) rotate(270)">S/PW</text>
+ <g transform="translate(20 0)"><svg id="SAMPLE_PWM_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
<polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
<circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- </g>
- <g transform="translate(80.5 -9.6)">
+ <g transform="translate(10.5 -9.6)">
<g transform="translate(22.5 22.5)">
<g transform="rotate(-240) translate(15 0)">
<text font-size="9.0pt" transform="translate(3 0) rotate(240) translate(-2.2 3.6)">-</text>
@@ -341,17 +349,46 @@ polyline.knob-tick {
</g>
</g>
</g>
- <use xlink:href="#waves-eightfo" transform="translate(-2 -22)" href="#waves-eightfo"/>
+ </g>
+
+ <g transform="translate(80 190)">
+
+
+
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 23) rotate(270)">SM</text>
+ <g transform="translate(20 0)"><svg id="SMOOTH_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(10.5 -9.6)">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(18 0) rotate(240) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(15 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="1" transform="rotate(60) translate(15 0)"/>
+ </g>
+ </g>
</g>
- <g transform="translate(10 226)">
+ <g transform="translate(10 235)">
<g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 36.5) rotate(270)">OFFSET</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 34.5) rotate(270)">OFFSET</text>
<g transform="translate(20 0)"><svg id="OFFSET_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
@@ -398,7 +435,7 @@ polyline.knob-tick {
</g>
</g>
<g transform="translate(70 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 32) rotate(270)">SCALE</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 32) rotate(270)">SCALE</text>
<g transform="translate(20 0)"><svg id="SCALE_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
@@ -630,9 +667,8 @@ polyline.knob-tick {
- <g class="io-group" transform="translate(0 313)">
- <rect class="input-background" width="70" height="87" rx="5" transform="translate(10 -40)"/>
- <rect class="input-background" width="108" height="43" rx="5" transform="translate(10 -40)"/>
+ <g class="io-group" transform="translate(7 313)">
+ <rect class="input-background" width="108" height="87" rx="5" transform="translate(10 -40)"/>
<g transform="translate(10 -40)">
@@ -684,5 +720,15 @@ polyline.knob-tick {
</svg></g>
<text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0 40)">RESET</text>
</g>
+ <g transform="translate(90 0)">
+
+ <g transform="translate(0 5)"><svg id="SMOOTH_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="6pt" letter-spacing="1px" transform="translate(5 40)">SM</text>
+ </g>
</g>
</svg>
diff --git a/res-pp/EightFO-lowcontrast-pp.svg b/res-pp/EightFO-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;
@@ -141,32 +144,37 @@ polyline.knob-tick {
<g transform="translate(20 35)">
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(-90) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-45) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(0) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(45) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-54) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(54) translate(11 0)"/>
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(90) translate(11 0)"/>
</g>
- <g transform="translate(14 8)">
+ <g transform="translate(13 8)">
<polyline points="0,8 12,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(33.5 13.5)">
+ <g transform="translate(30 11)">
<polyline points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(39 31)">
+ <g transform="translate(38 24)">
<path d="M 0 4 A 2 3 0 0 1 6 4" stroke-width="1" stroke="#b3b3b3" fill="none"/>
<path d="M 6 4 A 2 3 0 0 0 12 4" stroke-width="1" stroke="#b3b3b3" fill="none"/>
</g>
- <g transform="translate(33.5 48.5)">
+ <g transform="translate(38 38)">
<polyline points="0,4 3,0 9,8 12,4" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(14 54)">
+ <g transform="translate(30 51)">
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
+ <g transform="translate(13 54)">
+
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
</symbol>
<symbol id="dial-phase-eightfo" viewBox="0 0 40px 40px">
@@ -202,6 +210,8 @@ polyline.knob-tick {
+
+
<g transform="translate(20 20)"><svg id="FREQUENCY_PARAM">
<g transform="translate(34 34)">
<polyline points="-10,0 10,0" stroke-width="1" stroke="#00f"/>
@@ -266,9 +276,9 @@ polyline.knob-tick {
- <text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
+ <text font-size="6pt" letter-spacing="1px" transform="translate(34 130)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(78 335)">
+ <g transform="translate(10 141)">
<text font-size="6pt" letter-spacing="2px" transform="translate(9 6.1)">SLOW</text>
<g transform="translate(40 -1.3)"><svg id="SLOW_PARAM">
<g transform="translate(4.5 4.5)">
@@ -277,34 +287,32 @@ polyline.knob-tick {
</svg></g>
</g>
-
- <g transform="translate(10 163)">
-
- <g transform="translate(10 0)">
- <g transform="translate(0 5)"><svg id="WAVE_PARAM">
+ <g transform="translate(20 173)">
+ <g transform="translate(0 5)"><svg id="WAVE_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>
- <g transform="translate(70 0)">
-
-
-
-
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 38) rotate(270)">SAM/PW</text>
- <g transform="translate(20 0)"><svg id="SAMPLE_PWM_PARAM">
+
+ <use xlink:href="#waves-eightfo" transform="translate(-12 -22)" href="#waves-eightfo"/>
+ </g>
+
+ <g transform="translate(80 143)">
+
+
+
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 30) rotate(270)">S/PW</text>
+ <g transform="translate(20 0)"><svg id="SAMPLE_PWM_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
<polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
<circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- </g>
- <g transform="translate(80.5 -9.6)">
+ <g transform="translate(10.5 -9.6)">
<g transform="translate(22.5 22.5)">
<g transform="rotate(-240) translate(15 0)">
<text font-size="9.0pt" transform="translate(3 0) rotate(240) translate(-2.2 3.6)">-</text>
@@ -341,17 +349,46 @@ polyline.knob-tick {
</g>
</g>
</g>
- <use xlink:href="#waves-eightfo" transform="translate(-2 -22)" href="#waves-eightfo"/>
+ </g>
+
+ <g transform="translate(80 190)">
+
+
+
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 23) rotate(270)">SM</text>
+ <g transform="translate(20 0)"><svg id="SMOOTH_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(10.5 -9.6)">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(18 0) rotate(240) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(15 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="1" transform="rotate(60) translate(15 0)"/>
+ </g>
+ </g>
</g>
- <g transform="translate(10 226)">
+ <g transform="translate(10 235)">
<g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 36.5) rotate(270)">OFFSET</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 34.5) rotate(270)">OFFSET</text>
<g transform="translate(20 0)"><svg id="OFFSET_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
@@ -398,7 +435,7 @@ polyline.knob-tick {
</g>
</g>
<g transform="translate(70 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 32) rotate(270)">SCALE</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 32) rotate(270)">SCALE</text>
<g transform="translate(20 0)"><svg id="SCALE_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
@@ -630,9 +667,8 @@ polyline.knob-tick {
- <g class="io-group" transform="translate(0 313)">
- <rect class="input-background" width="70" height="87" rx="5" transform="translate(10 -40)"/>
- <rect class="input-background" width="108" height="43" rx="5" transform="translate(10 -40)"/>
+ <g class="io-group" transform="translate(7 313)">
+ <rect class="input-background" width="108" height="87" rx="5" transform="translate(10 -40)"/>
<g transform="translate(10 -40)">
@@ -684,5 +720,15 @@ polyline.knob-tick {
</svg></g>
<text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0 40)">RESET</text>
</g>
+ <g transform="translate(90 0)">
+
+ <g transform="translate(0 5)"><svg id="SMOOTH_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="6pt" letter-spacing="1px" transform="translate(5 40)">SM</text>
+ </g>
</g>
</svg>
diff --git a/res-pp/EightFO-pp.svg b/res-pp/EightFO-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -77,32 +80,37 @@ polyline.knob-tick {
<g transform="translate(20 35)">
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(-90) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-45) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(0) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(45) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-54) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(54) translate(11 0)"/>
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(90) translate(11 0)"/>
</g>
- <g transform="translate(14 8)">
+ <g transform="translate(13 8)">
<polyline points="0,8 12,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(33.5 13.5)">
+ <g transform="translate(30 11)">
<polyline points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(39 31)">
+ <g transform="translate(38 24)">
<path d="M 0 4 A 2 3 0 0 1 6 4" stroke-width="1" stroke="#333" fill="none"/>
<path d="M 6 4 A 2 3 0 0 0 12 4" stroke-width="1" stroke="#333" fill="none"/>
</g>
- <g transform="translate(33.5 48.5)">
+ <g transform="translate(38 38)">
<polyline points="0,4 3,0 9,8 12,4" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(14 54)">
+ <g transform="translate(30 51)">
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
+ <g transform="translate(13 54)">
+
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
</symbol>
<symbol id="dial-phase-eightfo" viewBox="0 0 40px 40px">
@@ -138,6 +146,8 @@ polyline.knob-tick {
+
+
<g transform="translate(20 20)"><svg id="FREQUENCY_PARAM">
<g transform="translate(34 34)">
<polyline points="-10,0 10,0" stroke-width="1" stroke="#00f"/>
@@ -202,9 +212,9 @@ polyline.knob-tick {
- <text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
+ <text font-size="6pt" letter-spacing="1px" transform="translate(34 130)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(78 335)">
+ <g transform="translate(10 141)">
<text font-size="6pt" letter-spacing="2px" transform="translate(9 6.1)">SLOW</text>
<g transform="translate(40 -1.3)"><svg id="SLOW_PARAM">
<g transform="translate(4.5 4.5)">
@@ -213,34 +223,32 @@ polyline.knob-tick {
</svg></g>
</g>
-
- <g transform="translate(10 163)">
-
- <g transform="translate(10 0)">
- <g transform="translate(0 5)"><svg id="WAVE_PARAM">
+ <g transform="translate(20 173)">
+ <g transform="translate(0 5)"><svg id="WAVE_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>
- <g transform="translate(70 0)">
-
-
-
-
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 38) rotate(270)">SAM/PW</text>
- <g transform="translate(20 0)"><svg id="SAMPLE_PWM_PARAM">
+
+ <use xlink:href="#waves-eightfo" transform="translate(-12 -22)" href="#waves-eightfo"/>
+ </g>
+
+ <g transform="translate(80 143)">
+
+
+
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 30) rotate(270)">S/PW</text>
+ <g transform="translate(20 0)"><svg id="SAMPLE_PWM_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
<polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
<circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
</g>
</svg></g>
- </g>
- <g transform="translate(80.5 -9.6)">
+ <g transform="translate(10.5 -9.6)">
<g transform="translate(22.5 22.5)">
<g transform="rotate(-240) translate(15 0)">
<text font-size="9.0pt" transform="translate(3 0) rotate(240) translate(-2.2 3.6)">-</text>
@@ -277,17 +285,46 @@ polyline.knob-tick {
</g>
</g>
</g>
- <use xlink:href="#waves-eightfo" transform="translate(-2 -22)" href="#waves-eightfo"/>
+ </g>
+
+ <g transform="translate(80 190)">
+
+
+
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 23) rotate(270)">SM</text>
+ <g transform="translate(20 0)"><svg id="SMOOTH_PARAM">
+ <g transform="translate(13 13)">
+ <polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
+ <polyline points="0,-3 0,3" stroke-width="1" stroke="#00f"/>
+ <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(10.5 -9.6)">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(18 0) rotate(240) translate(-2 2)">0</text>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-210) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-180) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-150) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-120) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-90) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-60) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(-30) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(0) translate(15 0)"/>
+ <polyline points="0,0 2.5,0" stroke-width="0.7" transform="rotate(30) translate(15 0)"/>
+ <polyline points="0,0 3.5,0" stroke-width="1" transform="rotate(60) translate(15 0)"/>
+ </g>
+ </g>
</g>
- <g transform="translate(10 226)">
+ <g transform="translate(10 235)">
<g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 36.5) rotate(270)">OFFSET</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 34.5) rotate(270)">OFFSET</text>
<g transform="translate(20 0)"><svg id="OFFSET_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
@@ -334,7 +371,7 @@ polyline.knob-tick {
</g>
</g>
<g transform="translate(70 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 32) rotate(270)">SCALE</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 32) rotate(270)">SCALE</text>
<g transform="translate(20 0)"><svg id="SCALE_PARAM">
<g transform="translate(13 13)">
<polyline points="-3,0 3,0" stroke-width="1" stroke="#00f"/>
@@ -566,9 +603,8 @@ polyline.knob-tick {
- <g class="io-group" transform="translate(0 313)">
- <rect class="input-background" width="70" height="87" rx="5" transform="translate(10 -40)"/>
- <rect class="input-background" width="108" height="43" rx="5" transform="translate(10 -40)"/>
+ <g class="io-group" transform="translate(7 313)">
+ <rect class="input-background" width="108" height="87" rx="5" transform="translate(10 -40)"/>
<g transform="translate(10 -40)">
@@ -620,5 +656,15 @@ polyline.knob-tick {
</svg></g>
<text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0 40)">RESET</text>
</g>
+ <g transform="translate(90 0)">
+
+ <g transform="translate(0 5)"><svg id="SMOOTH_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="6pt" letter-spacing="1px" transform="translate(5 40)">SM</text>
+ </g>
</g>
</svg>
diff --git a/res-pp/LFO-dark-pp.svg b/res-pp/LFO-dark-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -152,6 +155,8 @@ polyline.knob-tick {
+
+
<g transform="translate(21 25)">
@@ -223,9 +228,9 @@ polyline.knob-tick {
<text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(110.5 238.5)">
+ <g transform="translate(14 133) rotate(-90)">
<text font-size="6pt" letter-spacing="1px" transform="translate(0 6.1)">SLOW</text>
- <g transform="translate(26.5 -1)"><svg id="SLOW_PARAM">
+ <g transform="translate(27.5 -1.5)"><svg id="SLOW_PARAM">
<g transform="translate(4.5 4.5)">
<circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
</g>
@@ -311,19 +316,40 @@ polyline.knob-tick {
</g>
</g>
- <g transform="translate(10 196)">
- <g transform="translate(7 0)">
+ <g transform="translate(0 196)">
+ <g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
- <g transform="translate(25 0)"><svg id="OFFSET_PARAM">
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 16) rotate(270)">SM</text>
+ <g transform="translate(17 0)"><svg id="SMOOTH_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(5 -12)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
</g>
- <g transform="translate(20 -12)">
+ </g>
+ <g transform="translate(56 0)">
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
+ <g transform="translate(17 0)"><svg id="OFFSET_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(5 -12)">
<g transform="translate(20 20)">
<polyline points="0,0 4,0" stroke-width="1" transform="rotate(-90) translate(10 0)"/>
<path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(20)"/>
@@ -332,25 +358,28 @@ polyline.knob-tick {
<path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(-43)"/>
</g>
</g>
- <g transform="translate(72 0)">
+ </g>
+ <g transform="translate(102 0)">
<text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">SCL</text>
- <g transform="translate(25 0)"><svg id="SCALE_PARAM">
+ <g transform="translate(17 0)"><svg id="SCALE_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>
- <g transform="translate(85 -12)">
+ <g transform="translate(5 -12)">
<g transform="translate(20 20)">
- <polyline points="0,0 4,0" stroke-width="1" transform="rotate(-240) translate(10 0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(43)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(-43)"/>
- </g>
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
</g>
@@ -359,10 +388,8 @@ polyline.knob-tick {
<g class="io-group" transform="translate(0 225)">
- <rect class="output-background" width="130" height="91" rx="5" transform="translate(10 44)"/>
- <rect class="output-background" width="97.5" height="135" rx="5" transform="translate(10 0)"/>
+ <rect class="output-background" width="130" height="135" rx="5" transform="translate(10 0)"/>
<rect class="input-background" width="65" height="135" rx="5" transform="translate(10 0)"/>
- <rect class="input-background-filler" width="10" height="8" transform="translate(32.5 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 127)"/>
@@ -373,7 +400,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(5 40)">SAM</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SAM</text>
</g>
<g transform="translate(44 0)">
<g transform="translate(3 5)"><svg id="PW_INPUT">
@@ -382,7 +409,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(8 40)">PW</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">PW</text>
</g>
<g transform="translate(76 0)">
<g transform="translate(3 5)"><svg id="RAMP_DOWN_OUTPUT">
@@ -397,6 +424,19 @@ polyline.knob-tick {
<polyline class="output-label" points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
</g>
+ <g transform="translate(108 0)">
+ <g transform="translate(3 5)"><svg id="STEPPED_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>
+
+ <g transform="translate(9 33.5)">
+
+ <polyline class="output-label" points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
<g transform="translate(0 44)">
<g transform="translate(12 0)">
@@ -406,7 +446,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">OFF</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(15 40)">OFF/SM</text>
</g>
<g transform="translate(44 0)">
<g transform="translate(3 5)"><svg id="SCALE_INPUT">
@@ -415,7 +455,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">SCL</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SCL</text>
</g>
<g transform="translate(76 0)">
<g transform="translate(3 5)"><svg id="RAMP_UP_OUTPUT">
@@ -450,7 +490,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(1 40)">V/OCT</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">V/OCT</text>
</g>
<g transform="translate(34 0)">
<g transform="translate(3 5)"><svg id="RESET_INPUT">
@@ -459,7 +499,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0.7 40)">RESET</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">RESET</text>
</g>
<g transform="translate(66 0)">
<g transform="translate(3 5)"><svg id="TRIANGLE_OUTPUT">
diff --git a/res-pp/LFO-lowcontrast-pp.svg b/res-pp/LFO-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;
@@ -152,6 +155,8 @@ polyline.knob-tick {
+
+
<g transform="translate(21 25)">
@@ -223,9 +228,9 @@ polyline.knob-tick {
<text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(110.5 238.5)">
+ <g transform="translate(14 133) rotate(-90)">
<text font-size="6pt" letter-spacing="1px" transform="translate(0 6.1)">SLOW</text>
- <g transform="translate(26.5 -1)"><svg id="SLOW_PARAM">
+ <g transform="translate(27.5 -1.5)"><svg id="SLOW_PARAM">
<g transform="translate(4.5 4.5)">
<circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
</g>
@@ -311,19 +316,40 @@ polyline.knob-tick {
</g>
</g>
- <g transform="translate(10 196)">
- <g transform="translate(7 0)">
+ <g transform="translate(0 196)">
+ <g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
- <g transform="translate(25 0)"><svg id="OFFSET_PARAM">
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 16) rotate(270)">SM</text>
+ <g transform="translate(17 0)"><svg id="SMOOTH_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(5 -12)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
- <g transform="translate(20 -12)">
+ <g transform="translate(56 0)">
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
+ <g transform="translate(17 0)"><svg id="OFFSET_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(5 -12)">
<g transform="translate(20 20)">
<polyline points="0,0 4,0" stroke-width="1" transform="rotate(-90) translate(10 0)"/>
<path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(20)"/>
@@ -332,25 +358,28 @@ polyline.knob-tick {
<path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(-43)"/>
</g>
</g>
- <g transform="translate(72 0)">
+ </g>
+ <g transform="translate(102 0)">
<text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">SCL</text>
- <g transform="translate(25 0)"><svg id="SCALE_PARAM">
+ <g transform="translate(17 0)"><svg id="SCALE_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>
- <g transform="translate(85 -12)">
+ <g transform="translate(5 -12)">
<g transform="translate(20 20)">
- <polyline points="0,0 4,0" stroke-width="1" transform="rotate(-240) translate(10 0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(43)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(-43)"/>
- </g>
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
</g>
@@ -359,10 +388,8 @@ polyline.knob-tick {
<g class="io-group" transform="translate(0 225)">
- <rect class="output-background" width="130" height="91" rx="5" transform="translate(10 44)"/>
- <rect class="output-background" width="97.5" height="135" rx="5" transform="translate(10 0)"/>
+ <rect class="output-background" width="130" height="135" rx="5" transform="translate(10 0)"/>
<rect class="input-background" width="65" height="135" rx="5" transform="translate(10 0)"/>
- <rect class="input-background-filler" width="10" height="8" transform="translate(32.5 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 127)"/>
@@ -373,7 +400,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(5 40)">SAM</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SAM</text>
</g>
<g transform="translate(44 0)">
<g transform="translate(3 5)"><svg id="PW_INPUT">
@@ -382,7 +409,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(8 40)">PW</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">PW</text>
</g>
<g transform="translate(76 0)">
<g transform="translate(3 5)"><svg id="RAMP_DOWN_OUTPUT">
@@ -397,6 +424,19 @@ polyline.knob-tick {
<polyline class="output-label" points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
</g>
+ <g transform="translate(108 0)">
+ <g transform="translate(3 5)"><svg id="STEPPED_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>
+
+ <g transform="translate(9 33.5)">
+
+ <polyline class="output-label" points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
<g transform="translate(0 44)">
<g transform="translate(12 0)">
@@ -406,7 +446,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">OFF</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(15 40)">OFF/SM</text>
</g>
<g transform="translate(44 0)">
<g transform="translate(3 5)"><svg id="SCALE_INPUT">
@@ -415,7 +455,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">SCL</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SCL</text>
</g>
<g transform="translate(76 0)">
<g transform="translate(3 5)"><svg id="RAMP_UP_OUTPUT">
@@ -450,7 +490,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(1 40)">V/OCT</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">V/OCT</text>
</g>
<g transform="translate(34 0)">
<g transform="translate(3 5)"><svg id="RESET_INPUT">
@@ -459,7 +499,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0.7 40)">RESET</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">RESET</text>
</g>
<g transform="translate(66 0)">
<g transform="translate(3 5)"><svg id="TRIANGLE_OUTPUT">
diff --git a/res-pp/LFO-pp.svg b/res-pp/LFO-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -88,6 +91,8 @@ polyline.knob-tick {
+
+
<g transform="translate(21 25)">
@@ -159,9 +164,9 @@ polyline.knob-tick {
<text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(110.5 238.5)">
+ <g transform="translate(14 133) rotate(-90)">
<text font-size="6pt" letter-spacing="1px" transform="translate(0 6.1)">SLOW</text>
- <g transform="translate(26.5 -1)"><svg id="SLOW_PARAM">
+ <g transform="translate(27.5 -1.5)"><svg id="SLOW_PARAM">
<g transform="translate(4.5 4.5)">
<circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
</g>
@@ -247,19 +252,40 @@ polyline.knob-tick {
</g>
</g>
- <g transform="translate(10 196)">
- <g transform="translate(7 0)">
+ <g transform="translate(0 196)">
+ <g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
- <g transform="translate(25 0)"><svg id="OFFSET_PARAM">
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 16) rotate(270)">SM</text>
+ <g transform="translate(17 0)"><svg id="SMOOTH_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(5 -12)">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
</g>
- <g transform="translate(20 -12)">
+ </g>
+ <g transform="translate(56 0)">
+
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
+ <g transform="translate(17 0)"><svg id="OFFSET_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(5 -12)">
<g transform="translate(20 20)">
<polyline points="0,0 4,0" stroke-width="1" transform="rotate(-90) translate(10 0)"/>
<path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(20)"/>
@@ -268,25 +294,28 @@ polyline.knob-tick {
<path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(-43)"/>
</g>
</g>
- <g transform="translate(72 0)">
+ </g>
+ <g transform="translate(102 0)">
<text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">SCL</text>
- <g transform="translate(25 0)"><svg id="SCALE_PARAM">
+ <g transform="translate(17 0)"><svg id="SCALE_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>
- <g transform="translate(85 -12)">
+ <g transform="translate(5 -12)">
<g transform="translate(20 20)">
- <polyline points="0,0 4,0" stroke-width="1" transform="rotate(-240) translate(10 0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(43)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(-43)"/>
- </g>
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
</g>
@@ -295,10 +324,8 @@ polyline.knob-tick {
<g class="io-group" transform="translate(0 225)">
- <rect class="output-background" width="130" height="91" rx="5" transform="translate(10 44)"/>
- <rect class="output-background" width="97.5" height="135" rx="5" transform="translate(10 0)"/>
+ <rect class="output-background" width="130" height="135" rx="5" transform="translate(10 0)"/>
<rect class="input-background" width="65" height="135" rx="5" transform="translate(10 0)"/>
- <rect class="input-background-filler" width="10" height="8" transform="translate(32.5 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 127)"/>
@@ -309,7 +336,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(5 40)">SAM</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SAM</text>
</g>
<g transform="translate(44 0)">
<g transform="translate(3 5)"><svg id="PW_INPUT">
@@ -318,7 +345,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(8 40)">PW</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">PW</text>
</g>
<g transform="translate(76 0)">
<g transform="translate(3 5)"><svg id="RAMP_DOWN_OUTPUT">
@@ -333,6 +360,19 @@ polyline.knob-tick {
<polyline class="output-label" points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
</g>
+ <g transform="translate(108 0)">
+ <g transform="translate(3 5)"><svg id="STEPPED_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>
+
+ <g transform="translate(9 33.5)">
+
+ <polyline class="output-label" points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
<g transform="translate(0 44)">
<g transform="translate(12 0)">
@@ -342,7 +382,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">OFF</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(15 40)">OFF/SM</text>
</g>
<g transform="translate(44 0)">
<g transform="translate(3 5)"><svg id="SCALE_INPUT">
@@ -351,7 +391,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">SCL</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SCL</text>
</g>
<g transform="translate(76 0)">
<g transform="translate(3 5)"><svg id="RAMP_UP_OUTPUT">
@@ -386,7 +426,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(1 40)">V/OCT</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">V/OCT</text>
</g>
<g transform="translate(34 0)">
<g transform="translate(3 5)"><svg id="RESET_INPUT">
@@ -395,7 +435,7 @@ polyline.knob-tick {
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
</g>
</svg></g>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0.7 40)">RESET</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">RESET</text>
</g>
<g transform="translate(66 0)">
<g transform="translate(3 5)"><svg id="TRIANGLE_OUTPUT">
diff --git a/res-pp/LLFO-dark-pp.svg b/res-pp/LLFO-dark-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -240,6 +243,16 @@ polyline.knob-tick {
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
</g>
+
+ <g transform="translate(0 39)">
+ <g transform="translate(-7.5 1)"><svg id="STEPPED_LIGHT">
+ <rect width="6.4" height="6.4" fill="#0f0"/>
+ </svg></g>
+ <g transform="translate(1 1) scale(0.8)">
+
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
<g transform="translate(31 0)">
@@ -274,7 +287,7 @@ polyline.knob-tick {
</g>
</g>
- <g transform="translate(17.5 38)"><svg id="WAVE_PARAM">
+ <g transform="translate(29 38)"><svg id="WAVE_PARAM">
<g transform="translate(4.5 4.5)">
<circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
</g>
@@ -314,12 +327,14 @@ polyline.knob-tick {
</svg></g>
<g transform="translate(2.2 -2.5)">
<g transform="translate(20 20)">
- <polyline points="0,0 4,0" stroke-width="1" transform="rotate(-240) translate(10 0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(43)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(-43)"/>
- </g>
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#ccc" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
</g>
</g>
diff --git a/res-pp/LLFO-lowcontrast-pp.svg b/res-pp/LLFO-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;
@@ -240,6 +243,16 @@ polyline.knob-tick {
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
</g>
+
+ <g transform="translate(0 39)">
+ <g transform="translate(-7.5 1)"><svg id="STEPPED_LIGHT">
+ <rect width="6.4" height="6.4" fill="#0f0"/>
+ </svg></g>
+ <g transform="translate(1 1) scale(0.8)">
+
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
<g transform="translate(31 0)">
@@ -274,7 +287,7 @@ polyline.knob-tick {
</g>
</g>
- <g transform="translate(17.5 38)"><svg id="WAVE_PARAM">
+ <g transform="translate(29 38)"><svg id="WAVE_PARAM">
<g transform="translate(4.5 4.5)">
<circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
</g>
@@ -314,12 +327,14 @@ polyline.knob-tick {
</svg></g>
<g transform="translate(2.2 -2.5)">
<g transform="translate(20 20)">
- <polyline points="0,0 4,0" stroke-width="1" transform="rotate(-240) translate(10 0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(43)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(-43)"/>
- </g>
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#b3b3b3" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
</g>
</g>
diff --git a/res-pp/LLFO-pp.svg b/res-pp/LLFO-pp.svg
@@ -17,6 +17,9 @@ text.brand {
polyline {
stroke: #333;
}
+polyline.guide {
+ stroke: #0f0;
+}
path {
stroke: #333;
}
@@ -176,6 +179,16 @@ polyline.knob-tick {
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
</g>
+
+ <g transform="translate(0 39)">
+ <g transform="translate(-7.5 1)"><svg id="STEPPED_LIGHT">
+ <rect width="6.4" height="6.4" fill="#0f0"/>
+ </svg></g>
+ <g transform="translate(1 1) scale(0.8)">
+
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
<g transform="translate(31 0)">
@@ -210,7 +223,7 @@ polyline.knob-tick {
</g>
</g>
- <g transform="translate(17.5 38)"><svg id="WAVE_PARAM">
+ <g transform="translate(29 38)"><svg id="WAVE_PARAM">
<g transform="translate(4.5 4.5)">
<circle r="4" stroke-width="1" stroke="#00f" fill="#f00"/>
</g>
@@ -250,12 +263,14 @@ polyline.knob-tick {
</svg></g>
<g transform="translate(2.2 -2.5)">
<g transform="translate(20 20)">
- <polyline points="0,0 4,0" stroke-width="1" transform="rotate(-240) translate(10 0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(43)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
- <path d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(-43)"/>
- </g>
+ <polyline points="0,0 4.166666666666667,0" stroke-width="1" transform="rotate(-240) translate(10.0 0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 1 12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(43)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(0)"/>
+ <path class="0.0" d="M 0 -12.5 A 12.5 12.5 0 0 0 -12.5 0" stroke-width="0.7" stroke-linecap="round" stroke="#333" fill="none" transform="rotate(-43)"/>
+ <polyline points="-3,0 3,0" stroke-width="1" fill="none"/>
+ <polyline points="0,-3 0,3" stroke-width="1" fill="none"/>
+ </g>
</g>
</g>
diff --git a/res-src/EightFO-src.svg b/res-src/EightFO-src.svg
@@ -8,32 +8,37 @@
<g transform="translate(20 35)">
<!-- <circle r="18" fill="none" stroke="#00f" /> -->
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(-90) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-45) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(0) translate(11 0)"/>
- <polyline points="0,0 5,0" stroke-width="1" transform="rotate(45) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-54) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(-18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(18) translate(11 0)"/>
+ <polyline points="0,0 5,0" stroke-width="1" transform="rotate(54) translate(11 0)"/>
<polyline points="0,0 5,0" stroke-width="1" transform="rotate(90) translate(11 0)"/>
</g>
- <g transform="translate(14 8)">
+ <g transform="translate(13 8)">
<!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
<polyline points="0,8 12,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(33.5 13.5)">
+ <g transform="translate(30 11)">
<!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
<polyline points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(39 31)">
+ <g transform="translate(38 24)">
<!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
<path d="M 0 4 A 2 3 0 0 1 6 4" stroke-width="1" stroke="#333" fill="none"/>
<path d="M 6 4 A 2 3 0 0 0 12 4" stroke-width="1" stroke="#333" fill="none"/>
</g>
- <g transform="translate(33.5 48.5)">
+ <g transform="translate(38 38)">
<!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
<polyline points="0,4 3,0 9,8 12,4" stroke-width="1" fill="none"/>
</g>
- <g transform="translate(14 54)">
+ <g transform="translate(30 51)">
<!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
+ <g transform="translate(13 54)">
+ <!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
</symbol>
<symbol id="dial-phase-eightfo" viewBox="0 0 40px 40px">
@@ -55,51 +60,60 @@
<!-- <rect width="108" height="108" fill="none" stroke="#0f0" /> -->
<!-- <polyline points="0,54 54,54" stroke="#0f0" stroke-width="1" fill="none" /> -->
<!-- <polyline points="54,54 54,354" stroke="#0f0" stroke-width="1" fill="none" /> -->
+ <!-- <polyline points="40,54 40,354" stroke="#0f0" stroke-width="1" fill="none" /> -->
+ <!-- <polyline points="68,54 68,354" stroke="#0f0" stroke-width="1" fill="none" /> -->
<def id="FREQUENCY_PARAM" xlink:href="#knob68" transform="translate(20 20)"/>
</g>
<def xlink:href="#dial-frequency-lfo" transform="translate(10 15)"/>
<!-- <rect width="20" height="10" fill="#0f0" transform="translate(20 130)" /> -->
<!-- <rect width="20" height="10" fill="#0f0" transform="translate(108 130)" /> -->
- <text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
+ <text font-size="6pt" letter-spacing="1px" transform="translate(34 130)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(78 335)">
+ <g transform="translate(10 141)">
<text font-size="6pt" letter-spacing="2px" transform="translate(9 6.1)">SLOW</text>
<def id="SLOW_PARAM" xlink:href="#button-small" transform="translate(40 -1.3)"/>
</g>
- <!-- <rect width="230" height="10" fill="#0f0" transform="translate(0 137)" /> -->
- <g transform="translate(10 163)">
- <!-- <polyline points="0,0 170,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(10 13)" /> -->
- <g transform="translate(10 0)">
- <def id="WAVE_PARAM" xlink:href="#knob16" transform="translate(0 5)"/>
- <!-- <rect width="60" height="60" fill="none" stroke="#0f0" transform="translate(-10 -30) translate(8 13)" /> -->
- </g>
- <g transform="translate(70 0)">
- <!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(-10 -10)" /> -->
- <!-- <polyline points="0,0 170,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(-10 13)" /> -->
- <!-- <polyline points="0,0 0,170" stroke="#0f0" stroke-width="1" fill="none" transform="translate(33 -13)" /> -->
- <!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(-10 33)" /> -->
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 38) rotate(270)">SAM/PW</text>
- <def id="SAMPLE_PWM_PARAM" xlink:href="#knob26" transform="translate(20 0)"/>
- </g>
- <def xlink:href="#dial-attenuverter" transform="translate(80.5 -9.6)"/>
- <use xlink:href="#waves-eightfo" transform="translate(-2 -22)"/>
+ <g transform="translate(20 173)">
+ <def id="WAVE_PARAM" xlink:href="#knob16" transform="translate(0 5)"/>
+ <!-- <rect width="60" height="60" fill="none" stroke="#0f0" transform="translate(-10 -30) translate(8 13)" /> -->
+ <use xlink:href="#waves-eightfo" transform="translate(-12 -22)"/>
+ </g>
+
+ <g transform="translate(80 143)">
+ <!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(-10 -10)" /> -->
+ <!-- <polyline points="0,0 170,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(-10 13)" /> -->
+ <!-- <polyline points="0,0 0,170" stroke="#0f0" stroke-width="1" fill="none" transform="translate(33 -13)" /> -->
+ <!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(-10 33)" /> -->
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 30) rotate(270)">S/PW</text>
+ <def id="SAMPLE_PWM_PARAM" xlink:href="#knob26" transform="translate(20 0)"/>
+ <def xlink:href="#dial-attenuverter" transform="translate(10.5 -9.6)"/>
+ </g>
+
+ <g transform="translate(80 190)">
+ <!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(-10 -10)" /> -->
+ <!-- <polyline points="0,0 170,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(-10 13)" /> -->
+ <!-- <polyline points="0,0 0,170" stroke="#0f0" stroke-width="1" fill="none" transform="translate(33 -13)" /> -->
+ <!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(-10 33)" /> -->
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 23) rotate(270)">SM</text>
+ <def id="SMOOTH_PARAM" xlink:href="#knob26" transform="translate(20 0)"/>
+ <def xlink:href="#dial-linear" transform="translate(10.5 -9.6)"/>
</g>
<!-- <rect width="230" height="10" fill="#0f0" transform="translate(0 203)" /> -->
- <g transform="translate(10 226)">
+ <g transform="translate(10 235)">
<!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(10 -10)" /> -->
<!-- <polyline points="0,0 170,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(10 13)" /> -->
<!-- <polyline points="0,0 0,170" stroke="#0f0" stroke-width="1" fill="none" transform="translate(43 -13)" /> -->
<!-- <polyline points="0,0 170,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(10 33)" /> -->
<g transform="translate(10 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 36.5) rotate(270)">OFFSET</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 34.5) rotate(270)">OFFSET</text>
<def id="OFFSET_PARAM" xlink:href="#knob26" transform="translate(20 0)"/>
</g>
<def xlink:href="#dial-attenuverter" transform="translate(20.5 -9.6)"/>
<g transform="translate(70 0)">
- <text font-size="8pt" letter-spacing="2px" transform="translate(8 32) rotate(270)">SCALE</text>
+ <text font-size="8pt" letter-spacing="1px" transform="translate(8 32) rotate(270)">SCALE</text>
<def id="SCALE_PARAM" xlink:href="#knob26" transform="translate(20 0)"/>
</g>
<def xlink:href="#dial-linear" transform="translate(80.5 -9.6)"/>
@@ -183,9 +197,8 @@
<!-- <polyline points="0,0 0,360" stroke="#0f0" stroke-width="1" fill="none" transform="translate(135 0)" /> -->
<!-- <polyline points="0,0 270,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 360)" /> -->
<!-- <rect width="230" height="10" fill="#0f0" transform="translate(0 263)" /> -->
- <g class="io-group" transform="translate(0 313)">
- <rect class="input-background" width="70" height="87" rx="5" transform="translate(10 -40)"/>
- <rect class="input-background" width="108" height="43" rx="5" transform="translate(10 -40)"/>
+ <g class="io-group" transform="translate(7 313)">
+ <rect class="input-background" width="108" height="87" rx="5" transform="translate(10 -40)"/>
<!-- <rect width="300" height="7" fill="#f00" transform="translate(10 40)" /> -->
<g transform="translate(10 -40)">
<!-- <rect width="30" height="40" rx="5" fill="#fafafa" /> -->
@@ -212,5 +225,10 @@
<def id="RESET_INPUT" xlink:href="#input" transform="translate(2 5)"/>
<text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0 40)">RESET</text>
</g>
+ <g transform="translate(90 0)">
+ <!-- <rect width="30" height="47" rx="5" fill="#fafafa" /> -->
+ <def id="SMOOTH_INPUT" xlink:href="#input" transform="translate(0 5)"/>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(5 40)">SM</text>
+ </g>
</g>
</module>
diff --git a/res-src/LFO-src.svg b/res-src/LFO-src.svg
@@ -5,6 +5,8 @@
<def xlink:href="#module" var-name="LFO"/>
<!-- <polyline points="0,0 0,354" stroke="#0f0" stroke-width="1" fill="none" transform="translate(75 0)" /> -->
+ <!-- <polyline points="0,0 0,354" stroke="#0f0" stroke-width="1" fill="none" transform="translate(60 0)" /> -->
+ <!-- <polyline points="0,0 0,354" stroke="#0f0" stroke-width="1" fill="none" transform="translate(90 0)" /> -->
<g transform="translate(21 25)">
<!-- <rect width="108" height="108" fill="none" stroke="#0f0" /> -->
@@ -18,9 +20,9 @@
<!-- <rect width="20" height="10" fill="#0f0" transform="translate(108 130)" /> -->
<text font-size="6pt" letter-spacing="1px" transform="translate(34 133)">0V = C-3 = 2.04HZ</text>
- <g transform="translate(110.5 238.5)">
+ <g transform="translate(14 133) rotate(-90)">
<text font-size="6pt" letter-spacing="1px" transform="translate(0 6.1)">SLOW</text>
- <def id="SLOW_PARAM" xlink:href="#button-small" transform="translate(26.5 -1)"/>
+ <def id="SLOW_PARAM" xlink:href="#button-small" transform="translate(27.5 -1.5)"/>
</g>
<g transform="translate(10 150)">
@@ -40,19 +42,25 @@
<def xlink:href="#dial-attenuverter" transform="translate(82.5 -9.6)"/>
</g>
- <g transform="translate(10 196)">
- <g transform="translate(7 0)">
- <!-- <rect width="52" height="38" fill="none" stroke="#0f0" transform="translate(0 -7)" /> -->
+ <g transform="translate(0 196)">
+ <g transform="translate(10 0)">
+ <!-- <rect width="38" height="30" fill="none" stroke="#0f0" transform="translate(0 -9)" /> -->
+ <text font-size="8pt" letter-spacing="2px" transform="translate(8 16) rotate(270)">SM</text>
+ <def id="SMOOTH_PARAM" xlink:href="#knob16" transform="translate(17 0)"/>
+ <def xlink:href="#dial-mintick" transform="translate(5 -12)"/>
+ </g>
+ <g transform="translate(56 0)">
+ <!-- <rect width="38" height="30" fill="none" stroke="#0f0" transform="translate(0 -9)" /> -->
<text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">OFF</text>
- <def id="OFFSET_PARAM" xlink:href="#knob16" transform="translate(25 0)"/>
+ <def id="OFFSET_PARAM" xlink:href="#knob16" transform="translate(17 0)"/>
+ <def xlink:href="#dial-centertick" transform="translate(5 -12)"/>
</g>
- <def xlink:href="#dial-centertick" transform="translate(20 -12)"/>
- <g transform="translate(72 0)">
- <!-- <rect width="52" height="38" fill="none" stroke="#0f0" transform="translate(0 -7)" /> -->
+ <g transform="translate(102 0)">
+ <!-- <rect width="38" height="30" fill="none" stroke="#0f0" transform="translate(0 -9)" /> -->
<text font-size="8pt" letter-spacing="2px" transform="translate(8 18) rotate(270)">SCL</text>
- <def id="SCALE_PARAM" xlink:href="#knob16" transform="translate(25 0)"/>
+ <def id="SCALE_PARAM" xlink:href="#knob16" transform="translate(17 0)"/>
+ <def xlink:href="#dial-mintick" transform="translate(5 -12)"/>
</g>
- <def xlink:href="#dial-mintick" transform="translate(85 -12)"/>
</g>
<!-- <rect width="50" height="10" fill="#0f0" transform="translate(0 137)" /> -->
@@ -60,20 +68,18 @@
<!-- <rect width="50" height="10" fill="#0f0" transform="translate(0 215)" /> -->
<g class="io-group" transform="translate(0 225)">
- <rect class="output-background" width="130" height="91" rx="5" transform="translate(10 44)"/>
- <rect class="output-background" width="97.5" height="135" rx="5" transform="translate(10 0)"/>
+ <rect class="output-background" width="130" height="135" rx="5" transform="translate(10 0)"/>
<rect class="input-background" width="65" height="135" rx="5" transform="translate(10 0)"/>
- <rect class="input-background-filler" width="10" height="8" transform="translate(32.5 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 0)"/>
<rect class="input-background-filler" width="10" height="8" transform="translate(65 127)"/>
<g transform="translate(12 0)">
<def id="SAMPLE_INPUT" xlink:href="#input" transform="translate(3 5)"/>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(5 40)">SAM</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SAM</text>
</g>
<g transform="translate(44 0)">
<def id="PW_INPUT" xlink:href="#input" transform="translate(3 5)"/>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(8 40)">PW</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">PW</text>
</g>
<g transform="translate(76 0)">
<def id="RAMP_DOWN_OUTPUT" xlink:href="#output" transform="translate(3 5)"/>
@@ -83,15 +89,23 @@
<polyline class="output-label" points="0,8 0,0 12,8" stroke-width="1" fill="none"/>
</g>
</g>
+ <g transform="translate(108 0)">
+ <def id="STEPPED_OUTPUT" xlink:href="#output" transform="translate(3 5)"/>
+ <!-- <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 40)">SQR</text> -->
+ <g transform="translate(9 33.5)">
+ <!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#0f0" /> -->
+ <polyline class="output-label" points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
<g transform="translate(0 44)">
<g transform="translate(12 0)">
<def id="OFFSET_INPUT" xlink:href="#input" transform="translate(3 5)"/>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">OFF</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.5px" text-anchor="middle" transform="translate(15 40)">OFF/SM</text>
</g>
<g transform="translate(44 0)">
<def id="SCALE_INPUT" xlink:href="#input" transform="translate(3 5)"/>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(6.5 40)">SCL</text>
+ <text class="input-label" font-size="6pt" letter-spacing="1px" text-anchor="middle" transform="translate(15 40)">SCL</text>
</g>
<g transform="translate(76 0)">
<def id="RAMP_UP_OUTPUT" xlink:href="#output" transform="translate(3 5)"/>
@@ -111,11 +125,11 @@
<g transform="translate(10 44)">
<g transform="translate(2 0)">
<def id="PITCH_INPUT" xlink:href="#input" transform="translate(3 5)"/>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(1 40)">V/OCT</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">V/OCT</text>
</g>
<g transform="translate(34 0)">
<def id="RESET_INPUT" xlink:href="#input" transform="translate(3 5)"/>
- <text class="input-label" font-size="6pt" letter-spacing="1px" transform="translate(0.7 40)">RESET</text>
+ <text class="input-label" font-size="6pt" letter-spacing="0.7px" text-anchor="middle" transform="translate(15 40)">RESET</text>
</g>
<g transform="translate(66 0)">
<def id="TRIANGLE_OUTPUT" xlink:href="#output" transform="translate(3 5)"/>
diff --git a/res-src/LLFO-src.svg b/res-src/LLFO-src.svg
@@ -75,6 +75,14 @@
<polyline points="0,4 0,0 6,0 6,8 12,8 12,4" stroke-width="1" fill="none"/>
</g>
</g>
+
+ <g transform="translate(0 39)">
+ <def id="STEPPED_LIGHT" xlink:href="#light-small" transform="translate(-7.5 1)"/>
+ <g transform="translate(1 1) scale(0.8)">
+ <!-- <rect width="12" height="8" fill="none" stroke-width="1" stroke="#f0f" /> -->
+ <polyline points="0,0 0,5 12,5 12,8" stroke-width="1" fill="none"/>
+ </g>
+ </g>
</g>
<g transform="translate(31 0)">
@@ -103,7 +111,7 @@
</g>
</g>
- <def id="WAVE_PARAM" xlink:href="#button-small" transform="translate(17.5 38)"/>
+ <def id="WAVE_PARAM" xlink:href="#button-small" transform="translate(29 38)"/>
</g>
<g transform="translate(0 149)">
diff --git a/res/EightFO-dark.svg b/res/EightFO-dark.svg
Binary files differ.
diff --git a/res/EightFO-lowcontrast.svg b/res/EightFO-lowcontrast.svg
Binary files differ.
diff --git a/res/EightFO.svg b/res/EightFO.svg
Binary files differ.
diff --git a/res/LFO-dark.svg b/res/LFO-dark.svg
Binary files differ.
diff --git a/res/LFO-lowcontrast.svg b/res/LFO-lowcontrast.svg
Binary files differ.
diff --git a/res/LFO.svg b/res/LFO.svg
Binary files differ.
diff --git a/res/LLFO-dark.svg b/res/LLFO-dark.svg
Binary files differ.
diff --git a/res/LLFO-lowcontrast.svg b/res/LLFO-lowcontrast.svg
Binary files differ.
diff --git a/res/LLFO.svg b/res/LLFO.svg
Binary files differ.
diff --git a/src/EightFO.cpp b/src/EightFO.cpp
@@ -73,27 +73,47 @@ void EightFO::modulateChannel(int c) {
setFrequency(params[FREQUENCY_PARAM], inputs[PITCH_INPUT], e.phasor, c);
- if (_wave == SQUARE_WAVE) {
- float pw = params[SAMPLE_PWM_PARAM].getValue();
- if (inputs[SAMPLE_PWM_INPUT].isConnected()) {
- pw *= clamp(inputs[SAMPLE_PWM_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
+ switch (_wave) {
+ case SQUARE_WAVE: {
+ float pw = params[SAMPLE_PWM_PARAM].getValue();
+ if (inputs[SAMPLE_PWM_INPUT].isConnected()) {
+ pw *= clamp(inputs[SAMPLE_PWM_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
+ }
+ pw *= 1.0f - 2.0f * e.square.minPulseWidth;
+ pw *= 0.5f;
+ pw += 0.5f;
+ e.square.setPulseWidth(pw);
+ e.sampleSteps = 1;
+ break;
}
- pw *= 1.0f - 2.0f * e.square.minPulseWidth;
- pw *= 0.5f;
- pw += 0.5f;
- e.square.setPulseWidth(pw);
- e.sampleSteps = 1;
- }
- else {
- float sample = fabsf(params[SAMPLE_PWM_PARAM].getValue());
- if (inputs[SAMPLE_PWM_INPUT].isConnected()) {
- sample *= clamp(fabsf(inputs[SAMPLE_PWM_INPUT].getPolyVoltage(c)) / 5.0f, 0.0f, 1.0f);
+ case STEPPED_WAVE: {
+ e.sampleSteps = 1;
+ break;
+ }
+ default: {
+ float sample = fabsf(params[SAMPLE_PWM_PARAM].getValue());
+ if (inputs[SAMPLE_PWM_INPUT].isConnected()) {
+ sample *= clamp(fabsf(inputs[SAMPLE_PWM_INPUT].getPolyVoltage(c)) / 5.0f, 0.0f, 1.0f);
+ }
+ float maxSampleSteps = (e.phasor._sampleRate / e.phasor._frequency) / 4.0f;
+ e.sampleSteps = clamp((int)(sample * maxSampleSteps), 1, (int)maxSampleSteps);
}
- float maxSampleSteps = (e.phasor._sampleRate / e.phasor._frequency) / 4.0f;
- e.sampleSteps = clamp((int)(sample * maxSampleSteps), 1, (int)maxSampleSteps);
- e.square.setPulseWidth(SquareOscillator::defaultPulseWidth);
}
+ float smooth = params[SMOOTH_PARAM].getValue();
+ if (inputs[SMOOTH_INPUT].isConnected()) {
+ smooth *= clamp(inputs[SMOOTH_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
+ }
+ float sr = APP->engine->getSampleRate();
+ e.phase7Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase6Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase5Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase4Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase3Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase2Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase1Smoother.setParams(sr, e.phasor._frequency, smooth);
+ e.phase0Smoother.setParams(sr, e.phasor._frequency, smooth);
+
e.offset = params[OFFSET_PARAM].getValue();
if (inputs[OFFSET_INPUT].isConnected()) {
e.offset *= clamp(inputs[OFFSET_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
@@ -132,14 +152,14 @@ void EightFO::processChannel(const ProcessArgs& args, int c) {
useSample = true;
}
}
- updateOutput(c, useSample, outputs[PHASE7_OUTPUT], e.phase7Offset, e.phase7Sample, e.phase7Active);
- updateOutput(c, useSample, outputs[PHASE6_OUTPUT], e.phase6Offset, e.phase6Sample, e.phase6Active);
- updateOutput(c, useSample, outputs[PHASE5_OUTPUT], e.phase5Offset, e.phase5Sample, e.phase5Active);
- updateOutput(c, useSample, outputs[PHASE4_OUTPUT], e.phase4Offset, e.phase4Sample, e.phase4Active);
- updateOutput(c, useSample, outputs[PHASE3_OUTPUT], e.phase3Offset, e.phase3Sample, e.phase3Active);
- updateOutput(c, useSample, outputs[PHASE2_OUTPUT], e.phase2Offset, e.phase2Sample, e.phase2Active);
- updateOutput(c, useSample, outputs[PHASE1_OUTPUT], e.phase1Offset, e.phase1Sample, e.phase1Active);
- updateOutput(c, useSample, outputs[PHASE0_OUTPUT], e.phase0Offset, e.phase0Sample, e.phase0Active);
+ updateOutput(c, useSample, outputs[PHASE7_OUTPUT], e.phase7Offset, e.phase7Sample, e.phase7Active, e.phase7Smoother);
+ updateOutput(c, useSample, outputs[PHASE6_OUTPUT], e.phase6Offset, e.phase6Sample, e.phase6Active, e.phase6Smoother);
+ updateOutput(c, useSample, outputs[PHASE5_OUTPUT], e.phase5Offset, e.phase5Sample, e.phase5Active, e.phase5Smoother);
+ updateOutput(c, useSample, outputs[PHASE4_OUTPUT], e.phase4Offset, e.phase4Sample, e.phase4Active, e.phase4Smoother);
+ updateOutput(c, useSample, outputs[PHASE3_OUTPUT], e.phase3Offset, e.phase3Sample, e.phase3Active, e.phase3Smoother);
+ updateOutput(c, useSample, outputs[PHASE2_OUTPUT], e.phase2Offset, e.phase2Sample, e.phase2Active, e.phase2Smoother);
+ updateOutput(c, useSample, outputs[PHASE1_OUTPUT], e.phase1Offset, e.phase1Sample, e.phase1Active, e.phase1Smoother);
+ updateOutput(c, useSample, outputs[PHASE0_OUTPUT], e.phase0Offset, e.phase0Sample, e.phase0Active, e.phase0Smoother);
}
Phasor::phase_delta_t EightFO::phaseOffset(int c, Param& p, Input& i, Phasor::phase_delta_t baseOffset) {
@@ -150,13 +170,10 @@ Phasor::phase_delta_t EightFO::phaseOffset(int c, Param& p, Input& i, Phasor::ph
return baseOffset - o;
}
-void EightFO::updateOutput(int c, bool useSample, Output& output, Phasor::phase_delta_t& offset, float& sample, bool& active) {
+void EightFO::updateOutput(int c, bool useSample, Output& output, Phasor::phase_delta_t& offset, float& sample, bool& active, Smoother& smoother) {
if (output.isConnected()) {
output.setChannels(_channels);
- if (useSample && active) {
- output.setVoltage(sample, c);
- }
- else {
+ if (!useSample || !active) {
float v = 0.0f;
switch (_wave) {
case NO_WAVE: {
@@ -182,9 +199,14 @@ void EightFO::updateOutput(int c, bool useSample, Output& output, Phasor::phase_
v = _engines[c]->square.nextFromPhasor(_engines[c]->phasor, offset);
break;
}
+ case STEPPED_WAVE: {
+ v = _engines[c]->stepped.nextFromPhasor(_engines[c]->phasor, offset);
+ break;
+ }
}
- output.setVoltage(sample = amplitude * _engines[c]->scale * v + _engines[c]->offset, c);
+ sample = amplitude * _engines[c]->scale * v + _engines[c]->offset;
}
+ output.setVoltage(smoother.next(sample), c);
active = true;
}
else {
@@ -203,11 +225,12 @@ struct EightFOWidget : BGModuleWidget {
// generated by svg_widgets.rb
auto frequencyParamPosition = Vec(40.0, 45.0);
- auto slowParamPosition = Vec(118.0, 333.7);
- auto waveParamPosition = Vec(20.0, 168.0);
- auto samplePwmParamPosition = Vec(100.0, 163.0);
- auto offsetParamPosition = Vec(40.0, 226.0);
- auto scaleParamPosition = Vec(100.0, 226.0);
+ auto slowParamPosition = Vec(50.0, 139.7);
+ auto waveParamPosition = Vec(20.0, 178.0);
+ auto samplePwmParamPosition = Vec(100.0, 143.0);
+ auto smoothParamPosition = Vec(100.0, 190.0);
+ auto offsetParamPosition = Vec(40.0, 235.0);
+ auto scaleParamPosition = Vec(100.0, 235.0);
auto phase7ParamPosition = Vec(144.0, 40.0);
auto phase6ParamPosition = Vec(144.0, 80.0);
auto phase5ParamPosition = Vec(144.0, 120.0);
@@ -225,11 +248,12 @@ struct EightFOWidget : BGModuleWidget {
auto phase2InputPosition = Vec(179.0, 236.0);
auto phase1InputPosition = Vec(179.0, 276.0);
auto phase0InputPosition = Vec(179.0, 316.0);
- auto samplePwmInputPosition = Vec(14.0, 277.0);
- auto offsetInputPosition = Vec(52.0, 277.0);
- auto scaleInputPosition = Vec(90.0, 277.0);
- auto pitchInputPosition = Vec(14.0, 318.0);
- auto resetInputPosition = Vec(52.0, 318.0);
+ auto samplePwmInputPosition = Vec(21.0, 277.0);
+ auto offsetInputPosition = Vec(59.0, 277.0);
+ auto scaleInputPosition = Vec(97.0, 277.0);
+ auto pitchInputPosition = Vec(21.0, 318.0);
+ auto resetInputPosition = Vec(59.0, 318.0);
+ auto smoothInputPosition = Vec(97.0, 318.0);
auto phase7OutputPosition = Vec(218.0, 36.0);
auto phase6OutputPosition = Vec(218.0, 76.0);
@@ -253,6 +277,7 @@ struct EightFOWidget : BGModuleWidget {
}
addParam(createParam<IndicatorButtonGreen9>(slowParamPosition, module, EightFO::SLOW_PARAM));
addParam(createParam<Knob26>(samplePwmParamPosition, module, EightFO::SAMPLE_PWM_PARAM));
+ addParam(createParam<Knob26>(smoothParamPosition, module, EightFO::SMOOTH_PARAM));
addParam(createParam<Knob26>(offsetParamPosition, module, EightFO::OFFSET_PARAM));
addParam(createParam<Knob26>(scaleParamPosition, module, EightFO::SCALE_PARAM));
@@ -278,6 +303,7 @@ struct EightFOWidget : BGModuleWidget {
addInput(createInput<Port24>(phase0InputPosition, module, EightFO::PHASE0_INPUT));
addInput(createInput<Port24>(pitchInputPosition, module, EightFO::PITCH_INPUT));
addInput(createInput<Port24>(resetInputPosition, module, EightFO::RESET_INPUT));
+ addInput(createInput<Port24>(smoothInputPosition, module, EightFO::SMOOTH_INPUT));
addOutput(createOutput<Port24>(phase7OutputPosition, module, EightFO::PHASE7_OUTPUT));
addOutput(createOutput<Port24>(phase6OutputPosition, module, EightFO::PHASE6_OUTPUT));
@@ -298,4 +324,4 @@ struct EightFOWidget : BGModuleWidget {
}
};
-Model* modelEightFO = bogaudio::createModel<EightFO, EightFOWidget>("Bogaudio-EightFO", "8FO", "LFO with outputs at 8 different phases", "LFO", "Polyphonic");
+Model* modelEightFO = bogaudio::createModel<EightFO, EightFOWidget>("Bogaudio-EightFO", "8FO", "LFO with outputs at 8 different phases", "LFO", "Random", "Polyphonic");
diff --git a/src/EightFO.hpp b/src/EightFO.hpp
@@ -25,6 +25,7 @@ struct EightFO : LFOBase {
SLOW_PARAM,
OFFSET_PARAM,
SCALE_PARAM,
+ SMOOTH_PARAM,
NUM_PARAMS
};
@@ -42,6 +43,7 @@ struct EightFO : LFOBase {
RESET_INPUT,
OFFSET_INPUT,
SCALE_INPUT,
+ SMOOTH_INPUT,
NUM_INPUTS
};
@@ -63,7 +65,8 @@ struct EightFO : LFOBase {
RAMP_DOWN_WAVE,
SINE_WAVE,
TRIANGLE_WAVE,
- SQUARE_WAVE
+ SQUARE_WAVE,
+ STEPPED_WAVE
};
struct Engine {
@@ -78,6 +81,7 @@ struct EightFO : LFOBase {
TriangleOscillator triangle;
SawOscillator ramp;
SquareOscillator square;
+ SteppedRandomOscillator stepped;
Phasor::phase_delta_t phase7Offset = 0.0f;
Phasor::phase_delta_t phase6Offset = 0.0f;
@@ -106,6 +110,15 @@ struct EightFO : LFOBase {
bool phase1Active = false;
bool phase0Active = false;
+ Smoother phase7Smoother;
+ Smoother phase6Smoother;
+ Smoother phase5Smoother;
+ Smoother phase4Smoother;
+ Smoother phase3Smoother;
+ Smoother phase2Smoother;
+ Smoother phase1Smoother;
+ Smoother phase0Smoother;
+
void reset();
void sampleRateChange();
};
@@ -116,9 +129,10 @@ struct EightFO : LFOBase {
EightFO() : LFOBase(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {
configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0, "Frequency", " Hz");
- configParam(WAVE_PARAM, 1.0, 5.0, 3.0, "Waveform");
+ configParam(WAVE_PARAM, 1.0, 6.0, 3.0, "Waveform");
configParam(SLOW_PARAM, 0.0, 1.0, 0.0, "Slow");
configParam(SAMPLE_PWM_PARAM, -1.0, 1.0, 0.0, "Width", "%", 0.0f, 100.0f);
+ configParam(SMOOTH_PARAM, 0.0f, 1.0f, 0.0f, "Smoothing", "%", 0.0f, 100.0f);
configParam(OFFSET_PARAM, -1.0, 1.0, 0.0, "Offset", " V", 0.0f, 5.0f);
configParam(SCALE_PARAM, 0.0, 1.0, 1.0, "Scale", "%", 0.0f, 100.0f);
configParam(PHASE7_PARAM, -1.0, 1.0, 0.0, "Phase 315", "º", 0.0f, 180.0f);
@@ -141,7 +155,7 @@ struct EightFO : LFOBase {
void modulateChannel(int c) override;
void processChannel(const ProcessArgs& args, int c) override;
Phasor::phase_delta_t phaseOffset(int c, Param& p, Input& i, Phasor::phase_delta_t baseOffset);
- void updateOutput(int c, bool useSample, Output& output, Phasor::phase_delta_t& offset, float& sample, bool& active);
+ void updateOutput(int c, bool useSample, Output& output, Phasor::phase_delta_t& offset, float& sample, bool& active, Smoother& smoother);
};
} // namespace bogaudio
diff --git a/src/LFO.cpp b/src/LFO.cpp
@@ -1,6 +1,8 @@
#include "LFO.hpp"
+#define OFFSET_CV_TO_SMOOTHING "offset_cv_to_smoothing"
+
void LFO::Engine::reset() {
resetTrigger.reset();
sampleStep = phasor._sampleRate;
@@ -23,13 +25,26 @@ void LFO::sampleRateChange() {
}
}
+json_t* LFO::toJson(json_t* root) {
+ json_object_set_new(root, OFFSET_CV_TO_SMOOTHING, json_boolean(_useOffsetCvForSmooth));
+ return root;
+}
+
+void LFO::fromJson(json_t* root) {
+ json_t* ocv = json_object_get(root, OFFSET_CV_TO_SMOOTHING);
+ if (ocv) {
+ _useOffsetCvForSmooth = json_boolean_value(ocv);
+ }
+}
+
bool LFO::active() {
return (
outputs[SINE_OUTPUT].isConnected() ||
outputs[TRIANGLE_OUTPUT].isConnected() ||
outputs[RAMP_UP_OUTPUT].isConnected() ||
outputs[RAMP_DOWN_OUTPUT].isConnected() ||
- outputs[SQUARE_OUTPUT].isConnected()
+ outputs[SQUARE_OUTPUT].isConnected() ||
+ outputs[STEPPED_OUTPUT].isConnected()
);
}
@@ -76,8 +91,20 @@ void LFO::modulateChannel(int c) {
float maxSampleSteps = (e.phasor._sampleRate / e.phasor._frequency) / 4.0f;
e.sampleSteps = clamp((int)(sample * maxSampleSteps), 1, (int)maxSampleSteps);
+ float smooth = params[SMOOTH_PARAM].getValue();
+ if (_useOffsetCvForSmooth && inputs[OFFSET_INPUT].isConnected()) {
+ smooth *= clamp(inputs[OFFSET_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
+ }
+ float sr = APP->engine->getSampleRate();
+ e.sineSmoother.setParams(sr, e.phasor._frequency, smooth);
+ e.triangleSmoother.setParams(sr, e.phasor._frequency, smooth);
+ e.rampUpSmoother.setParams(sr, e.phasor._frequency, smooth);
+ e.rampDownSmoother.setParams(sr, e.phasor._frequency, smooth);
+ e.squareSmoother.setParams(sr, e.phasor._frequency, smooth);
+ e.steppedSmoother.setParams(sr, e.phasor._frequency, smooth);
+
e.offset = params[OFFSET_PARAM].getValue();
- if (inputs[OFFSET_INPUT].isConnected()) {
+ if (!_useOffsetCvForSmooth && inputs[OFFSET_INPUT].isConnected()) {
e.offset *= clamp(inputs[OFFSET_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
}
e.offset *= 5.0f;
@@ -106,27 +133,25 @@ void LFO::processChannel(const ProcessArgs& args, int c) {
useSample = true;
}
}
- updateOutput(c, e.sine, useSample, false, outputs[SINE_OUTPUT], e.sineSample, e.sineActive);
- updateOutput(c, e.triangle, useSample, false, outputs[TRIANGLE_OUTPUT], e.triangleSample, e.triangleActive);
- updateOutput(c, e.ramp, useSample, false, outputs[RAMP_UP_OUTPUT], e.rampUpSample, e.rampUpActive);
- updateOutput(c, e.ramp, useSample, true, outputs[RAMP_DOWN_OUTPUT], e.rampDownSample, e.rampDownActive);
- updateOutput(c, e.square, false, false, outputs[SQUARE_OUTPUT], e.squareSample, e.squareActive);
+ updateOutput(c, e.sine, useSample, false, outputs[SINE_OUTPUT], e.sineSample, e.sineActive, e.sineSmoother);
+ updateOutput(c, e.triangle, useSample, false, outputs[TRIANGLE_OUTPUT], e.triangleSample, e.triangleActive, e.triangleSmoother);
+ updateOutput(c, e.ramp, useSample, false, outputs[RAMP_UP_OUTPUT], e.rampUpSample, e.rampUpActive, e.rampUpSmoother);
+ updateOutput(c, e.ramp, useSample, true, outputs[RAMP_DOWN_OUTPUT], e.rampDownSample, e.rampDownActive, e.rampDownSmoother);
+ updateOutput(c, e.square, false, false, outputs[SQUARE_OUTPUT], e.squareSample, e.squareActive, e.squareSmoother);
+ updateOutput(c, e.stepped, false, false, outputs[STEPPED_OUTPUT], e.steppedSample, e.steppedActive, e.steppedSmoother);
}
-void LFO::updateOutput(int c, Phasor& wave, bool useSample, bool invert, Output& output, float& sample, bool& active) {
+void LFO::updateOutput(int c, Phasor& wave, bool useSample, bool invert, Output& output, float& sample, bool& active, Smoother& smoother) {
if (output.isConnected()) {
output.setChannels(_channels);
- if (useSample && active) {
- output.setVoltage(sample, c);
- }
- else {
+ if (!useSample || !active) {
sample = wave.nextFromPhasor(_engines[c]->phasor) * amplitude * _engines[c]->scale;
if (invert) {
sample = -sample;
}
sample += _engines[c]->offset;
- output.setVoltage(sample, c);
}
+ output.setVoltage(smoother.next(sample), c);
active = true;
}
else {
@@ -145,11 +170,12 @@ struct LFOWidget : BGModuleWidget {
// generated by svg_widgets.rb
auto frequencyParamPosition = Vec(41.0, 45.0);
- auto slowParamPosition = Vec(137.0, 237.5);
+ auto slowParamPosition = Vec(12.5, 96.5);
auto sampleParamPosition = Vec(37.0, 150.0);
auto pwParamPosition = Vec(102.0, 150.0);
- auto offsetParamPosition = Vec(42.0, 196.0);
- auto scaleParamPosition = Vec(107.0, 196.0);
+ auto smoothParamPosition = Vec(27.0, 196.0);
+ auto offsetParamPosition = Vec(73.0, 196.0);
+ auto scaleParamPosition = Vec(119.0, 196.0);
auto sampleInputPosition = Vec(15.0, 230.0);
auto pwInputPosition = Vec(47.0, 230.0);
@@ -159,6 +185,7 @@ struct LFOWidget : BGModuleWidget {
auto resetInputPosition = Vec(47.0, 318.0);
auto rampDownOutputPosition = Vec(79.0, 230.0);
+ auto steppedOutputPosition = Vec(111.0, 230.0);
auto rampUpOutputPosition = Vec(79.0, 274.0);
auto squareOutputPosition = Vec(111.0, 274.0);
auto triangleOutputPosition = Vec(79.0, 318.0);
@@ -169,6 +196,7 @@ struct LFOWidget : BGModuleWidget {
addParam(createParam<IndicatorButtonGreen9>(slowParamPosition, module, LFO::SLOW_PARAM));
addParam(createParam<Knob26>(sampleParamPosition, module, LFO::SAMPLE_PARAM));
addParam(createParam<Knob26>(pwParamPosition, module, LFO::PW_PARAM));
+ addParam(createParam<Knob16>(smoothParamPosition, module, LFO::SMOOTH_PARAM));
addParam(createParam<Knob16>(offsetParamPosition, module, LFO::OFFSET_PARAM));
addParam(createParam<Knob16>(scaleParamPosition, module, LFO::SCALE_PARAM));
@@ -180,11 +208,22 @@ struct LFOWidget : BGModuleWidget {
addInput(createInput<Port24>(resetInputPosition, module, LFO::RESET_INPUT));
addOutput(createOutput<Port24>(rampUpOutputPosition, module, LFO::RAMP_UP_OUTPUT));
+ addOutput(createOutput<Port24>(steppedOutputPosition, module, LFO::STEPPED_OUTPUT));
addOutput(createOutput<Port24>(rampDownOutputPosition, module, LFO::RAMP_DOWN_OUTPUT));
addOutput(createOutput<Port24>(squareOutputPosition, module, LFO::SQUARE_OUTPUT));
addOutput(createOutput<Port24>(triangleOutputPosition, module, LFO::TRIANGLE_OUTPUT));
addOutput(createOutput<Port24>(sineOutputPosition, module, LFO::SINE_OUTPUT));
}
+
+ void contextMenu(Menu* menu) override {
+ auto m = dynamic_cast<LFO*>(module);
+ assert(m);
+
+ OptionsMenuItem* uo = new OptionsMenuItem("OFF/SM input routing");
+ uo->addItem(OptionMenuItem("To offset (OFF)", [m]() { return !m->_useOffsetCvForSmooth; }, [m]() { m->_useOffsetCvForSmooth = false; }));
+ uo->addItem(OptionMenuItem("To smoothing (SM)", [m]() { return m->_useOffsetCvForSmooth; }, [m]() { m->_useOffsetCvForSmooth = true; }));
+ OptionsMenuItem::addToMenu(uo, menu);
+ }
};
-Model* modelLFO = bogaudio::createModel<LFO, LFOWidget>("Bogaudio-LFO", "LFO", "Low frequency oscillator", "LFO", "Polyphonic");
+Model* modelLFO = bogaudio::createModel<LFO, LFOWidget>("Bogaudio-LFO", "LFO", "Low frequency oscillator", "LFO", "Random", "Polyphonic");
diff --git a/src/LFO.hpp b/src/LFO.hpp
@@ -17,6 +17,7 @@ struct LFO : LFOBase {
PW_PARAM,
OFFSET_PARAM,
SCALE_PARAM,
+ SMOOTH_PARAM,
NUM_PARAMS
};
@@ -36,6 +37,7 @@ struct LFO : LFOBase {
SQUARE_OUTPUT,
TRIANGLE_OUTPUT,
SINE_OUTPUT,
+ STEPPED_OUTPUT,
NUM_OUTPUTS
};
@@ -51,18 +53,28 @@ struct LFO : LFOBase {
TriangleOscillator triangle;
SawOscillator ramp;
SquareOscillator square;
+ SteppedRandomOscillator stepped;
float sineSample = 0.0f;
float triangleSample = 0.0f;
float rampUpSample = 0.0f;
float rampDownSample = 0.0f;
float squareSample = 0.0f;
+ float steppedSample = 0.0f;
bool sineActive = false;
bool triangleActive = false;
bool rampUpActive = false;
bool rampDownActive = false;
bool squareActive = false;
+ bool steppedActive = false;
+
+ Smoother sineSmoother;
+ Smoother triangleSmoother;
+ Smoother rampUpSmoother;
+ Smoother rampDownSmoother;
+ Smoother squareSmoother;
+ Smoother steppedSmoother;
void reset();
void sampleRateChange();
@@ -70,18 +82,22 @@ struct LFO : LFOBase {
const float amplitude = 5.0f;
Engine* _engines[maxChannels] {};
+ bool _useOffsetCvForSmooth = false;
LFO() : LFOBase(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {
configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0f, "Frequency", " Hz");
configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow");
configParam(SAMPLE_PARAM, 0.0f, 1.0f, 0.0f, "Output sampling", "%", 0.0f, 100.0f);
configParam(PW_PARAM, -1.0f, 1.0f, 0.0f, "Pulse width", "%", 0.0f, 100.0f*0.5f*(1.0f - 2.0f * SquareOscillator::minPulseWidth), 50.0f);
+ configParam(SMOOTH_PARAM, 0.0f, 1.0f, 0.0f, "Smoothing", "%", 0.0f, 100.0f);
configParam(OFFSET_PARAM, -1.0f, 1.0f, 0.0f, "Offset", " V", 0.0f, 5.0f);
configParam(SCALE_PARAM, 0.0f, 1.0f, 1.0f, "Scale", "%", 0.0f, 100.0f);
}
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;
@@ -89,7 +105,7 @@ struct LFO : LFOBase {
void modulate() override;
void modulateChannel(int c) override;
void processChannel(const ProcessArgs& args, int c) override;
- void updateOutput(int c, Phasor& wave, bool useSample, bool invert, Output& output, float& sample, bool& active);
+ void updateOutput(int c, Phasor& wave, bool useSample, bool invert, Output& output, float& sample, bool& active, Smoother& smoother);
};
} // namespace bogaudio
diff --git a/src/LLFO.cpp b/src/LLFO.cpp
@@ -1,6 +1,10 @@
#include "LLFO.hpp"
+#define OUTPUT_SAMPLING "output_sampling"
+#define PULSE_WIDTH "pulse_width"
+#define SMOOTHING "smoothing"
+
void LLFO::reset() {
for (int c = 0; c < maxChannels; ++c) {
_resetTrigger[c].reset();
@@ -13,6 +17,30 @@ void LLFO::sampleRateChange() {
}
}
+json_t* LLFO::toJson(json_t* root) {
+ json_object_set_new(root, OUTPUT_SAMPLING, json_real(_sample));
+ json_object_set_new(root, PULSE_WIDTH, json_real(_pulseWidth));
+ json_object_set_new(root, SMOOTHING, json_real(_smooth));
+ return root;
+}
+
+void LLFO::fromJson(json_t* root) {
+ json_t* os = json_object_get(root, OUTPUT_SAMPLING);
+ if (os) {
+ _sample = json_real_value(os);
+ }
+
+ json_t* pw = json_object_get(root, PULSE_WIDTH);
+ if (pw) {
+ _pulseWidth = json_real_value(pw);
+ }
+
+ json_t* s = json_object_get(root, SMOOTHING);
+ if (s) {
+ _smooth = json_real_value(s);
+ }
+}
+
bool LLFO::active() {
return outputs[OUT_OUTPUT].isConnected();
}
@@ -35,29 +63,45 @@ void LLFO::modulate() {
switch (wave) {
case SINE_WAVE: {
_oscillator = &_sine;
+ _samplingEnabled = true;
break;
}
case TRIANGLE_WAVE: {
_oscillator = &_triangle;
+ _samplingEnabled = true;
break;
}
case RAMP_UP_WAVE: {
_oscillator = &_ramp;
+ _samplingEnabled = true;
break;
}
case RAMP_DOWN_WAVE: {
_oscillator = &_ramp;
_invert = true;
+ _samplingEnabled = true;
break;
}
case SQUARE_WAVE: {
_oscillator = &_square;
_square.setPulseWidth(0.5f);
+ _samplingEnabled = false;
break;
}
case PULSE_WAVE: {
_oscillator = &_square;
- _square.setPulseWidth(0.1f);
+ _samplingEnabled = false;
+
+ float pw = _pulseWidth;
+ pw *= 1.0f - 2.0f * SquareOscillator::minPulseWidth;
+ pw *= 0.5f;
+ pw += 0.5f;
+ _square.setPulseWidth(pw);
+ break;
+ }
+ case STEPPED_WAVE: {
+ _oscillator = &_stepped;
+ _samplingEnabled = false;
break;
}
}
@@ -68,6 +112,16 @@ void LLFO::modulate() {
void LLFO::modulateChannel(int c) {
setFrequency(params[FREQUENCY_PARAM], inputs[PITCH_INPUT], _phasor[c], c);
+
+ if (_samplingEnabled) {
+ float maxSampleSteps = (_phasor[c]._sampleRate / _phasor[c]._frequency) / 4.0f;
+ _sampleSteps[c] = clamp((int)(_sample * maxSampleSteps), 1, (int)maxSampleSteps);
+ }
+ else {
+ _sampleSteps[c] = 1;
+ }
+
+ _smoother[c].setParams(APP->engine->getSampleRate(), _phasor[c]._frequency, _smooth);
}
void LLFO::processAlways(const ProcessArgs& args) {
@@ -78,6 +132,7 @@ void LLFO::processAlways(const ProcessArgs& args) {
lights[RAMP_DOWN_LIGHT].value = wave == RAMP_DOWN_WAVE;
lights[SQUARE_LIGHT].value = wave == SQUARE_WAVE;
lights[PULSE_LIGHT].value = wave == PULSE_WAVE;
+ lights[STEPPED_LIGHT].value = wave == STEPPED_WAVE;
}
void LLFO::processChannel(const ProcessArgs& args, int c) {
@@ -85,15 +140,140 @@ void LLFO::processChannel(const ProcessArgs& args, int c) {
_phasor[c].resetPhase();
}
_phasor[c].advancePhase();
- float sample = _oscillator->nextFromPhasor(_phasor[c]) * amplitude * _scale;
- if (_invert) {
- sample = -sample;
+
+ bool useSample = false;
+ if (_sampleSteps[c] > 1) {
+ ++_sampleStep[c];
+ if (_sampleStep[c] >= _sampleSteps[c]) {
+ _sampleStep[c] = 0;
+ }
+ else {
+ useSample = true;
+ }
+ }
+ if (!useSample) {
+ _currentSample[c] = _oscillator->nextFromPhasor(_phasor[c]) * amplitude * _scale;
+ if (_invert) {
+ _currentSample[c] = -_currentSample[c];
+ }
+ _currentSample[c] += _offset;
}
- sample += _offset;
+
outputs[OUT_OUTPUT].setChannels(_channels);
- outputs[OUT_OUTPUT].setVoltage(sample, c);
+ outputs[OUT_OUTPUT].setVoltage(_smoother[c].next(_currentSample[c]), c);
}
+struct SampleQuantity : Quantity {
+ LLFO* _module;
+
+ SampleQuantity(LLFO* m) : _module(m) {}
+
+ void setValue(float value) override {
+ value = clamp(value, getMinValue(), getMaxValue());
+ if (_module) {
+ _module->_sample = value;
+ }
+ }
+
+ float getValue() override {
+ if (_module) {
+ return _module->_sample;
+ }
+ return getDefaultValue();
+ }
+
+ float getMinValue() override { return 0.0f; }
+ float getMaxValue() override { return 1.0f; }
+ float getDefaultValue() override { return LLFO::defaultSample; }
+ float getDisplayValue() override { return roundf(100.0f * getValue()); }
+ void setDisplayValue(float displayValue) override { setValue(displayValue / 100.0f); }
+ std::string getLabel() override { return "Output sampling"; }
+ std::string getUnit() override { return "%"; }
+};
+
+struct PWQuantity : Quantity {
+ LLFO* _module;
+
+ PWQuantity(LLFO* m) : _module(m) {}
+
+ void setValue(float value) override {
+ value = clamp(value, getMinValue(), getMaxValue());
+ if (_module) {
+ _module->_pulseWidth = value;
+ }
+ }
+
+ float getValue() override {
+ if (_module) {
+ return _module->_pulseWidth;
+ }
+ return getDefaultValue();
+ }
+
+ float getMinValue() override { return -1.0f; }
+ float getMaxValue() override { return 1.0f; }
+ float getDefaultValue() override { return LLFO::defaultPulseWidth; }
+ float getDisplayValue() override { return roundf(50.0f + 100.0f * 0.5f * getValue() * (1.0f - 2.0f*SquareOscillator::minPulseWidth)); }
+ void setDisplayValue(float displayValue) override { setValue((displayValue - 50.0f) / (100.0f * 0.5f * (1.0f - 2.0f*SquareOscillator::minPulseWidth))); }
+ std::string getLabel() override { return "Pulse width"; }
+ std::string getUnit() override { return "%"; }
+};
+
+struct SmoothQuantity : Quantity {
+ LLFO* _module;
+
+ SmoothQuantity(LLFO* m) : _module(m) {}
+
+ void setValue(float value) override {
+ value = clamp(value, getMinValue(), getMaxValue());
+ if (_module) {
+ _module->_smooth = value;
+ }
+ }
+
+ float getValue() override {
+ if (_module) {
+ return _module->_smooth;
+ }
+ return getDefaultValue();
+ }
+
+ float getMinValue() override { return 0.0f; }
+ float getMaxValue() override { return 1.0f; }
+ float getDefaultValue() override { return LLFO::defaultSmooth; }
+ float getDisplayValue() override { return roundf(100.0f * getValue()); }
+ void setDisplayValue(float displayValue) override { setValue(displayValue / 100.0f); }
+ std::string getLabel() override { return "Smoothing"; }
+ std::string getUnit() override { return "%"; }
+};
+
+template<class Q>
+struct LLFOSlider : ui::Slider {
+ LLFOSlider(LLFO* module) {
+ quantity = new Q(module);
+ box.size.x = 200.0f;
+ }
+ virtual ~LLFOSlider() {
+ delete quantity;
+ }
+};
+
+template<class Q>
+struct LLFOSliderMenuItem : MenuItem {
+ LLFO* _module;
+
+ LLFOSliderMenuItem(LLFO* m, const char* label) : _module(m) {
+ this->text = label;
+ this->rightText = "▸";
+ }
+
+ Menu* createChildMenu() override {
+ Menu* menu = new Menu;
+ menu->addChild(new LLFOSlider<Q>(_module));
+ return menu;
+ }
+};
+
struct LLFOWidget : BGModuleWidget {
static constexpr int hp = 3;
@@ -106,7 +286,7 @@ struct LLFOWidget : BGModuleWidget {
// generated by svg_widgets.rb
auto frequencyParamPosition = Vec(9.5, 27.0);
auto slowParamPosition = Vec(31.0, 71.0);
- auto waveParamPosition = Vec(18.0, 126.0);
+ auto waveParamPosition = Vec(29.5, 126.0);
auto offsetParamPosition = Vec(14.5, 158.5);
auto scaleParamPosition = Vec(14.5, 199.5);
@@ -118,6 +298,7 @@ struct LLFOWidget : BGModuleWidget {
auto sineLightPosition = Vec(2.0, 89.0);
auto rampUpLightPosition = Vec(2.0, 102.0);
auto squareLightPosition = Vec(2.0, 115.0);
+ auto steppedLightPosition = Vec(2.0, 128.0);
auto triangleLightPosition = Vec(24.0, 89.0);
auto rampDownLightPosition = Vec(24.0, 102.0);
auto pulseLightPosition = Vec(24.0, 115.0);
@@ -137,10 +318,20 @@ struct LLFOWidget : BGModuleWidget {
addChild(createLight<SmallLight<GreenLight>>(sineLightPosition, module, LLFO::SINE_LIGHT));
addChild(createLight<SmallLight<GreenLight>>(rampUpLightPosition, module, LLFO::RAMP_UP_LIGHT));
addChild(createLight<SmallLight<GreenLight>>(squareLightPosition, module, LLFO::SQUARE_LIGHT));
+ addChild(createLight<SmallLight<GreenLight>>(steppedLightPosition, module, LLFO::STEPPED_LIGHT));
addChild(createLight<SmallLight<GreenLight>>(triangleLightPosition, module, LLFO::TRIANGLE_LIGHT));
addChild(createLight<SmallLight<GreenLight>>(rampDownLightPosition, module, LLFO::RAMP_DOWN_LIGHT));
addChild(createLight<SmallLight<GreenLight>>(pulseLightPosition, module, LLFO::PULSE_LIGHT));
}
+
+ void contextMenu(Menu* menu) override {
+ auto m = dynamic_cast<LLFO*>(module);
+ assert(m);
+
+ menu->addChild(new LLFOSliderMenuItem<SampleQuantity>(m, "Output sampling"));
+ menu->addChild(new LLFOSliderMenuItem<PWQuantity>(m, "Pulse width"));
+ menu->addChild(new LLFOSliderMenuItem<SmoothQuantity>(m, "Smoothing"));
+ }
};
-Model* modelLLFO = bogaudio::createModel<LLFO, LLFOWidget>("Bogaudio-LLFO", "LLFO", "Low frequency oscillator", "LFO", "Polyphonic");
+Model* modelLLFO = bogaudio::createModel<LLFO, LLFOWidget>("Bogaudio-LLFO", "LLFO", "Low frequency oscillator", "LFO", "Random", "Polyphonic");
diff --git a/src/LLFO.hpp b/src/LLFO.hpp
@@ -37,6 +37,7 @@ struct LLFO : LFOBase {
TRIANGLE_LIGHT,
RAMP_DOWN_LIGHT,
PULSE_LIGHT,
+ STEPPED_LIGHT,
NUM_LIGHTS
};
@@ -46,22 +47,35 @@ struct LLFO : LFOBase {
RAMP_UP_WAVE,
RAMP_DOWN_WAVE,
SQUARE_WAVE,
- PULSE_WAVE
+ PULSE_WAVE,
+ STEPPED_WAVE
};
- const float amplitude = 5.0f;
+ static constexpr float amplitude = 5.0f;
+ static constexpr float defaultSample = 0.0f;
+ static constexpr float defaultPulseWidth = -0.8510638; // 10% pulse.
+ static constexpr float defaultSmooth = 0.0f;
float _offset = 0.0f;
float _scale = 0.0f;
+ float _sample = defaultSample;
+ float _pulseWidth = defaultPulseWidth;
+ float _smooth = defaultSmooth;
PositiveZeroCrossing _resetTrigger[maxChannels];
Phasor _phasor[maxChannels];
+ int _sampleSteps[maxChannels] {};
+ int _sampleStep[maxChannels] {};
+ float _currentSample[maxChannels] {};
+ Smoother _smoother[maxChannels];
SineTableOscillator _sine;
TriangleOscillator _triangle;
SawOscillator _ramp;
SquareOscillator _square;
+ SteppedRandomOscillator _stepped;
bool _invert;
Phasor* _oscillator;
+ bool _samplingEnabled = false;
LLFO()
: LFOBase(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
@@ -69,7 +83,7 @@ struct LLFO : LFOBase {
, _oscillator(&_sine)
{
configParam<LFOFrequencyParamQuantity>(FREQUENCY_PARAM, -5.0f, 8.0f, 0.0f, "Frequency", " Hz");
- configParam(WAVE_PARAM, 0.0f, 5.0f, 0.0f, "Waveform");
+ configParam(WAVE_PARAM, 0.0f, 6.0f, 0.0f, "Waveform");
configParam(SLOW_PARAM, 0.0f, 1.0f, 0.0f, "Slow mode");
configParam(OFFSET_PARAM, -1.0f, 1.0f, 0.0f, "Offset", " V", 0.0f, 5.0f);
configParam(SCALE_PARAM, 0.0f, 1.0f, 1.0f, "Scale", "%", 0.0f, 100.0f);
@@ -77,6 +91,8 @@ struct LLFO : LFOBase {
void reset() override;
void sampleRateChange() override;
+ json_t* toJson(json_t* root) override;
+ void fromJson(json_t* root) override;
bool active() override;
int channels() override;
void addChannel(int c) override;
diff --git a/src/RGate.cpp b/src/RGate.cpp
@@ -197,7 +197,7 @@ struct IPQuantity : Quantity {
}
float getMinValue() override { return 0.0f; }
- float getMaxValue() override { return 1.0; }
+ float getMaxValue() override { return 1.0f; }
float getDefaultValue() override { return RGate::defaultInitialClockPeriod; }
float getDisplayValue() override { return getValue() * 1000.0f; }
void setDisplayValue(float displayValue) override { setValue(displayValue / 1000.0f); }
diff --git a/src/Test.cpp b/src/Test.cpp
@@ -1,27 +1,6 @@
#include "Test.hpp"
-#ifdef LFO_SMOOTHER
-void Test::Smoother::setParams(float sampleRate, float frequency, float amount) {
- if (_sampleRate != sampleRate || _frequency != frequency || _amount != amount) {
- _sampleRate = sampleRate;
- _frequency = frequency;
- _amount = amount;
-
- float millis = 1.0f / frequency;
- millis /= 2.0f;
- millis *= 1000.0f;
- millis *= amount*amount * 25.0f;
- _slewLimiter.setParams(_sampleRate, millis, 0.5f);
- _integrator.setParams(clamp(0.1f - amount, 0.001f, 1.0f)); // FIXME!
- }
-}
-
-float Test::Smoother::next(float sample) {
- return _integrator.next(_slewLimiter.next(sample));
-}
-#endif
-
void Test::reset() {
}
diff --git a/src/Test.hpp b/src/Test.hpp
@@ -108,6 +108,7 @@ extern Model* modelTest;
#elif LFO_SMOOTHER
#include "dsp/signal.hpp"
#include "dsp/pitch.hpp"
+#include "lfo_base.hpp"
#elif STEPPED_RANDOM
#include "dsp/oscillator.hpp"
#include "dsp/noise.hpp"
@@ -255,17 +256,7 @@ struct Test : BGModule {
#elif DCBLOCKER
DCBlocker _filter;
#elif LFO_SMOOTHER
- struct Smoother {
- float _sampleRate = 0.0f;
- float _frequency = 0.0f;
- float _amount = 0.0f;
- ShapedSlewLimiter _slewLimiter;
- Integrator _integrator;
-
- void setParams(float sampleRate, float frequency, float amount);
- float next(float sample);
- };
- Smoother _smoother;
+ LFOBase::Smoother _smoother;
#elif STEPPED_RANDOM
PositiveZeroCrossing _trigger;
SteppedRandomOscillator _stepped;
diff --git a/src/lfo_base.cpp b/src/lfo_base.cpp
@@ -2,6 +2,27 @@
#include "lfo_base.hpp"
#include "dsp/pitch.hpp"
+void LFOBase::Smoother::setParams(float sampleRate, float frequency, float amount) {
+ assert(sampleRate > 0.0f);
+ assert(frequency > 0.0f);
+ assert(amount >= 0.0f && amount <= 1.0f);
+ if (_sampleRate != sampleRate || _frequency != frequency || _amount != amount) {
+ _sampleRate = sampleRate;
+ _frequency = frequency;
+ _amount = amount;
+
+ float millis = 1.0f / frequency;
+ millis /= 2.0f;
+ millis *= 1000.0f;
+ millis *= amount*amount * 10.0f;
+ _slewLimiter.setParams(_sampleRate, millis, 0.5f);
+ }
+}
+
+float LFOBase::Smoother::next(float sample) {
+ return _slewLimiter.next(sample);
+}
+
float LFOBase::LFOFrequencyParamQuantity::offset() {
auto lfo = dynamic_cast<LFOBase*>(module);
return lfo->getPitchOffset();
diff --git a/src/lfo_base.hpp b/src/lfo_base.hpp
@@ -14,6 +14,16 @@ struct PitchModeListener {
};
struct LFOBase : BGModule {
+ struct Smoother {
+ float _sampleRate = 0.0f;
+ float _frequency = 0.0f;
+ float _amount = 0.0f;
+ ShapedSlewLimiter _slewLimiter;
+
+ void setParams(float sampleRate, float frequency, float amount);
+ float next(float sample);
+ };
+
bool _slowMode = false;
PitchModeListener* _pitchModeListener = NULL;