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:
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