BogaudioModules

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

commit 53c371c9c9a7c9b0924f0ac66819994315f6791c
parent 593d6f984f9658a35a00c2ebb2ac3563dc984719
Author: Matt Demanett <matt@demanett.net>
Date:   Tue, 24 Dec 2019 14:03:27 -0600

POLYMULT: mono-to-poly signal mult.

Diffstat:
Mplugin.json | 27++++++++++++++++++---------
Ares-src/PolyMult-src.svg | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares/PolyMult.svg | 0
Asrc/PolyMult.cpp | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PolyMult.hpp | 37+++++++++++++++++++++++++++++++++++++
Msrc/bogaudio.cpp | 2++
6 files changed, 250 insertions(+), 9 deletions(-)

diff --git a/plugin.json b/plugin.json @@ -505,6 +505,15 @@ ] }, { + "slug": "Bogaudio-Arp", + "name": "ARP", + "description": "Poly-input arpeggiator", + "tags": [ + "Arpeggiator", + "Polyphonic" + ] + }, + { "slug": "Bogaudio-Assign", "name": "ASSIGN", "description": "Poly voice (re)assigner", @@ -523,6 +532,15 @@ ] }, { + "slug": "Bogaudio-PolyMult", + "name": "POLYMULT", + "description": "Mono-to-poly multiple", + "tags": [ + "Utility", + "Polyphonic" + ] + }, + { "slug": "Bogaudio-Bool", "name": "BOOL", "description": "Boolean logic utility", @@ -627,15 +645,6 @@ "tags": [ "Blank" ] - }, - { - "slug": "Bogaudio-Arp", - "name": "ARP", - "description": "Poly-input arpeggiator", - "tags": [ - "Arpeggiator", - "Polyphonic" - ] } ] } diff --git a/res-src/PolyMult-src.svg b/res-src/PolyMult-src.svg @@ -0,0 +1,123 @@ +<svg + version="1.1" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + width="45" + height="380" + viewBox="0 0 45 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-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-channels" viewBox="0 0 40px 40px"> + <g transform="translate(20 20)"> + <text font-size="5pt" transform="rotate(-240) translate(13 0) rotate(240) translate(-2 2)">1</text> + <text font-size="5pt" transform="rotate(-200) translate(13 0) rotate(200) translate(-2 2)">3</text> + <text font-size="5pt" transform="rotate(-160) translate(13 0) rotate(160) translate(-2 2)">5</text> + <text font-size="5pt" transform="rotate(-120) translate(13 0) rotate(120) translate(-2 2)">7</text> + <text font-size="5pt" transform="rotate(-80) translate(13 0) rotate(80) translate(-2 2)">9</text> + <text font-size="5pt" transform="rotate(-40) translate(13 0) rotate(40) translate(-2 2)">11</text> + <text font-size="5pt" transform="rotate(0) translate(13 0) rotate(0) translate(-2.1 2.3)">13</text> + <text font-size="5pt" transform="rotate(40) translate(13 0) rotate(-40) translate(-1.8 3)">15</text> + + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-240) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-220) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-200) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-180) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-160) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-140) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-120) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-100) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-80) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-60) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-40) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-20) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(0) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(20) translate(10 0)" /> + <!-- <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(40) translate(12 0)" /> --> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(60) translate(10 0)" /> + </g> + </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 44,1 44,379 1,379 1,1" stroke="#e4e4e4" stroke-width="0.5" fill="none" /> + <polyline points="0.5,0.5 44.5,0.5 44.5,379.5 0.5,379.5 0.5,0.5" stroke="#ebebeb" stroke-width="0.8" fill="none" /> + <polyline points="0,0 45,0 45,380 0,380 0,0" stroke="#f2f2f2" stroke-width="1" fill="none" /> + + <!-- <polyline points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(22.5 0)" /> --> + + <g transform="rotate(-90) translate(-376 13)"> + <text class="title" font-size="7pt" letter-spacing="2px">POLYMULT</text> + <g transform="translate(0 12)"> + <text class="brand" font-size="7pt" letter-spacing="2px">BGA</text> + <rect width="3.0" height="3" fill="#ddd" transform="translate(11.5 -5)" /> + </g> + </g> + + <g transform="translate(2.5 30)"> + <text font-size="6pt" letter-spacing="1.5px" transform="translate(6.5 0)">CHAN</text> + <use id="CHANNELS_PARAM" xlink:href="#knob-smallest" transform="translate(12 12)" /> + <use xlink:href="#knobguide-channels" transform="translate(0 0)" /> + </g> + + <g transform="translate(0 70)"> + <g transform="translate(5.5 0)"> + <rect width="34" height="74" rx="5" fill="#fafafa" /> + <rect width="34" height="10" fill="#fafafa" transform="translate(0 64)" /> + <use id="CHANNELS_INPUT" xlink:href="#input" transform="translate(5 3)" /> + <text font-size="5pt" letter-spacing="1px" transform="translate(6 35)">CHAN</text> + <use id="IN_INPUT" xlink:href="#input" transform="translate(5 39)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 71)">IN</text> + </g> + <g transform="translate(5.5 77)"> + <rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" /> + <rect width="34" height="140" rx="5" fill="#bbb" /> + <use id="OUT1_OUTPUT" xlink:href="#output" transform="translate(5 0)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.3 32)">OUT</text> + <use id="OUT2_OUTPUT" xlink:href="#output" transform="translate(5 35)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.3 67)">OUT</text> + <use id="OUT3_OUTPUT" xlink:href="#output" transform="translate(5 70)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.3 102)">OUT</text> + <use id="OUT4_OUTPUT" xlink:href="#output" transform="translate(5 105)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.3 137)">OUT</text> + </g> + </g> + +</svg> diff --git a/res/PolyMult.svg b/res/PolyMult.svg Binary files differ. diff --git a/src/PolyMult.cpp b/src/PolyMult.cpp @@ -0,0 +1,70 @@ + +#include "PolyMult.hpp" + +void PolyMult::processChannel(const ProcessArgs& args, int c) { + assert(c == 0); + + int cn = clamp(params[CHANNELS_PARAM].getValue(), 1.0f, 16.0f); + if (inputs[CHANNELS_INPUT].isConnected()) { + cn = inputs[CHANNELS_INPUT].getChannels(); + } + + float out = inputs[IN_INPUT].getVoltageSum(); + outputs[OUT1_OUTPUT].setChannels(cn); + outputs[OUT2_OUTPUT].setChannels(cn); + outputs[OUT3_OUTPUT].setChannels(cn); + outputs[OUT4_OUTPUT].setChannels(cn); + for (int c = 0; c < cn; ++c) { + outputs[OUT1_OUTPUT].setVoltage(out, c); + outputs[OUT2_OUTPUT].setVoltage(out, c); + outputs[OUT3_OUTPUT].setVoltage(out, c); + outputs[OUT4_OUTPUT].setVoltage(out, c); + } +} + +struct PolyMultWidget : ModuleWidget { + static constexpr int hp = 3; + + PolyMultWidget(PolyMult* module) { + setModule(module); + box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); + + { + SvgPanel *panel = new SvgPanel(); + panel->box.size = box.size; + panel->setBackground(APP->window->loadSvg(asset::plugin(pluginInstance, "res/PolyMult.svg"))); + addChild(panel); + } + + addChild(createWidget<ScrewSilver>(Vec(0, 0))); + addChild(createWidget<ScrewSilver>(Vec(box.size.x - 15, 365))); + + // generated by svg_widgets.rb + auto channelsParamPosition = Vec(14.5, 42.0); + + auto channelsInputPosition = Vec(10.5, 73.0); + auto inInputPosition = Vec(10.5, 109.0); + + auto out1OutputPosition = Vec(10.5, 147.0); + auto out2OutputPosition = Vec(10.5, 182.0); + auto out3OutputPosition = Vec(10.5, 217.0); + auto out4OutputPosition = Vec(10.5, 252.0); + // end generated by svg_widgets.rb + + { + auto w = createParam<Knob16>(channelsParamPosition, module, PolyMult::CHANNELS_PARAM); + dynamic_cast<Knob*>(w)->snap = true; + addParam(w); + } + + addInput(createInput<Port24>(channelsInputPosition, module, PolyMult::CHANNELS_INPUT)); + addInput(createInput<Port24>(inInputPosition, module, PolyMult::IN_INPUT)); + + addOutput(createOutput<Port24>(out1OutputPosition, module, PolyMult::OUT1_OUTPUT)); + addOutput(createOutput<Port24>(out2OutputPosition, module, PolyMult::OUT2_OUTPUT)); + addOutput(createOutput<Port24>(out3OutputPosition, module, PolyMult::OUT3_OUTPUT)); + addOutput(createOutput<Port24>(out4OutputPosition, module, PolyMult::OUT4_OUTPUT)); + } +}; + +Model* modelPolyMult = createModel<PolyMult, PolyMultWidget>("Bogaudio-PolyMult", "POLYMULT", "Mono-to-poly multiple", "Utility", "Polyphonic"); diff --git a/src/PolyMult.hpp b/src/PolyMult.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "bogaudio.hpp" + +extern Model* modelPolyMult; + +namespace bogaudio { + +struct PolyMult : BGModule { + enum ParamsIds { + CHANNELS_PARAM, + NUM_PARAMS + }; + + enum InputsIds { + CHANNELS_INPUT, + IN_INPUT, + NUM_INPUTS + }; + + enum OutputsIds { + OUT1_OUTPUT, + OUT2_OUTPUT, + OUT3_OUTPUT, + OUT4_OUTPUT, + NUM_OUTPUTS + }; + + PolyMult() { + config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); + configParam(CHANNELS_PARAM, 1.0f, 16.0f, 1.0f, "Poly channels"); + } + + void processChannel(const ProcessArgs& args, int c) override; +}; + +} // namespace bogaudio diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp @@ -47,6 +47,7 @@ #include "Offset.hpp" #include "OneEight.hpp" #include "Pan.hpp" +#include "PolyMult.hpp" #include "Pressor.hpp" #include "Reftone.hpp" #include "SampleHold.hpp" @@ -149,6 +150,7 @@ void init(rack::Plugin *p) { p->addModel(modelArp); p->addModel(modelAssign); p->addModel(modelUnison); + p->addModel(modelPolyMult); p->addModel(modelBool); p->addModel(modelCmp);