BogaudioModules

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

commit 79c59e6e71b59dcbb91d56f2af383f87c943f525
parent 1ab16d5d4517dfc9adfd5d92f6dd8ac8ff197171
Author: Matt Demanett <matt@demanett.net>
Date:   Mon,  9 Sep 2019 23:58:06 -0400

Poly: BOOL and SUMS.

Diffstat:
Msrc/Bool.cpp | 27+++++++++++++++++++--------
Msrc/Bool.hpp | 4++--
Msrc/FlipFlop.hpp | 1-
Msrc/Sums.cpp | 43++++++++++++++++++++++++-------------------
Msrc/Sums.hpp | 2+-
5 files changed, 46 insertions(+), 31 deletions(-)

diff --git a/src/Bool.cpp b/src/Bool.cpp @@ -1,14 +1,25 @@ #include "Bool.hpp" -void Bool::processChannel(const ProcessArgs& args, int _c) { - bool a = inputs[A_INPUT].getVoltage() > 1.0f; - bool b = inputs[B_INPUT].getVoltage() > 1.0f; - outputs[AND_OUTPUT].setVoltage(a && b ? 5.0f : 0.0f); - outputs[OR_OUTPUT].setVoltage(a || b ? 5.0f : 0.0f); - outputs[XOR_OUTPUT].setVoltage(a ^ b ? 5.0f : 0.0f); - - outputs[NOT_OUTPUT].setVoltage((inputs[NOT_INPUT].isConnected() && inputs[NOT_INPUT].getVoltage() > 1.0f) ? 0.0f : 5.0f); +void Bool::processChannel(const ProcessArgs& args, int c) { + assert(c == 0); + + for (int i = 0, cn = std::max(inputs[A_INPUT].getChannels(), inputs[B_INPUT].getChannels()); i < cn; ++i) { + bool a = inputs[A_INPUT].getPolyVoltage(i) > 1.0f; + bool b = inputs[B_INPUT].getPolyVoltage(i) > 1.0f; + outputs[AND_OUTPUT].setChannels(cn); + outputs[AND_OUTPUT].setVoltage(5.0f * (a && b), i); + outputs[OR_OUTPUT].setChannels(cn); + outputs[OR_OUTPUT].setVoltage(5.0f * (a || b), i); + outputs[XOR_OUTPUT].setChannels(cn); + outputs[XOR_OUTPUT].setVoltage(5.0f * (a ^ b), i); + } + + int cn = inputs[NOT_INPUT].getChannels(); + outputs[NOT_OUTPUT].setChannels(cn); + for (int i = 0; i < cn; ++i) { + outputs[NOT_OUTPUT].setVoltage(5.0f * (inputs[NOT_INPUT].isConnected() && inputs[NOT_INPUT].getPolyVoltage(i) > 1.0f), i); + } } struct BoolWidget : ModuleWidget { diff --git a/src/Bool.hpp b/src/Bool.hpp @@ -32,9 +32,9 @@ struct Bool : BGModule { Bool() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - } + } - void processChannel(const ProcessArgs& args, int _c) override; + void processChannel(const ProcessArgs& args, int c) override; }; } // namespace bogaudio diff --git a/src/FlipFlop.hpp b/src/FlipFlop.hpp @@ -47,7 +47,6 @@ struct FlipFlop : BGModule { } void reset() override; - int channels() override { return 1; } void processChannel(const ProcessArgs& args, int c) override; void channelStep( int c, diff --git a/src/Sums.cpp b/src/Sums.cpp @@ -1,33 +1,38 @@ #include "Sums.hpp" -void Sums::processChannel(const ProcessArgs& args, int _c) { - float a = inputs[A_INPUT].getVoltageSum(); - float b = inputs[B_INPUT].getVoltageSum(); - if (_disableOutputLimit) { - outputs[SUM_OUTPUT].setVoltage(a + b); - outputs[DIFFERENCE_OUTPUT].setVoltage(a - b); - outputs[MAX_OUTPUT].setVoltage(std::max(a, b)); - outputs[MIN_OUTPUT].setVoltage(std::min(a, b)); +void Sums::processChannel(const ProcessArgs& args, int c) { + assert(c == 0); - if (inputs[NEGATE_INPUT].isConnected()) { - outputs[NEGATE_OUTPUT].setVoltage(-inputs[NEGATE_INPUT].getVoltage()); + for (int i = 0, cn = std::max(inputs[A_INPUT].getChannels(), inputs[B_INPUT].getChannels()); i < cn; ++i) { + float a = inputs[A_INPUT].getPolyVoltage(i); + float b = inputs[B_INPUT].getPolyVoltage(i); + outputs[SUM_OUTPUT].setChannels(cn); + outputs[DIFFERENCE_OUTPUT].setChannels(cn); + outputs[MAX_OUTPUT].setChannels(cn); + outputs[MIN_OUTPUT].setChannels(cn); + if (_disableOutputLimit) { + outputs[SUM_OUTPUT].setVoltage(a + b, i); + outputs[DIFFERENCE_OUTPUT].setVoltage(a - b, i); + outputs[MAX_OUTPUT].setVoltage(std::max(a, b), i); + outputs[MIN_OUTPUT].setVoltage(std::min(a, b), i); } else { - outputs[NEGATE_OUTPUT].setVoltage(0.0f); + outputs[SUM_OUTPUT].setVoltage(clamp(a + b, -12.0f, 12.0f), i); + outputs[DIFFERENCE_OUTPUT].setVoltage(clamp(a - b, -12.0f, 12.0f), i); + outputs[MAX_OUTPUT].setVoltage(clamp(std::max(a, b), -12.0f, 12.0f), i); + outputs[MIN_OUTPUT].setVoltage(clamp(std::min(a, b), -12.0f, 12.0f), i); } } - else { - outputs[SUM_OUTPUT].setVoltage(clamp(a + b, -12.0f, 12.0f)); - outputs[DIFFERENCE_OUTPUT].setVoltage(clamp(a - b, -12.0f, 12.0f)); - outputs[MAX_OUTPUT].setVoltage(clamp(std::max(a, b), -12.0f, 12.0f)); - outputs[MIN_OUTPUT].setVoltage(clamp(std::min(a, b), -12.0f, 12.0f)); - if (inputs[NEGATE_INPUT].isConnected()) { - outputs[NEGATE_OUTPUT].setVoltage(clamp(-inputs[NEGATE_INPUT].getVoltage(), -12.0f, 12.0f)); + int cn = inputs[NEGATE_INPUT].getChannels(); + outputs[NEGATE_OUTPUT].setChannels(cn); + for (int i = 0; i < cn; ++i) { + if (_disableOutputLimit) { + outputs[NEGATE_OUTPUT].setVoltage(-inputs[NEGATE_INPUT].getPolyVoltage(i), i); } else { - outputs[NEGATE_OUTPUT].setVoltage(0.0f); + outputs[NEGATE_OUTPUT].setVoltage(clamp(-inputs[NEGATE_INPUT].getPolyVoltage(i), -12.0f, 12.0f), i); } } } diff --git a/src/Sums.hpp b/src/Sums.hpp @@ -36,7 +36,7 @@ struct Sums : DisableOutputLimitModule { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); } - void processChannel(const ProcessArgs& args, int _c) override; + void processChannel(const ProcessArgs& args, int c) override; }; } // namespace bogaudio