BogaudioModules

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

commit ccf5c5b43cb43113324d1c1b99fbab97e254be02
parent 403f4adb41e9023efe1dd678f8b72a2dfec87d41
Author: Matt Demanett <matt@demanett.net>
Date:   Tue, 22 May 2018 13:06:58 -0500

Mix4: add pan CV inputs, etc.

Diffstat:
Mres-src/Mix4-src.svg | 148+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Ares-src/button_18px_1_orange-src.svg | 28++++++++++++++++++++++++++++
Mres/Mix4.svg | 0
Ares/button_18px_1_orange.svg | 0
Msrc/Mix4.cpp | 91++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/Mix4.hpp | 16++++++++--------
Msrc/mixer.cpp | 14+++++++++++---
Msrc/mixer.hpp | 15+++++++++------
Msrc/widgets.cpp | 10++++++++--
Msrc/widgets.hpp | 15+++++++++++++--
10 files changed, 207 insertions(+), 130 deletions(-)

diff --git a/res-src/Mix4-src.svg b/res-src/Mix4-src.svg @@ -23,9 +23,10 @@ </style> <defs> - <symbol id="slider" viewBox="0 0 18px 183px"> - <rect width="6" height="177" x="6" y="3" rx="2" stroke-width="1" stroke="#888" fill="#222" /> - <g transform="translate(0 85)"> + <symbol id="slider" viewBox="0 0 18px 151x"> + <rect width="18" height="151" fill="none" /> + <rect width="6" height="145" x="6" y="3" rx="2" stroke-width="1" stroke="#888" fill="#222" /> + <g transform="translate(0 40)"> <rect width="18" height="13" rx="1.5" fill="#777" /> <rect width="18" height="9" x="0" y="2" fill="#444" /> <polyline points="0,6.5 18,6.5" stroke="#fafafa" stroke-width="1" fill="none" /> @@ -33,43 +34,39 @@ </g> </symbol> - <symbol id="sliderguide-db" viewBox="0 0 20px 183px"> + <symbol id="sliderguide-db" viewBox="0 0 20px 151px"> <g transform="translate(0 6.5)"> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> </g> - <g transform="translate(0 20.67)"> - <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> - <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> - <text font-size="6.0pt" transform="translate(7 0) rotate(0) translate(-2.5 2.6)">6</text> - </g> - <g transform="translate(0 34.83)"> + <g transform="translate(0 19.05)"> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> <text font-size="6.0pt" transform="translate(7 0) rotate(0) translate(-2.5 2.6)">0</text> </g> - <g transform="translate(0 49)"> + <g transform="translate(0 32.86)"> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> <text font-size="6.0pt" transform="translate(7 0) rotate(-90) translate(-4 2.2)">-6</text> </g> - <g transform="translate(0 63.17)"> + <g transform="translate(0 46.05)"> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> <text font-size="6.0pt" transform="translate(7 0) rotate(-90) translate(-7 2.2)">-12</text> </g> - <g transform="translate(0 91.5)"> + <g transform="translate(0 72.41)"> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> <text font-size="6.0pt" transform="translate(7 0) rotate(-90) translate(-7 2.2)">-24</text> </g> - <g transform="translate(0 148.17)"> + <g transform="translate(0 125.14)"> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(28 0)" /> <text font-size="6.0pt" transform="translate(7 0) rotate(-90) translate(-7 2.2)">-48</text> </g> - <g transform="translate(0 170)"> - <text font-size="6.0pt" transform="translate(7 0) rotate(-90) translate(-9 4)">dB</text> + <g transform="translate(0 151.5)"> + <!-- <polyline points="0,0 6.5,0" stroke="#333" fill="none" transform="translate(10.5 0)" /> --> + <text font-size="6.0pt" transform="translate(7 -10) rotate(-90) translate(-9 4)">dB</text> </g> </symbol> @@ -115,9 +112,9 @@ </defs> <rect width="100%" height="100%" fill="#ddd" /> - <polyline points="1,1 269,1 269,379 1,379 1,1" stroke="#e4e4e4" stroke-width="0.5" fill="none" /> - <polyline points="0.5,0.5 269.5,0.5 269.5,379.5 0.5,379.5 0.5,0.5" stroke="#ebebeb" stroke-width="0.8" fill="none" /> - <polyline points="0,0 270,0 270,380 0,380 0,0" stroke="#f2f2f2" stroke-width="1" fill="none" /> + <polyline points="1,1 224,1 224,379 1,379 1,1" stroke="#e4e4e4" stroke-width="0.5" fill="none" /> + <polyline points="0.5,0.5 224.5,0.5 224.5,379.5 0.5,379.5 0.5,0.5" stroke="#ebebeb" stroke-width="0.8" fill="none" /> + <polyline points="0,0 225,0 225,380 0,380 0,0" stroke="#f2f2f2" stroke-width="1" fill="none" /> <!-- <rect width="85" height="20" fill="#0f0" transform="translate(0 0)" /> --> <!-- <rect width="85" height="20" fill="#0f0" transform="translate(140 0)" /> --> @@ -133,19 +130,21 @@ <g transform="translate(4 20)"> <!-- <rect width="39" height="344" fill="#ccc" transform="translate(3 0)" /> --> <text font-size="5pt" letter-spacing="2px" transform="translate(13.7 9)">CH1</text> - <use xlink:href="#sliderguide-db" transform="translate(0 10)" /> - <use id="LEVEL1_PARAM" xlink:href="#slider" transform="translate(13.5 10)" /> - <use id="PAN1_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 201)" /> - <use xlink:href="#knobguide-centertick" transform="translate(2.5 189)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(14 226)">PAN</text> - <use id="MUTE1_PARAM" xlink:href="#button" transform="translate(12.5 232)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(10 260)">MUTE</text> - <g transform="translate(5.5 267)"> - <rect width="34" height="73" rx="5" fill="#fafafa" /> + <use xlink:href="#sliderguide-db" transform="translate(0 12)" /> + <use id="LEVEL1_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> + <use id="MUTE1_PARAM" xlink:href="#button" transform="translate(12.5 165)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(10 192)">MUTE</text> + <use id="PAN1_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 203)" /> + <use xlink:href="#knobguide-centertick" transform="translate(2.5 191)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(14 228)">PAN</text> + <g transform="translate(5.5 232)"> + <rect width="34" height="108" rx="5" fill="#fafafa" /> <use id="CV1_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">CV</text> - <use id="IN1_INPUT" xlink:href="#input" transform="translate(5 38)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 70)">IN</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(3.5 35)">LEVEL</text> + <use id="PAN1_INPUT" xlink:href="#input" transform="translate(5 38)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 70)">PAN</text> + <use id="IN1_INPUT" xlink:href="#input" transform="translate(5 73)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 105)">IN</text> </g> <!-- <rect width="8" height="40" fill="#f00" transform="translate(39.5 300)" /> --> </g> @@ -153,19 +152,21 @@ <g transform="translate(47 20)"> <!-- <rect width="39" height="344" fill="#ccc" transform="translate(3 0)" /> --> <text font-size="5pt" letter-spacing="2px" transform="translate(13.7 9)">CH2</text> - <use xlink:href="#sliderguide-db" transform="translate(0 10)" /> - <use id="LEVEL2_PARAM" xlink:href="#slider" transform="translate(13.5 10)" /> - <use id="PAN2_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 201)" /> - <use xlink:href="#knobguide-centertick" transform="translate(2.5 189)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(14 226)">PAN</text> - <use id="MUTE2_PARAM" xlink:href="#button" transform="translate(12.5 232)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(10 260)">MUTE</text> - <g transform="translate(5.5 267)"> - <rect width="34" height="73" rx="5" fill="#fafafa" /> + <use xlink:href="#sliderguide-db" transform="translate(0 12)" /> + <use id="LEVEL2_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> + <use id="MUTE2_PARAM" xlink:href="#button" transform="translate(12.5 165)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(10 192)">MUTE</text> + <use id="PAN2_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 203)" /> + <use xlink:href="#knobguide-centertick" transform="translate(2.5 191)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(14 228)">PAN</text> + <g transform="translate(5.5 232)"> + <rect width="34" height="108" rx="5" fill="#fafafa" /> <use id="CV2_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">CV</text> - <use id="IN2_INPUT" xlink:href="#input" transform="translate(5 38)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 70)">IN</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(3.5 35)">LEVEL</text> + <use id="PAN2_INPUT" xlink:href="#input" transform="translate(5 38)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 70)">PAN</text> + <use id="IN2_INPUT" xlink:href="#input" transform="translate(5 73)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 105)">IN</text> </g> <!-- <rect width="8" height="40" fill="#f00" transform="translate(39.5 300)" /> --> </g> @@ -173,19 +174,21 @@ <g transform="translate(90 20)"> <!-- <rect width="39" height="344" fill="#ccc" transform="translate(3 0)" /> --> <text font-size="5pt" letter-spacing="2px" transform="translate(13.7 9)">CH3</text> - <use xlink:href="#sliderguide-db" transform="translate(0 10)" /> - <use id="LEVEL3_PARAM" xlink:href="#slider" transform="translate(13.5 10)" /> - <use id="PAN3_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 201)" /> - <use xlink:href="#knobguide-centertick" transform="translate(2.5 189)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(14 226)">PAN</text> - <use id="MUTE3_PARAM" xlink:href="#button" transform="translate(12.5 232)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(10 260)">MUTE</text> - <g transform="translate(5.5 267)"> - <rect width="34" height="73" rx="5" fill="#fafafa" /> + <use xlink:href="#sliderguide-db" transform="translate(0 12)" /> + <use id="LEVEL3_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> + <use id="MUTE3_PARAM" xlink:href="#button" transform="translate(12.5 165)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(10 192)">MUTE</text> + <use id="PAN3_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 203)" /> + <use xlink:href="#knobguide-centertick" transform="translate(2.5 191)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(14 228)">PAN</text> + <g transform="translate(5.5 232)"> + <rect width="34" height="108" rx="5" fill="#fafafa" /> <use id="CV3_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">CV</text> - <use id="IN3_INPUT" xlink:href="#input" transform="translate(5 38)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 70)">IN</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(3.5 35)">LEVEL</text> + <use id="PAN3_INPUT" xlink:href="#input" transform="translate(5 38)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 70)">PAN</text> + <use id="IN3_INPUT" xlink:href="#input" transform="translate(5 73)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 105)">IN</text> </g> <!-- <rect width="8" height="40" fill="#f00" transform="translate(39.5 300)" /> --> </g> @@ -193,19 +196,21 @@ <g transform="translate(133 20)"> <!-- <rect width="39" height="344" fill="#ccc" transform="translate(3 0)" /> --> <text font-size="5pt" letter-spacing="2px" transform="translate(13.7 9)">CH4</text> - <use xlink:href="#sliderguide-db" transform="translate(0 10)" /> - <use id="LEVEL4_PARAM" xlink:href="#slider" transform="translate(13.5 10)" /> - <use id="PAN4_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 201)" /> - <use xlink:href="#knobguide-centertick" transform="translate(2.5 189)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(14 226)">PAN</text> - <use id="MUTE4_PARAM" xlink:href="#button" transform="translate(12.5 232)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(10 260)">MUTE</text> - <g transform="translate(5.5 267)"> - <rect width="34" height="73" rx="5" fill="#fafafa" /> + <use xlink:href="#sliderguide-db" transform="translate(0 12)" /> + <use id="LEVEL4_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> + <use id="MUTE4_PARAM" xlink:href="#button" transform="translate(12.5 165)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(10 192)">MUTE</text> + <use id="PAN4_PARAM" xlink:href="#knob-smallest" transform="translate(14.5 203)" /> + <use xlink:href="#knobguide-centertick" transform="translate(2.5 191)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(14 228)">PAN</text> + <g transform="translate(5.5 232)"> + <rect width="34" height="108" rx="5" fill="#fafafa" /> <use id="CV4_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">CV</text> - <use id="IN4_INPUT" xlink:href="#input" transform="translate(5 38)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 70)">IN</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(3.5 35)">LEVEL</text> + <use id="PAN4_INPUT" xlink:href="#input" transform="translate(5 38)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 70)">PAN</text> + <use id="IN4_INPUT" xlink:href="#input" transform="translate(5 73)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 105)">IN</text> </g> <!-- <rect width="8" height="40" fill="#f00" transform="translate(39.5 300)" /> --> </g> @@ -213,12 +218,12 @@ <g transform="translate(176 20)"> <!-- <rect width="39" height="344" fill="#ccc" transform="translate(3 0)" /> --> <text font-size="5pt" letter-spacing="2px" transform="translate(13.7 9)">MIX</text> - <use xlink:href="#sliderguide-db" transform="translate(0 10)" /> - <use id="MIX_PARAM" xlink:href="#slider" transform="translate(13.5 10)" /> - <g transform="translate(5.5 230)"> + <use xlink:href="#sliderguide-db" transform="translate(0 12)" /> + <use id="MIX_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> + <g transform="translate(5.5 229)"> <rect width="34" height="50" rx="5" fill="#fafafa" /> <use id="MIX_CV_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(11 35)">CV</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(3.5 35)">LEVEL</text> <rect width="34" height="73" rx="5" fill="#bbb" transform="translate(0 38)" /> <rect width="34" height="5" fill="#bbb" transform="translate(0 38)" /> <use id="L_OUTPUT" xlink:href="#output" transform="translate(5 41)" /> @@ -227,4 +232,5 @@ <text font-size="5pt" letter-spacing="2px" transform="translate(15 108)">R</text> </g> </g> + <!-- <polyline points="0,0 225,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 360)" /> --> </svg> diff --git a/res-src/button_18px_1_orange-src.svg b/res-src/button_18px_1_orange-src.svg @@ -0,0 +1,28 @@ +<svg + version="1.1" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + width="18" + height="18" + viewBox="0 0 18 18" +> + <g transform="translate(9 9)"> + <circle r="8.9" fill="#888" /> + <circle r="8.4" fill="#333" /> + + <circle r="8.1" fill="#f90" /> + <circle r="8.1" fill="#666" fill-opacity="0.5" /> + + <circle r="7.8" fill="#f90" /> + <circle r="7.8" fill="#777" fill-opacity="0.5" /> + + <circle r="7.5" fill="#f90" /> + <circle r="7.5" fill="#888" fill-opacity="0.5" /> + + <circle r="7.2" fill="#f90" /> + <circle r="7.2" fill="#999" fill-opacity="0.5" /> + + <circle r="6.9" fill="#f90" /> + <circle r="6.9" fill="#aaa" fill-opacity="0.5" /> + </g> +</svg> diff --git a/res/Mix4.svg b/res/Mix4.svg Binary files differ. diff --git a/res/button_18px_1_orange.svg b/res/button_18px_1_orange.svg Binary files differ. diff --git a/src/Mix4.cpp b/src/Mix4.cpp @@ -7,7 +7,7 @@ void Mix4::onSampleRateChange() { _channel2.setSampleRate(sr); _channel3.setSampleRate(sr); _channel4.setSampleRate(sr); - _slewLimiter.setParams(sr, slewTimeMS); + _slewLimiter.setParams(sr, MixerChannel::slewTimeMS); _rms.setSampleRate(sr); } @@ -22,8 +22,8 @@ void Mix4::step() { if (inputs[MIX_CV_INPUT].active) { level *= clamp(inputs[MIX_CV_INPUT].value / 10.0f, 0.0f, 1.0f); } - level *= maxDecibels - minDecibels; - level += minDecibels; + level *= MixerChannel::maxDecibels - MixerChannel::minDecibels; + level += MixerChannel::minDecibels; _amplifier.setLevel(_slewLimiter.next(level)); float mono = 0.0f; @@ -56,6 +56,13 @@ void Mix4::step() { } } +struct MuteButton : ToggleButton { + MuteButton() { + addFrame(SVG::load(assetPlugin(plugin, "res/button_18px_0.svg"))); + addFrame(SVG::load(assetPlugin(plugin, "res/button_18px_1_orange.svg"))); + } +}; + struct Mix4Widget : ModuleWidget { Mix4Widget(Mix4* module) : ModuleWidget(module) { box.size = Vec(RACK_GRID_WIDTH * 15, RACK_GRID_HEIGHT); @@ -73,110 +80,118 @@ struct Mix4Widget : ModuleWidget { addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365))); // generated by svg_widgets.rb - auto level1ParamPosition = Vec(17.5, 32.5); - auto pan1ParamPosition = Vec(18.5, 221.0); - auto mute1ParamPosition = Vec(17.2, 252.7); - auto level2ParamPosition = Vec(60.5, 32.5); - auto pan2ParamPosition = Vec(61.5, 221.0); - auto mute2ParamPosition = Vec(60.2, 252.7); - auto level3ParamPosition = Vec(103.5, 32.5); - auto pan3ParamPosition = Vec(104.5, 221.0); - auto mute3ParamPosition = Vec(103.2, 252.7); - auto level4ParamPosition = Vec(146.5, 32.5); - auto pan4ParamPosition = Vec(147.5, 221.0); - auto mute4ParamPosition = Vec(146.2, 252.7); - auto mixParamPosition = Vec(189.5, 32.5); - - auto cv1InputPosition = Vec(14.5, 290.0); + auto level1ParamPosition = Vec(17.5, 32.0); + auto mute1ParamPosition = Vec(17.2, 185.7); + auto pan1ParamPosition = Vec(18.5, 223.0); + auto level2ParamPosition = Vec(60.5, 32.0); + auto mute2ParamPosition = Vec(60.2, 185.7); + auto pan2ParamPosition = Vec(61.5, 223.0); + auto level3ParamPosition = Vec(103.5, 32.0); + auto mute3ParamPosition = Vec(103.2, 185.7); + auto pan3ParamPosition = Vec(104.5, 223.0); + auto level4ParamPosition = Vec(146.5, 32.0); + auto mute4ParamPosition = Vec(146.2, 185.7); + auto pan4ParamPosition = Vec(147.5, 223.0); + auto mixParamPosition = Vec(189.5, 32.0); + + auto cv1InputPosition = Vec(14.5, 255.0); + auto pan1InputPosition = Vec(14.5, 290.0); auto in1InputPosition = Vec(14.5, 325.0); - auto cv2InputPosition = Vec(57.5, 290.0); + auto cv2InputPosition = Vec(57.5, 255.0); + auto pan2InputPosition = Vec(57.5, 290.0); auto in2InputPosition = Vec(57.5, 325.0); - auto cv3InputPosition = Vec(100.5, 290.0); + auto cv3InputPosition = Vec(100.5, 255.0); + auto pan3InputPosition = Vec(100.5, 290.0); auto in3InputPosition = Vec(100.5, 325.0); - auto cv4InputPosition = Vec(143.5, 290.0); + auto cv4InputPosition = Vec(143.5, 255.0); + auto pan4InputPosition = Vec(143.5, 290.0); auto in4InputPosition = Vec(143.5, 325.0); - auto mixCvInputPosition = Vec(186.5, 253.0); + auto mixCvInputPosition = Vec(186.5, 252.0); - auto lOutputPosition = Vec(186.5, 291.0); - auto rOutputPosition = Vec(186.5, 326.0); + auto lOutputPosition = Vec(186.5, 290.0); + auto rOutputPosition = Vec(186.5, 325.0); // end generated by svg_widgets.rb { - auto slider = ParamWidget::create<VUSlider>( + auto slider = ParamWidget::create<VUSlider151>( level1ParamPosition, module, Mix4::LEVEL1_PARAM, 0.0, 1.0, - abs(module->minDecibels) / (module->maxDecibels - module->minDecibels) + abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_channel1.rms)); addParam(slider); } addParam(ParamWidget::create<Knob16>(pan1ParamPosition, module, Mix4::PAN1_PARAM, -1.0, 1.0, 0.0)); - addParam(ParamWidget::create<StatefulButton18>(mute1ParamPosition, module, Mix4::MUTE1_PARAM, 0.0, 1.0, 0.0)); + addParam(ParamWidget::create<MuteButton>(mute1ParamPosition, module, Mix4::MUTE1_PARAM, 0.0, 1.0, 0.0)); { - auto slider = ParamWidget::create<VUSlider>( + auto slider = ParamWidget::create<VUSlider151>( level2ParamPosition, module, Mix4::LEVEL2_PARAM, 0.0, 1.0, - abs(module->minDecibels) / (module->maxDecibels - module->minDecibels) + abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_channel2.rms)); addParam(slider); } addParam(ParamWidget::create<Knob16>(pan2ParamPosition, module, Mix4::PAN2_PARAM, -1.0, 1.0, 0.0)); - addParam(ParamWidget::create<StatefulButton18>(mute2ParamPosition, module, Mix4::MUTE2_PARAM, 0.0, 1.0, 0.0)); + addParam(ParamWidget::create<MuteButton>(mute2ParamPosition, module, Mix4::MUTE2_PARAM, 0.0, 1.0, 0.0)); { - auto slider = ParamWidget::create<VUSlider>( + auto slider = ParamWidget::create<VUSlider151>( level3ParamPosition, module, Mix4::LEVEL3_PARAM, 0.0, 1.0, - abs(module->minDecibels) / (module->maxDecibels - module->minDecibels) + abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_channel3.rms)); addParam(slider); } addParam(ParamWidget::create<Knob16>(pan3ParamPosition, module, Mix4::PAN3_PARAM, -1.0, 1.0, 0.0)); - addParam(ParamWidget::create<StatefulButton18>(mute3ParamPosition, module, Mix4::MUTE3_PARAM, 0.0, 1.0, 0.0)); + addParam(ParamWidget::create<MuteButton>(mute3ParamPosition, module, Mix4::MUTE3_PARAM, 0.0, 1.0, 0.0)); { - auto slider = ParamWidget::create<VUSlider>( + auto slider = ParamWidget::create<VUSlider151>( level4ParamPosition, module, Mix4::LEVEL4_PARAM, 0.0, 1.0, - abs(module->minDecibels) / (module->maxDecibels - module->minDecibels) + abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_channel4.rms)); addParam(slider); } addParam(ParamWidget::create<Knob16>(pan4ParamPosition, module, Mix4::PAN4_PARAM, -1.0, 1.0, 0.0)); - addParam(ParamWidget::create<StatefulButton18>(mute4ParamPosition, module, Mix4::MUTE4_PARAM, 0.0, 1.0, 0.0)); + addParam(ParamWidget::create<MuteButton>(mute4ParamPosition, module, Mix4::MUTE4_PARAM, 0.0, 1.0, 0.0)); { - auto slider = ParamWidget::create<VUSlider>( + auto slider = ParamWidget::create<VUSlider151>( mixParamPosition, module, Mix4::MIX_PARAM, 0.0, 1.0, - abs(module->minDecibels) / (module->maxDecibels - module->minDecibels) + abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_rmsLevel)); addParam(slider); } addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, Mix4::CV1_INPUT)); + addInput(Port::create<Port24>(pan1InputPosition, Port::INPUT, module, Mix4::PAN1_INPUT)); addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, Mix4::IN1_INPUT)); addInput(Port::create<Port24>(cv2InputPosition, Port::INPUT, module, Mix4::CV2_INPUT)); + addInput(Port::create<Port24>(pan2InputPosition, Port::INPUT, module, Mix4::PAN2_INPUT)); addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, Mix4::IN2_INPUT)); addInput(Port::create<Port24>(cv3InputPosition, Port::INPUT, module, Mix4::CV3_INPUT)); + addInput(Port::create<Port24>(pan3InputPosition, Port::INPUT, module, Mix4::PAN3_INPUT)); addInput(Port::create<Port24>(in3InputPosition, Port::INPUT, module, Mix4::IN3_INPUT)); addInput(Port::create<Port24>(cv4InputPosition, Port::INPUT, module, Mix4::CV4_INPUT)); + addInput(Port::create<Port24>(pan4InputPosition, Port::INPUT, module, Mix4::PAN4_INPUT)); addInput(Port::create<Port24>(in4InputPosition, Port::INPUT, module, Mix4::IN4_INPUT)); addInput(Port::create<Port24>(mixCvInputPosition, Port::INPUT, module, Mix4::MIX_CV_INPUT)); diff --git a/src/Mix4.hpp b/src/Mix4.hpp @@ -30,12 +30,16 @@ struct Mix4 : Module { enum InputsIds { CV1_INPUT, + PAN1_INPUT, IN1_INPUT, CV2_INPUT, + PAN2_INPUT, IN2_INPUT, CV3_INPUT, + PAN3_INPUT, IN3_INPUT, CV4_INPUT, + PAN4_INPUT, IN4_INPUT, MIX_CV_INPUT, NUM_INPUTS @@ -51,10 +55,6 @@ struct Mix4 : Module { NUM_LIGHTS }; - const float maxDecibels = 12.0f; - const float minDecibels = Amplifier::minDecibels; - const float slewTimeMS = 1.0f; - MixerChannel _channel1; MixerChannel _channel2; MixerChannel _channel3; @@ -66,10 +66,10 @@ struct Mix4 : Module { Mix4() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) - , _channel1(params[LEVEL1_PARAM], params[PAN1_PARAM], params[MUTE1_PARAM], inputs[IN1_INPUT], inputs[CV1_INPUT]) - , _channel2(params[LEVEL2_PARAM], params[PAN2_PARAM], params[MUTE2_PARAM], inputs[IN2_INPUT], inputs[CV2_INPUT]) - , _channel3(params[LEVEL3_PARAM], params[PAN3_PARAM], params[MUTE3_PARAM], inputs[IN3_INPUT], inputs[CV3_INPUT]) - , _channel4(params[LEVEL4_PARAM], params[PAN4_PARAM], params[MUTE4_PARAM], inputs[IN4_INPUT], inputs[CV4_INPUT]) + , _channel1(params[LEVEL1_PARAM], params[PAN1_PARAM], params[MUTE1_PARAM], inputs[IN1_INPUT], inputs[CV1_INPUT], inputs[PAN1_INPUT]) + , _channel2(params[LEVEL2_PARAM], params[PAN2_PARAM], params[MUTE2_PARAM], inputs[IN2_INPUT], inputs[CV2_INPUT], inputs[PAN2_INPUT]) + , _channel3(params[LEVEL3_PARAM], params[PAN3_PARAM], params[MUTE3_PARAM], inputs[IN3_INPUT], inputs[CV3_INPUT], inputs[PAN3_INPUT]) + , _channel4(params[LEVEL4_PARAM], params[PAN4_PARAM], params[MUTE4_PARAM], inputs[IN4_INPUT], inputs[CV4_INPUT], inputs[PAN4_INPUT]) { onSampleRateChange(); _rms.setSensitivity(0.05f); diff --git a/src/mixer.cpp b/src/mixer.cpp @@ -1,6 +1,10 @@ #include "mixer.hpp" +const float MixerChannel::maxDecibels = 6.0f; +const float MixerChannel::minDecibels = Amplifier::minDecibels; +const float MixerChannel::slewTimeMS = 1.0f; + void MixerChannel::setSampleRate(float sampleRate) { _slewLimiter.setParams(sampleRate, slewTimeMS); _rms.setSampleRate(sampleRate); @@ -17,8 +21,8 @@ void MixerChannel::next(bool stereo) { } else { float level = clamp(_levelParam.value, 0.0f, 1.0f); - if (_cvInput.active) { - level *= clamp(_cvInput.value / 10.0f, 0.0f, 1.0f); + if (_levelInput.active) { + level *= clamp(_levelInput.value / 10.0f, 0.0f, 1.0f); } level *= maxDecibels - minDecibels; level += minDecibels; @@ -28,7 +32,11 @@ void MixerChannel::next(bool stereo) { out = _amplifier.next(_inInput.value); rms = _rms.next(out) / 5.0f; if (stereo) { - _panner.setPan(clamp(_panParam.value, -1.0f, 1.0f)); + float pan = clamp(_panParam.value, -1.0f, 1.0f); + if (_panInput.active) { + pan *= clamp(_panInput.value / 5.0f, -1.0f, 1.0f); + } + _panner.setPan(pan); _panner.next(out, left, right); } } diff --git a/src/mixer.hpp b/src/mixer.hpp @@ -8,9 +8,9 @@ using namespace bogaudio::dsp; namespace bogaudio { struct MixerChannel { - const float maxDecibels = 12.0f; - const float minDecibels = Amplifier::minDecibels; - const float slewTimeMS = 1.0f; + static const float maxDecibels; + static const float minDecibels; + static const float slewTimeMS; Amplifier _amplifier; Panner _panner; @@ -21,7 +21,8 @@ struct MixerChannel { Param& _panParam; Param& _muteParam; Input& _inInput; - Input& _cvInput; + Input& _levelInput; + Input& _panInput; float out = 0.0f; float left = 0.0f; @@ -33,14 +34,16 @@ struct MixerChannel { Param& pan, Param& mute, Input& in, - Input& cv, + Input& levelCv, + Input& panCv, float sampleRate = 1000.0f ) : _levelParam(level) , _panParam(pan) , _muteParam(mute) , _inInput(in) - , _cvInput(cv) + , _levelInput(levelCv) + , _panInput(panCv) { setSampleRate(sampleRate); _rms.setSensitivity(0.05f); diff --git a/src/widgets.cpp b/src/widgets.cpp @@ -115,6 +115,12 @@ StatefulButton18::StatefulButton18() : StatefulButton("res/button_18px_0.svg", " } +ToggleButton18::ToggleButton18() { + addFrame(SVG::load(assetPlugin(plugin, "res/button_18px_0.svg"))); + addFrame(SVG::load(assetPlugin(plugin, "res/button_18px_1.svg"))); +} + + NVGcolor bogaudio::decibelsToColor(float db) { if (db < -80.0f) { return nvgRGBA(0x00, 0x00, 0x00, 0x00); @@ -133,7 +139,7 @@ void VUSlider::draw(NVGcontext* vg) { nvgSave(vg); { nvgBeginPath(vg); - nvgRoundedRect(vg, 6, 3, 6, 177, 2); + nvgRoundedRect(vg, 6, 3, 6, box.size.y - 6, 2); nvgFillColor(vg, nvgRGBA(0x22, 0x22, 0x22, 0xff)); nvgFill(vg); nvgStrokeColor(vg, nvgRGBA(0x88, 0x88, 0x88, 0xff)); @@ -143,7 +149,7 @@ void VUSlider::draw(NVGcontext* vg) { nvgSave(vg); { - nvgTranslate(vg, 0, 170.0f * (1.0f - value)); + nvgTranslate(vg, 0, (box.size.y - 13.0f) * (1.0f - value)); nvgBeginPath(vg); nvgRoundedRect(vg, 0, 0, 18, 13, 1.5); nvgFillColor(vg, nvgRGBA(0x77, 0x77, 0x77, 0xff)); diff --git a/src/widgets.hpp b/src/widgets.hpp @@ -66,14 +66,21 @@ struct StatefulButton18 : StatefulButton { StatefulButton18(); }; +struct ToggleButton : SVGSwitch, ToggleSwitch { +}; + +struct ToggleButton18 : ToggleButton { + ToggleButton18(); +}; + NVGcolor decibelsToColor(float db); struct VUSlider : Knob { const float slideHeight = 13.0f; float* _vuLevel = NULL; - VUSlider() { - box.size = Vec(18.0f, 183.0f); + VUSlider(float height = 183.0f) { + box.size = Vec(18.0f, height); } void setVULevel(float* vuLevel) { @@ -82,4 +89,8 @@ struct VUSlider : Knob { virtual void draw(NVGcontext* vg) override; }; +struct VUSlider151 : VUSlider { + VUSlider151() : VUSlider(151.0f) {} +}; + } // namespace bogaudio