commit db1a0931ec2d57b2d393452d28964353284e5981
parent 2a31560ff5a7cf260c9ba5a7b489f2277ab55acc
Author: Matt Demanett <matt@demanett.net>
Date: Tue, 2 Apr 2019 23:46:51 -0400
1:8, 8:1, ADDR-SEQ: mux/demux, sequential switches, voltage-addressed sequencer. #41
Diffstat:
13 files changed, 1110 insertions(+), 0 deletions(-)
diff --git a/res-src/AddrSeq-src.svg b/res-src/AddrSeq-src.svg
@@ -0,0 +1,219 @@
+<svg
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="90"
+ height="380"
+ viewBox="0 0 90 380"
+>
+ <style>
+ text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+ }
+ text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+ }
+ text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+ }
+ </style>
+
+ <defs>
+ <symbol id="knob" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f" />
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f" />
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none" />
+ </g>
+ </symbol>
+
+ <symbol id="knobguide-select" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(19 0) rotate(240) translate(-2 2)">1</text>
+ <text font-size="5.0pt" transform="rotate(-197.1) translate(19 0) rotate(197.1) translate(-2 2)">2</text>
+ <text font-size="5.0pt" transform="rotate(-154.3) translate(19 0) rotate(154.3) translate(-2 2)">3</text>
+ <text font-size="5.0pt" transform="rotate(-111.4) translate(19 0) rotate(111.4) translate(-2 2)">4</text>
+ <text font-size="5.0pt" transform="rotate(-68.6) translate(19 0) rotate(68.6) translate(-2 2)">5</text>
+ <text font-size="5.0pt" transform="rotate(-25.7) translate(19 0) rotate(25.7) translate(-2 2)">6</text>
+ <text font-size="5.0pt" transform="rotate(17.1) translate(19 0) rotate(-17.1) translate(-2 2)">7</text>
+ <text font-size="5.0pt" transform="rotate(60) translate(19 0) rotate(-60) translate(-2 2)">8</text>
+ </g>
+ </symbol>
+
+ <symbol id="knob-smallest" viewBox="0 0 16px 16px">
+ <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>
+ </symbol>
+
+ <symbol id="knobguide-steps" viewBox="0 0 40px 40px">
+ <g transform="translate(20 20)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 2)">2</text>
+ <text font-size="5.0pt" transform="rotate(-190) translate(13 0) rotate(190) translate(-2 2)">3</text>
+ <text font-size="5.0pt" transform="rotate(-140) translate(13 0) rotate(140) translate(-2 2)">4</text>
+ <text font-size="5.0pt" transform="rotate(-90) translate(13 0) rotate(90) translate(-2 2)">5</text>
+ <text font-size="5.0pt" transform="rotate(-40) translate(13 0) rotate(40) translate(-2 2)">6</text>
+ <text font-size="5.0pt" transform="rotate(10) translate(13 0) rotate(-10) translate(-2 2)">7</text>
+ <text font-size="5.0pt" transform="rotate(60) translate(13 0) rotate(-60) translate(-2 2)">8</text>
+ </g>
+ </symbol>
+
+ <symbol id="knobguide-bipolar-smallest" viewBox="0 0 40px 40px">
+ <g transform="translate(20 20)">
+ <polyline points="0,0 4,0" stroke-width="1" stroke="#333" transform="rotate(-240) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-225) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-210) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-195) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-180) translate(10 0)" />
+ <polyline points="0,0 4.0,0" stroke-width="1.0" stroke="#333" transform="rotate(-165) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-150) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-135) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-120) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-105) translate(10 0)" />
+
+ <polyline points="0,0 5,0" stroke-width="1" stroke="#333" transform="rotate(-90) translate(10 0)" />
+
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-75) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-60) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-45) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(-30) translate(10 0)" />
+ <polyline points="0,0 4,0" stroke-width="1.0" stroke="#333" transform="rotate(-15) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(0) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(15) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(30) translate(10 0)" />
+ <polyline points="0,0 2.5,0" stroke-width="0.5" stroke="#333" transform="rotate(45) translate(10 0)" />
+ <polyline points="0,0 4,0" stroke-width="1" stroke="#333" transform="rotate(60) translate(10 0)" />
+ </g>
+ </symbol>
+
+ <symbol id="switch" viewBox="0 0 14px 24px">
+ <rect width="14px" height="24px" stroke-width="1" stroke="#000" fill="#ddd" />
+ <rect width="14px" height="12px" stroke-width="0" fill="#000" />
+ </symbol>
+
+ <symbol id="light-small" viewBox="0 0 6.4px 6.4px">
+ <rect width="6.4" height="6.4" fill="#0f0" />
+ </symbol>
+
+ <symbol id="input" viewBox="0 0 24px 24px">
+ <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>
+ </symbol>
+
+ <symbol id="output" viewBox="0 0 24px 24px">
+ <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>
+ </symbol>
+ </defs>
+
+ <rect width="100%" height="100%" fill="#ddd" />
+ <polyline points="1,1 89,1 89,379 1,379 1,1" stroke="#e4e4e4" stroke-width="0.5" fill="none" />
+ <polyline points="0.5,0.5 89.5,0.5 89.5,379.5 0.5,379.5 0.5,0.5" stroke="#ebebeb" stroke-width="0.8" fill="none" />
+ <polyline points="0,0 90,0 90,380 0,380 0,0" stroke="#f2f2f2" stroke-width="1" fill="none" />
+
+ <text class="title" x="15" y="17" font-size="9pt" letter-spacing="0.5px">ADDR-SEQ</text>
+ <g transform="translate(5.5 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BOGAUDIO</text>
+ <rect width="1.5" height="2" fill="#ddd" transform="translate(21 -4)" />
+ </g>
+
+ <g transform="translate(6.5 32)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <rect width="34" height="10" fill="#fafafa" transform="translate(0 30)" />
+ <use id="CLOCK_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="1px" transform="translate(4 35)">CLOCK</text>
+ </g>
+ <g transform="translate(6.5 69)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="RESET_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="1px" transform="translate(5 35)">RESET</text>
+ </g>
+
+ <g transform="translate(1 121)">
+ <text font-size="6pt" letter-spacing="1.5px" transform="translate(7.5 0)">STEPS</text>
+ <use id="STEPS_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 10.5)" />
+ <use xlink:href="#knobguide-steps" transform="translate(2.5 -1)" />
+ </g>
+
+ <g transform="translate(16.5 166)">
+ <text font-size="5pt" letter-spacing="2px" transform="translate(-1.8 -1)">FWD</text>
+ <use id="DIRECTION_PARAM" xlink:href="#switch" transform="translate(0 2)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(-1.3 34)">REV</text>
+ </g>
+
+ <!-- <rect width="45" height="14" fill="#0f0" transform="translate(0 200)" /> -->
+ <!-- <rect width="45" height="14" fill="#0f0" transform="translate(0 307)" /> -->
+ <g transform="translate(1 220)">
+ <text font-size="6pt" letter-spacing="1.5px" transform="translate(4.5 0)">SELECT</text>
+ <use id="SELECT_PARAM" xlink:href="#knob" transform="translate(0 2)" />
+ <use xlink:href="#knobguide-select" transform="translate(0 2)" />
+ <g transform="translate(5.5 47)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="SELECT_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11.5 35)">CV</text>
+ </g>
+ </g>
+
+ <g transform="translate(6.5 321)">
+ <rect width="34" height="39" rx="5" fill="#bbb" />
+ <use id="OUT_OUTPUT" xlink:href="#output" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(8 35)">OUT</text>
+ </g>
+
+ <g transform="translate(49.5 32)">
+ <use id="OUT1_PARAM" xlink:href="#knob-smallest" transform="translate(9 4)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 -8)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 32)">1</text>
+ <use id="OUT1_LIGHT" xlink:href="#light-small" transform="translate(17 26.5)" />
+
+ <use id="OUT2_PARAM" xlink:href="#knob-smallest" transform="translate(9 45.3)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 33.3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 73.3)">2</text>
+ <use id="OUT2_LIGHT" xlink:href="#light-small" transform="translate(17 67.8)" />
+
+ <use id="OUT3_PARAM" xlink:href="#knob-smallest" transform="translate(9 86.6)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 74.6)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 114.6)">3</text>
+ <use id="OUT3_LIGHT" xlink:href="#light-small" transform="translate(17 109.1)" />
+
+ <use id="OUT4_PARAM" xlink:href="#knob-smallest" transform="translate(9 127.9)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 115.9)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 155.9)">4</text>
+ <use id="OUT4_LIGHT" xlink:href="#light-small" transform="translate(17 150.4)" />
+
+ <use id="OUT5_PARAM" xlink:href="#knob-smallest" transform="translate(9 169.1)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 157.1)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 197.1)">5</text>
+ <use id="OUT5_LIGHT" xlink:href="#light-small" transform="translate(17 191.6)" />
+
+ <use id="OUT6_PARAM" xlink:href="#knob-smallest" transform="translate(9 210.4)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 198.4)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 238.4)">6</text>
+ <use id="OUT6_LIGHT" xlink:href="#light-small" transform="translate(17 232.9)" />
+
+ <use id="OUT7_PARAM" xlink:href="#knob-smallest" transform="translate(9 251.7)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 239.7)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 279.7)">7</text>
+ <use id="OUT7_LIGHT" xlink:href="#light-small" transform="translate(17 274.2)" />
+
+ <use id="OUT8_PARAM" xlink:href="#knob-smallest" transform="translate(9 293)" />
+ <use xlink:href="#knobguide-bipolar-smallest" transform="translate(-3 281)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 321)">8</text>
+ <use id="OUT8_LIGHT" xlink:href="#light-small" transform="translate(17 315.5)" />
+ </g>
+
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 47)" /> -->
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 336)" /> -->
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 351)" /> -->
+ <!-- <polyline points="0,0 0,360" stroke="#f00" stroke-width="1" fill="none" transform="translate(23.50 0)" /> -->
+</svg>
diff --git a/res-src/EightOne-src.svg b/res-src/EightOne-src.svg
@@ -0,0 +1,186 @@
+<svg
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="90"
+ height="380"
+ viewBox="0 0 90 380"
+>
+ <style>
+ text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+ }
+ text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+ }
+ text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+ }
+ </style>
+
+ <defs>
+ <symbol id="knob" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f" />
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f" />
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none" />
+ </g>
+ </symbol>
+
+ <symbol id="knobguide-select" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(20 0) rotate(240) translate(-2 2)">1</text>
+ <text font-size="5.0pt" transform="rotate(-197.1) translate(20 0) rotate(197.1) translate(-2 2)">2</text>
+ <text font-size="5.0pt" transform="rotate(-154.3) translate(20 0) rotate(154.3) translate(-2 2)">3</text>
+ <text font-size="5.0pt" transform="rotate(-111.4) translate(20 0) rotate(111.4) translate(-2 2)">4</text>
+ <text font-size="5.0pt" transform="rotate(-68.6) translate(20 0) rotate(68.6) translate(-2 2)">5</text>
+ <text font-size="5.0pt" transform="rotate(-25.7) translate(20 0) rotate(25.7) translate(-2 2)">6</text>
+ <text font-size="5.0pt" transform="rotate(17.1) translate(20 0) rotate(-17.1) translate(-2 2)">7</text>
+ <text font-size="5.0pt" transform="rotate(60) translate(20 0) rotate(-60) translate(-2 2)">8</text>
+ </g>
+ </symbol>
+
+ <symbol id="knob-smallest" viewBox="0 0 16px 16px">
+ <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>
+ </symbol>
+
+ <symbol id="knobguide-steps" viewBox="0 0 40px 40px">
+ <g transform="translate(20 20)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 2)">2</text>
+ <text font-size="5.0pt" transform="rotate(-190) translate(13 0) rotate(190) translate(-2 2)">3</text>
+ <text font-size="5.0pt" transform="rotate(-140) translate(13 0) rotate(140) translate(-2 2)">4</text>
+ <text font-size="5.0pt" transform="rotate(-90) translate(13 0) rotate(90) translate(-2 2)">5</text>
+ <text font-size="5.0pt" transform="rotate(-40) translate(13 0) rotate(40) translate(-2 2)">6</text>
+ <text font-size="5.0pt" transform="rotate(10) translate(13 0) rotate(-10) translate(-2 2)">7</text>
+ <text font-size="5.0pt" transform="rotate(60) translate(13 0) rotate(-60) translate(-2 2)">8</text>
+ </g>
+ </symbol>
+
+ <symbol id="switch" viewBox="0 0 14px 24px">
+ <rect width="14px" height="24px" stroke-width="1" stroke="#000" fill="#ddd" />
+ <rect width="14px" height="12px" stroke-width="0" fill="#000" />
+ </symbol>
+
+ <symbol id="light-small" viewBox="0 0 6.4px 6.4px">
+ <rect width="6.4" height="6.4" fill="#0f0" />
+ </symbol>
+
+ <symbol id="input" viewBox="0 0 24px 24px">
+ <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>
+ </symbol>
+
+ <symbol id="output" viewBox="0 0 24px 24px">
+ <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>
+ </symbol>
+ </defs>
+
+ <rect width="100%" height="100%" fill="#ddd" />
+ <polyline points="1,1 89,1 89,379 1,379 1,1" stroke="#e4e4e4" stroke-width="0.5" fill="none" />
+ <polyline points="0.5,0.5 89.5,0.5 89.5,379.5 0.5,379.5 0.5,0.5" stroke="#ebebeb" stroke-width="0.8" fill="none" />
+ <polyline points="0,0 90,0 90,380 0,380 0,0" stroke="#f2f2f2" stroke-width="1" fill="none" />
+
+ <text class="title" x="63" y="17" font-size="9pt" letter-spacing="3px">8:1</text>
+ <g transform="translate(5.5 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BOGAUDIO</text>
+ <rect width="1.5" height="2" fill="#ddd" transform="translate(21 -4)" />
+ </g>
+
+ <g transform="translate(6.5 32)">
+ <rect width="34" height="337" rx="5" fill="#fafafa" transform="translate(0 -9)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 0)">IN</text>
+
+ <use id="IN1_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">1</text>
+ <use id="IN1_LIGHT" xlink:href="#light-small" transform="translate(17 29.5)" />
+
+ <use id="IN2_INPUT" xlink:href="#input" transform="translate(5 44.3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 76.3)">2</text>
+ <use id="IN2_LIGHT" xlink:href="#light-small" transform="translate(17 70.8)" />
+
+ <use id="IN3_INPUT" xlink:href="#input" transform="translate(5 86.6)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 118.6)">3</text>
+ <use id="IN3_LIGHT" xlink:href="#light-small" transform="translate(17 113.1)" />
+
+ <use id="IN4_INPUT" xlink:href="#input" transform="translate(5 126.9)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 158.9)">4</text>
+ <use id="IN4_LIGHT" xlink:href="#light-small" transform="translate(17 153.4)" />
+
+ <use id="IN5_INPUT" xlink:href="#input" transform="translate(5 168.1)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 200.1)">5</text>
+ <use id="IN5_LIGHT" xlink:href="#light-small" transform="translate(17 194.6)" />
+
+ <use id="IN6_INPUT" xlink:href="#input" transform="translate(5 209.4)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 241.4)">6</text>
+ <use id="IN6_LIGHT" xlink:href="#light-small" transform="translate(17 235.9)" />
+
+ <use id="IN7_INPUT" xlink:href="#input" transform="translate(5 250.7)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 282.7)">7</text>
+ <use id="IN7_LIGHT" xlink:href="#light-small" transform="translate(17 277.2)" />
+
+ <use id="IN8_INPUT" xlink:href="#input" transform="translate(5 292)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 324)">8</text>
+ <use id="IN8_LIGHT" xlink:href="#light-small" transform="translate(17 318.5)" />
+ </g>
+
+ <g transform="translate(49.5 32)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <rect width="34" height="10" fill="#fafafa" transform="translate(0 30)" />
+ <use id="CLOCK_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="1px" transform="translate(4 35)">CLOCK</text>
+ </g>
+ <g transform="translate(49.5 69)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="RESET_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="1px" transform="translate(5 35)">RESET</text>
+ </g>
+
+ <g transform="translate(44 121)">
+ <text font-size="6pt" letter-spacing="1.5px" transform="translate(7.5 0)">STEPS</text>
+ <use id="STEPS_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 10.5)" />
+ <use xlink:href="#knobguide-steps" transform="translate(2.5 -1)" />
+ </g>
+
+ <g transform="translate(59 166)">
+ <text font-size="5pt" letter-spacing="2px" transform="translate(-1.8 -1)">FWD</text>
+ <use id="DIRECTION_PARAM" xlink:href="#switch" transform="translate(0 2)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(-1.3 34)">REV</text>
+ </g>
+
+ <!-- <rect width="45" height="14" fill="#0f0" transform="translate(0 200)" /> -->
+ <!-- <rect width="45" height="14" fill="#0f0" transform="translate(0 307)" /> -->
+ <g transform="translate(44 220)">
+ <text font-size="6pt" letter-spacing="1.5px" transform="translate(4.5 0)">SELECT</text>
+ <use id="SELECT_PARAM" xlink:href="#knob" transform="translate(0 2)" />
+ <use xlink:href="#knobguide-select" transform="translate(0 2)" />
+ <g transform="translate(5.5 47)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="SELECT_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11.5 35)">CV</text>
+ </g>
+ </g>
+
+ <g transform="translate(49.5 321)">
+ <rect width="34" height="39" rx="5" fill="#bbb" />
+ <use id="OUT_OUTPUT" xlink:href="#output" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(8 35)">OUT</text>
+ </g>
+
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 47)" /> -->
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 336)" /> -->
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 351)" /> -->
+ <!-- <polyline points="0,0 0,360" stroke="#f00" stroke-width="1" fill="none" transform="translate(66.50 0)" /> -->
+</svg>
diff --git a/res-src/OneEight-src.svg b/res-src/OneEight-src.svg
@@ -0,0 +1,186 @@
+<svg
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="90"
+ height="380"
+ viewBox="0 0 90 380"
+>
+ <style>
+ text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+ }
+ text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+ }
+ text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+ }
+ </style>
+
+ <defs>
+ <symbol id="knob" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f" />
+ <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f" />
+ <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none" />
+ </g>
+ </symbol>
+
+ <symbol id="knobguide-select" viewBox="0 0 45px 45px">
+ <g transform="translate(22.5 22.5)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(20 0) rotate(240) translate(-2 2)">1</text>
+ <text font-size="5.0pt" transform="rotate(-197.1) translate(20 0) rotate(197.1) translate(-2 2)">2</text>
+ <text font-size="5.0pt" transform="rotate(-154.3) translate(20 0) rotate(154.3) translate(-2 2)">3</text>
+ <text font-size="5.0pt" transform="rotate(-111.4) translate(20 0) rotate(111.4) translate(-2 2)">4</text>
+ <text font-size="5.0pt" transform="rotate(-68.6) translate(20 0) rotate(68.6) translate(-2 2)">5</text>
+ <text font-size="5.0pt" transform="rotate(-25.7) translate(20 0) rotate(25.7) translate(-2 2)">6</text>
+ <text font-size="5.0pt" transform="rotate(17.1) translate(20 0) rotate(-17.1) translate(-2 2)">7</text>
+ <text font-size="5.0pt" transform="rotate(60) translate(20 0) rotate(-60) translate(-2 2)">8</text>
+ </g>
+ </symbol>
+
+ <symbol id="knob-smallest" viewBox="0 0 16px 16px">
+ <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>
+ </symbol>
+
+ <symbol id="knobguide-steps" viewBox="0 0 40px 40px">
+ <g transform="translate(20 20)">
+ <text font-size="5.0pt" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 2)">2</text>
+ <text font-size="5.0pt" transform="rotate(-190) translate(13 0) rotate(190) translate(-2 2)">3</text>
+ <text font-size="5.0pt" transform="rotate(-140) translate(13 0) rotate(140) translate(-2 2)">4</text>
+ <text font-size="5.0pt" transform="rotate(-90) translate(13 0) rotate(90) translate(-2 2)">5</text>
+ <text font-size="5.0pt" transform="rotate(-40) translate(13 0) rotate(40) translate(-2 2)">6</text>
+ <text font-size="5.0pt" transform="rotate(10) translate(13 0) rotate(-10) translate(-2 2)">7</text>
+ <text font-size="5.0pt" transform="rotate(60) translate(13 0) rotate(-60) translate(-2 2)">8</text>
+ </g>
+ </symbol>
+
+ <symbol id="switch" viewBox="0 0 14px 24px">
+ <rect width="14px" height="24px" stroke-width="1" stroke="#000" fill="#ddd" />
+ <rect width="14px" height="12px" stroke-width="0" fill="#000" />
+ </symbol>
+
+ <symbol id="light-small" viewBox="0 0 6.4px 6.4px">
+ <rect width="6.4" height="6.4" fill="#0f0" />
+ </symbol>
+
+ <symbol id="input" viewBox="0 0 24px 24px">
+ <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>
+ </symbol>
+
+ <symbol id="output" viewBox="0 0 24px 24px">
+ <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>
+ </symbol>
+ </defs>
+
+ <rect width="100%" height="100%" fill="#ddd" />
+ <polyline points="1,1 89,1 89,379 1,379 1,1" stroke="#e4e4e4" stroke-width="0.5" fill="none" />
+ <polyline points="0.5,0.5 89.5,0.5 89.5,379.5 0.5,379.5 0.5,0.5" stroke="#ebebeb" stroke-width="0.8" fill="none" />
+ <polyline points="0,0 90,0 90,380 0,380 0,0" stroke="#f2f2f2" stroke-width="1" fill="none" />
+
+ <text class="title" x="63" y="17" font-size="9pt" letter-spacing="3px">1:8</text>
+ <g transform="translate(5.5 374)">
+ <text class="brand" font-size="6.5pt" letter-spacing="2px">BOGAUDIO</text>
+ <rect width="1.5" height="2" fill="#ddd" transform="translate(21 -4)" />
+ </g>
+
+ <g transform="translate(6.5 32)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <rect width="34" height="10" fill="#fafafa" transform="translate(0 30)" />
+ <use id="CLOCK_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="1px" transform="translate(4 35)">CLOCK</text>
+ </g>
+ <g transform="translate(6.5 69)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="RESET_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="1px" transform="translate(5 35)">RESET</text>
+ </g>
+
+ <g transform="translate(1 121)">
+ <text font-size="6pt" letter-spacing="1.5px" transform="translate(7.5 0)">STEPS</text>
+ <use id="STEPS_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 10.5)" />
+ <use xlink:href="#knobguide-steps" transform="translate(2.5 -1)" />
+ </g>
+
+ <g transform="translate(16.5 166)">
+ <text font-size="5pt" letter-spacing="2px" transform="translate(-1.8 -1)">FWD</text>
+ <use id="DIRECTION_PARAM" xlink:href="#switch" transform="translate(0 2)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(-1.3 34)">REV</text>
+ </g>
+
+ <!-- <rect width="45" height="14" fill="#0f0" transform="translate(0 200)" /> -->
+ <!-- <rect width="45" height="14" fill="#0f0" transform="translate(0 307)" /> -->
+ <g transform="translate(1 220)">
+ <text font-size="6pt" letter-spacing="1.5px" transform="translate(4.5 0)">SELECT</text>
+ <use id="SELECT_PARAM" xlink:href="#knob" transform="translate(0 2)" />
+ <use xlink:href="#knobguide-select" transform="translate(0 2)" />
+ <g transform="translate(5.5 47)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="SELECT_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11.5 35)">CV</text>
+ </g>
+ </g>
+
+ <g transform="translate(6.5 321)">
+ <rect width="34" height="39" rx="5" fill="#fafafa" />
+ <use id="IN_INPUT" xlink:href="#input" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">IN</text>
+ </g>
+
+ <g transform="translate(49.5 32)">
+ <rect width="34" height="337" rx="5" fill="#bbb" transform="translate(0 -9)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 0)">OUT</text>
+
+ <use id="OUT1_OUTPUT" xlink:href="#output" transform="translate(5 3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">1</text>
+ <use id="OUT1_LIGHT" xlink:href="#light-small" transform="translate(17 29.5)" />
+
+ <use id="OUT2_OUTPUT" xlink:href="#output" transform="translate(5 44.3)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 76.3)">2</text>
+ <use id="OUT2_LIGHT" xlink:href="#light-small" transform="translate(17 70.8)" />
+
+ <use id="OUT3_OUTPUT" xlink:href="#output" transform="translate(5 86.6)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 118.6)">3</text>
+ <use id="OUT3_LIGHT" xlink:href="#light-small" transform="translate(17 113.1)" />
+
+ <use id="OUT4_OUTPUT" xlink:href="#output" transform="translate(5 126.9)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 158.9)">4</text>
+ <use id="OUT4_LIGHT" xlink:href="#light-small" transform="translate(17 153.4)" />
+
+ <use id="OUT5_OUTPUT" xlink:href="#output" transform="translate(5 168.1)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 200.1)">5</text>
+ <use id="OUT5_LIGHT" xlink:href="#light-small" transform="translate(17 194.6)" />
+
+ <use id="OUT6_OUTPUT" xlink:href="#output" transform="translate(5 209.4)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 241.4)">6</text>
+ <use id="OUT6_LIGHT" xlink:href="#light-small" transform="translate(17 235.9)" />
+
+ <use id="OUT7_OUTPUT" xlink:href="#output" transform="translate(5 250.7)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 282.7)">7</text>
+ <use id="OUT7_LIGHT" xlink:href="#light-small" transform="translate(17 277.2)" />
+
+ <use id="OUT8_OUTPUT" xlink:href="#output" transform="translate(5 292)" />
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11 324)">8</text>
+ <use id="OUT8_LIGHT" xlink:href="#light-small" transform="translate(17 318.5)" />
+ </g>
+
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 47)" /> -->
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 336)" /> -->
+ <!-- <polyline points="0,0 90,0" stroke="#f00" stroke-width="1" fill="none" transform="translate(0 351)" /> -->
+ <!-- <polyline points="0,0 0,360" stroke="#f00" stroke-width="1" fill="none" transform="translate(23.50 0)" /> -->
+</svg>
diff --git a/res/AddrSeq.svg b/res/AddrSeq.svg
Binary files differ.
diff --git a/res/EightOne.svg b/res/EightOne.svg
Binary files differ.
diff --git a/res/OneEight.svg b/res/OneEight.svg
Binary files differ.
diff --git a/src/AddrSeq.cpp b/src/AddrSeq.cpp
@@ -0,0 +1,110 @@
+
+#include "AddrSeq.hpp"
+
+void AddrSeq::onReset() {
+ _step = 0;
+ _clock.reset();
+ _reset.reset();
+}
+
+void AddrSeq::step() {
+ int steps = params[STEPS_PARAM].value;
+ int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f);
+ _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps;
+ _step += (_step < 0) * steps;
+ _step -= _step * _reset.process(inputs[RESET_INPUT].value);
+ int step = _step + (int)params[SELECT_PARAM].value;
+ step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f);
+ step = step % 8;
+
+ float out = 0.0f;
+ for (int i = 0; i < 8; ++i) {
+ out += params[OUT1_PARAM + i].value * (step == i);
+ lights[OUT1_LIGHT + i].value = step == i;
+ }
+ outputs[OUT_OUTPUT].value = out * 10.0f;
+}
+
+struct AddrSeqWidget : ModuleWidget {
+ static constexpr int hp = 6;
+
+ AddrSeqWidget(AddrSeq* module) : ModuleWidget(module) {
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+
+ {
+ SVGPanel *panel = new SVGPanel();
+ panel->box.size = box.size;
+ panel->setBackground(SVG::load(assetPlugin(plugin, "res/AddrSeq.svg")));
+ addChild(panel);
+ }
+
+ addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
+ addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
+
+ // generated by svg_widgets.rb
+ auto stepsParamPosition = Vec(15.5, 131.5);
+ auto directionParamPosition = Vec(16.0, 167.5);
+ auto selectParamPosition = Vec(9.0, 230.0);
+ auto out1ParamPosition = Vec(58.5, 36.0);
+ auto out2ParamPosition = Vec(58.5, 77.3);
+ auto out3ParamPosition = Vec(58.5, 118.6);
+ auto out4ParamPosition = Vec(58.5, 159.9);
+ auto out5ParamPosition = Vec(58.5, 201.1);
+ auto out6ParamPosition = Vec(58.5, 242.4);
+ auto out7ParamPosition = Vec(58.5, 283.7);
+ auto out8ParamPosition = Vec(58.5, 325.0);
+
+ auto clockInputPosition = Vec(11.5, 35.0);
+ auto resetInputPosition = Vec(11.5, 72.0);
+ auto selectInputPosition = Vec(11.5, 270.0);
+
+ auto outOutputPosition = Vec(11.5, 324.0);
+
+ auto out1LightPosition = Vec(66.5, 58.5);
+ auto out2LightPosition = Vec(66.5, 99.8);
+ auto out3LightPosition = Vec(66.5, 141.1);
+ auto out4LightPosition = Vec(66.5, 182.4);
+ auto out5LightPosition = Vec(66.5, 223.6);
+ auto out6LightPosition = Vec(66.5, 264.9);
+ auto out7LightPosition = Vec(66.5, 306.2);
+ auto out8LightPosition = Vec(66.5, 347.5);
+ // end generated by svg_widgets.rb
+
+ {
+ auto w = ParamWidget::create<Knob16>(stepsParamPosition, module, AddrSeq::STEPS_PARAM, 2.0, 8.0, 8.0);
+ dynamic_cast<Knob*>(w)->snap = true;
+ addParam(w);
+ }
+ addParam(ParamWidget::create<SliderSwitch2State14>(directionParamPosition, module, AddrSeq::DIRECTION_PARAM, 0.0, 1.0, 1.0));
+ {
+ auto w = ParamWidget::create<Knob29>(selectParamPosition, module, AddrSeq::SELECT_PARAM, 0.0, 7.0, 0.0);
+ dynamic_cast<Knob*>(w)->snap = true;
+ addParam(w);
+ }
+ addParam(ParamWidget::create<Knob16>(out1ParamPosition, module, AddrSeq::OUT1_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out2ParamPosition, module, AddrSeq::OUT2_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out3ParamPosition, module, AddrSeq::OUT3_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out4ParamPosition, module, AddrSeq::OUT4_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out5ParamPosition, module, AddrSeq::OUT5_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out6ParamPosition, module, AddrSeq::OUT6_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out7ParamPosition, module, AddrSeq::OUT7_PARAM, -1.0, 1.0, 0.0));
+ addParam(ParamWidget::create<Knob16>(out8ParamPosition, module, AddrSeq::OUT8_PARAM, -1.0, 1.0, 0.0));
+
+ addInput(Port::create<Port24>(clockInputPosition, Port::INPUT, module, AddrSeq::CLOCK_INPUT));
+ addInput(Port::create<Port24>(resetInputPosition, Port::INPUT, module, AddrSeq::RESET_INPUT));
+ addInput(Port::create<Port24>(selectInputPosition, Port::INPUT, module, AddrSeq::SELECT_INPUT));
+
+ addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, AddrSeq::OUT_OUTPUT));
+
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out1LightPosition, module, AddrSeq::OUT1_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out2LightPosition, module, AddrSeq::OUT2_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out3LightPosition, module, AddrSeq::OUT3_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out4LightPosition, module, AddrSeq::OUT4_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out5LightPosition, module, AddrSeq::OUT5_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out6LightPosition, module, AddrSeq::OUT6_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out7LightPosition, module, AddrSeq::OUT7_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out8LightPosition, module, AddrSeq::OUT8_LIGHT));
+ }
+};
+
+Model* modelAddrSeq = createModel<AddrSeq, AddrSeqWidget>("Bogaudio-AddrSeq", "ADDR-SEQ", "voltage-addressable sequencer", SEQUENCER_TAG);
diff --git a/src/AddrSeq.hpp b/src/AddrSeq.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "bogaudio.hpp"
+
+extern Model* modelAddrSeq;
+
+namespace bogaudio {
+
+struct AddrSeq : Module {
+ enum ParamsIds {
+ STEPS_PARAM,
+ DIRECTION_PARAM,
+ SELECT_PARAM,
+ OUT1_PARAM,
+ OUT2_PARAM,
+ OUT3_PARAM,
+ OUT4_PARAM,
+ OUT5_PARAM,
+ OUT6_PARAM,
+ OUT7_PARAM,
+ OUT8_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ CLOCK_INPUT,
+ RESET_INPUT,
+ SELECT_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ enum LightsIds {
+ OUT1_LIGHT,
+ OUT2_LIGHT,
+ OUT3_LIGHT,
+ OUT4_LIGHT,
+ OUT5_LIGHT,
+ OUT6_LIGHT,
+ OUT7_LIGHT,
+ OUT8_LIGHT,
+ NUM_LIGHTS
+ };
+
+ Trigger _clock;
+ Trigger _reset;
+ int _step;
+
+ AddrSeq() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
+ onReset();
+ }
+
+ void onReset() override;
+ void step() override;
+};
+
+} // namespace bogaudio
diff --git a/src/EightOne.cpp b/src/EightOne.cpp
@@ -0,0 +1,110 @@
+
+#include "EightOne.hpp"
+
+void EightOne::onReset() {
+ _step = 0;
+ _clock.reset();
+ _reset.reset();
+}
+
+void EightOne::step() {
+ int steps = params[STEPS_PARAM].value;
+ int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f);
+ _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps;
+ _step += (_step < 0) * steps;
+ _step -= _step * _reset.process(inputs[RESET_INPUT].value);
+ int step = _step + (int)params[SELECT_PARAM].value;
+ step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f);
+ step = step % 8;
+
+ float out = 0.0f;
+ for (int i = 0; i < 8; ++i) {
+ out += inputs[IN1_INPUT + i].value * (step == i);
+ lights[IN1_LIGHT + i].value = step == i;
+ }
+ outputs[OUT_OUTPUT].value = out;
+}
+
+struct EightOneWidget : ModuleWidget {
+ static constexpr int hp = 6;
+
+ EightOneWidget(EightOne* module) : ModuleWidget(module) {
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+
+ {
+ SVGPanel *panel = new SVGPanel();
+ panel->box.size = box.size;
+ panel->setBackground(SVG::load(assetPlugin(plugin, "res/EightOne.svg")));
+ addChild(panel);
+ }
+
+ addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
+ addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
+
+ // generated by svg_widgets.rb
+ auto stepsParamPosition = Vec(58.5, 131.5);
+ auto directionParamPosition = Vec(58.5, 167.5);
+ auto selectParamPosition = Vec(52.0, 230.0);
+
+ auto in1InputPosition = Vec(11.5, 35.0);
+ auto in2InputPosition = Vec(11.5, 76.3);
+ auto in3InputPosition = Vec(11.5, 118.6);
+ auto in4InputPosition = Vec(11.5, 158.9);
+ auto in5InputPosition = Vec(11.5, 200.1);
+ auto in6InputPosition = Vec(11.5, 241.4);
+ auto in7InputPosition = Vec(11.5, 282.7);
+ auto in8InputPosition = Vec(11.5, 324.0);
+ auto clockInputPosition = Vec(54.5, 35.0);
+ auto resetInputPosition = Vec(54.5, 72.0);
+ auto selectInputPosition = Vec(54.5, 270.0);
+
+ auto outOutputPosition = Vec(54.5, 324.0);
+
+ auto in1LightPosition = Vec(23.5, 61.5);
+ auto in2LightPosition = Vec(23.5, 102.8);
+ auto in3LightPosition = Vec(23.5, 145.1);
+ auto in4LightPosition = Vec(23.5, 185.4);
+ auto in5LightPosition = Vec(23.5, 226.6);
+ auto in6LightPosition = Vec(23.5, 267.9);
+ auto in7LightPosition = Vec(23.5, 309.2);
+ auto in8LightPosition = Vec(23.5, 350.5);
+ // end generated by svg_widgets.rb
+
+ {
+ auto w = ParamWidget::create<Knob16>(stepsParamPosition, module, EightOne::STEPS_PARAM, 2.0, 8.0, 8.0);
+ dynamic_cast<Knob*>(w)->snap = true;
+ addParam(w);
+ }
+ addParam(ParamWidget::create<SliderSwitch2State14>(directionParamPosition, module, EightOne::DIRECTION_PARAM, 0.0, 1.0, 1.0));
+ {
+ auto w = ParamWidget::create<Knob29>(selectParamPosition, module, EightOne::SELECT_PARAM, 0.0, 7.0, 0.0);
+ dynamic_cast<Knob*>(w)->snap = true;
+ addParam(w);
+ }
+
+ addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, EightOne::IN1_INPUT));
+ addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, EightOne::IN2_INPUT));
+ addInput(Port::create<Port24>(in3InputPosition, Port::INPUT, module, EightOne::IN3_INPUT));
+ addInput(Port::create<Port24>(in4InputPosition, Port::INPUT, module, EightOne::IN4_INPUT));
+ addInput(Port::create<Port24>(in5InputPosition, Port::INPUT, module, EightOne::IN5_INPUT));
+ addInput(Port::create<Port24>(in6InputPosition, Port::INPUT, module, EightOne::IN6_INPUT));
+ addInput(Port::create<Port24>(in7InputPosition, Port::INPUT, module, EightOne::IN7_INPUT));
+ addInput(Port::create<Port24>(in8InputPosition, Port::INPUT, module, EightOne::IN8_INPUT));
+ addInput(Port::create<Port24>(clockInputPosition, Port::INPUT, module, EightOne::CLOCK_INPUT));
+ addInput(Port::create<Port24>(resetInputPosition, Port::INPUT, module, EightOne::RESET_INPUT));
+ addInput(Port::create<Port24>(selectInputPosition, Port::INPUT, module, EightOne::SELECT_INPUT));
+
+ addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, EightOne::OUT_OUTPUT));
+
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in1LightPosition, module, EightOne::IN1_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in2LightPosition, module, EightOne::IN2_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in3LightPosition, module, EightOne::IN3_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in4LightPosition, module, EightOne::IN4_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in5LightPosition, module, EightOne::IN5_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in6LightPosition, module, EightOne::IN6_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in7LightPosition, module, EightOne::IN7_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(in8LightPosition, module, EightOne::IN8_LIGHT));
+ }
+};
+
+Model* modelEightOne = createModel<EightOne, EightOneWidget>("Bogaudio-EightOne", "8:1", "demux & sequential switch", SWITCH_TAG);
diff --git a/src/EightOne.hpp b/src/EightOne.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "bogaudio.hpp"
+
+extern Model* modelEightOne;
+
+namespace bogaudio {
+
+struct EightOne : Module {
+ enum ParamsIds {
+ STEPS_PARAM,
+ DIRECTION_PARAM,
+ SELECT_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ IN1_INPUT,
+ IN2_INPUT,
+ IN3_INPUT,
+ IN4_INPUT,
+ IN5_INPUT,
+ IN6_INPUT,
+ IN7_INPUT,
+ IN8_INPUT,
+ CLOCK_INPUT,
+ RESET_INPUT,
+ SELECT_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ enum LightsIds {
+ IN1_LIGHT,
+ IN2_LIGHT,
+ IN3_LIGHT,
+ IN4_LIGHT,
+ IN5_LIGHT,
+ IN6_LIGHT,
+ IN7_LIGHT,
+ IN8_LIGHT,
+ NUM_LIGHTS
+ };
+
+ Trigger _clock;
+ Trigger _reset;
+ int _step;
+
+ EightOne() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
+ onReset();
+ }
+
+ void onReset() override;
+ void step() override;
+};
+
+} // namespace bogaudio
diff --git a/src/OneEight.cpp b/src/OneEight.cpp
@@ -0,0 +1,109 @@
+
+#include "OneEight.hpp"
+
+void OneEight::onReset() {
+ _step = 0;
+ _clock.reset();
+ _reset.reset();
+}
+
+void OneEight::step() {
+ int steps = params[STEPS_PARAM].value;
+ int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f);
+ _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps;
+ _step += (_step < 0) * steps;
+ _step -= _step * _reset.process(inputs[RESET_INPUT].value);
+ int step = _step + (int)params[SELECT_PARAM].value;
+ step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f);
+ step = step % 8;
+
+ float in = inputs[IN_INPUT].value + !inputs[IN_INPUT].active * 10.0f;
+ for (int i = 0; i < 8; ++i) {
+ outputs[OUT1_OUTPUT + i].value = (step == i) * in;
+ lights[OUT1_LIGHT + i].value = step == i;
+ }
+}
+
+struct OneEightWidget : ModuleWidget {
+ static constexpr int hp = 6;
+
+ OneEightWidget(OneEight* module) : ModuleWidget(module) {
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+
+ {
+ SVGPanel *panel = new SVGPanel();
+ panel->box.size = box.size;
+ panel->setBackground(SVG::load(assetPlugin(plugin, "res/OneEight.svg")));
+ addChild(panel);
+ }
+
+ addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
+ addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
+
+ // generated by svg_widgets.rb
+ auto stepsParamPosition = Vec(15.5, 131.5);
+ auto directionParamPosition = Vec(16.0, 167.5);
+ auto selectParamPosition = Vec(9.0, 230.0);
+
+ auto clockInputPosition = Vec(11.5, 35.0);
+ auto resetInputPosition = Vec(11.5, 72.0);
+ auto selectInputPosition = Vec(11.5, 270.0);
+ auto inInputPosition = Vec(11.5, 324.0);
+
+ auto out1OutputPosition = Vec(54.5, 35.0);
+ auto out2OutputPosition = Vec(54.5, 76.3);
+ auto out3OutputPosition = Vec(54.5, 118.6);
+ auto out4OutputPosition = Vec(54.5, 158.9);
+ auto out5OutputPosition = Vec(54.5, 200.1);
+ auto out6OutputPosition = Vec(54.5, 241.4);
+ auto out7OutputPosition = Vec(54.5, 282.7);
+ auto out8OutputPosition = Vec(54.5, 324.0);
+
+ auto out1LightPosition = Vec(66.5, 61.5);
+ auto out2LightPosition = Vec(66.5, 102.8);
+ auto out3LightPosition = Vec(66.5, 145.1);
+ auto out4LightPosition = Vec(66.5, 185.4);
+ auto out5LightPosition = Vec(66.5, 226.6);
+ auto out6LightPosition = Vec(66.5, 267.9);
+ auto out7LightPosition = Vec(66.5, 309.2);
+ auto out8LightPosition = Vec(66.5, 350.5);
+ // end generated by svg_widgets.rb
+
+ {
+ auto w = ParamWidget::create<Knob16>(stepsParamPosition, module, OneEight::STEPS_PARAM, 2.0, 8.0, 8.0);
+ dynamic_cast<Knob*>(w)->snap = true;
+ addParam(w);
+ }
+ addParam(ParamWidget::create<SliderSwitch2State14>(directionParamPosition, module, OneEight::DIRECTION_PARAM, 0.0, 1.0, 1.0));
+ {
+ auto w = ParamWidget::create<Knob29>(selectParamPosition, module, OneEight::SELECT_PARAM, 0.0, 7.0, 0.0);
+ dynamic_cast<Knob*>(w)->snap = true;
+ addParam(w);
+ }
+
+ addInput(Port::create<Port24>(clockInputPosition, Port::INPUT, module, OneEight::CLOCK_INPUT));
+ addInput(Port::create<Port24>(resetInputPosition, Port::INPUT, module, OneEight::RESET_INPUT));
+ addInput(Port::create<Port24>(selectInputPosition, Port::INPUT, module, OneEight::SELECT_INPUT));
+ addInput(Port::create<Port24>(inInputPosition, Port::INPUT, module, OneEight::IN_INPUT));
+
+ addOutput(Port::create<Port24>(out1OutputPosition, Port::OUTPUT, module, OneEight::OUT1_OUTPUT));
+ addOutput(Port::create<Port24>(out2OutputPosition, Port::OUTPUT, module, OneEight::OUT2_OUTPUT));
+ addOutput(Port::create<Port24>(out3OutputPosition, Port::OUTPUT, module, OneEight::OUT3_OUTPUT));
+ addOutput(Port::create<Port24>(out4OutputPosition, Port::OUTPUT, module, OneEight::OUT4_OUTPUT));
+ addOutput(Port::create<Port24>(out5OutputPosition, Port::OUTPUT, module, OneEight::OUT5_OUTPUT));
+ addOutput(Port::create<Port24>(out6OutputPosition, Port::OUTPUT, module, OneEight::OUT6_OUTPUT));
+ addOutput(Port::create<Port24>(out7OutputPosition, Port::OUTPUT, module, OneEight::OUT7_OUTPUT));
+ addOutput(Port::create<Port24>(out8OutputPosition, Port::OUTPUT, module, OneEight::OUT8_OUTPUT));
+
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out1LightPosition, module, OneEight::OUT1_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out2LightPosition, module, OneEight::OUT2_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out3LightPosition, module, OneEight::OUT3_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out4LightPosition, module, OneEight::OUT4_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out5LightPosition, module, OneEight::OUT5_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out6LightPosition, module, OneEight::OUT6_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out7LightPosition, module, OneEight::OUT7_LIGHT));
+ addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(out8LightPosition, module, OneEight::OUT8_LIGHT));
+ }
+};
+
+Model* modelOneEight = createModel<OneEight, OneEightWidget>("Bogaudio-OneEight", "1:8", "mux & sequential switch", SWITCH_TAG);
diff --git a/src/OneEight.hpp b/src/OneEight.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "bogaudio.hpp"
+
+extern Model* modelOneEight;
+
+namespace bogaudio {
+
+struct OneEight : Module {
+ enum ParamsIds {
+ STEPS_PARAM,
+ DIRECTION_PARAM,
+ SELECT_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ CLOCK_INPUT,
+ RESET_INPUT,
+ SELECT_INPUT,
+ IN_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ OUT1_OUTPUT,
+ OUT2_OUTPUT,
+ OUT3_OUTPUT,
+ OUT4_OUTPUT,
+ OUT5_OUTPUT,
+ OUT6_OUTPUT,
+ OUT7_OUTPUT,
+ OUT8_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ enum LightsIds {
+ OUT1_LIGHT,
+ OUT2_LIGHT,
+ OUT3_LIGHT,
+ OUT4_LIGHT,
+ OUT5_LIGHT,
+ OUT6_LIGHT,
+ OUT7_LIGHT,
+ OUT8_LIGHT,
+ NUM_LIGHTS
+ };
+
+ Trigger _clock;
+ Trigger _reset;
+ int _step;
+
+ OneEight() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
+ onReset();
+ }
+
+ void onReset() override;
+ void step() override;
+};
+
+} // namespace bogaudio
diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp
@@ -4,6 +4,7 @@
#include "AD.hpp"
#include "ADSR.hpp"
#include "Additator.hpp"
+#include "AddrSeq.hpp"
#include "AMRM.hpp"
#include "Analyzer.hpp"
#include "AnalyzerXL.hpp"
@@ -18,6 +19,7 @@
#include "DGate.hpp"
#include "Detune.hpp"
#include "EightFO.hpp"
+#include "EightOne.hpp"
#include "FMOp.hpp"
#include "FlipFlop.hpp"
#include "Follow.hpp"
@@ -34,6 +36,7 @@
#include "Noise.hpp"
#include "Nsgt.hpp"
#include "Offset.hpp"
+#include "OneEight.hpp"
#include "Pan.hpp"
#include "Pressor.hpp"
#include "Reftone.hpp"
@@ -110,6 +113,10 @@ void init(rack::Plugin *p) {
p->addModel(modelLmtr);
p->addModel(modelNsgt);
+ p->addModel(modelOneEight);
+ p->addModel(modelEightOne);
+ p->addModel(modelAddrSeq);
+
p->addModel(modelAnalyzer);
p->addModel(modelAnalyzerXL);
p->addModel(modelVU);