BogaudioModules

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

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:
Ares-src/AddrSeq-src.svg | 219+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares-src/EightOne-src.svg | 186+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares-src/OneEight-src.svg | 186+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares/AddrSeq.svg | 0
Ares/EightOne.svg | 0
Ares/OneEight.svg | 0
Asrc/AddrSeq.cpp | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/AddrSeq.hpp | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/EightOne.cpp | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/EightOne.hpp | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/OneEight.cpp | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/OneEight.hpp | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/bogaudio.cpp | 7+++++++
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);