BogaudioModules

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

commit 4db015af00269ebc9961f18c3b0ab7946134efe9
parent 408973946167b5c8d8a61ef1a184afb2fd5cefd7
Author: Matt Demanett <matt@demanett.net>
Date:   Wed, 11 Sep 2019 00:10:15 -0400

Poly: DETUNE and STACK.

Diffstat:
Msrc/Detune.cpp | 54++++++++++++++++++++++++++++++------------------------
Msrc/Detune.hpp | 19++++++++++++++-----
Msrc/Stack.cpp | 50+++++++++++++++++++++++++++++---------------------
Msrc/Stack.hpp | 21++++++++++++++++-----
4 files changed, 89 insertions(+), 55 deletions(-)

diff --git a/src/Detune.cpp b/src/Detune.cpp @@ -1,40 +1,46 @@ #include "Detune.hpp" -void Detune::processChannel(const ProcessArgs& args, int _c) { - if (!(outputs[OUT_PLUS_OUTPUT].isConnected() || outputs[OUT_MINUS_OUTPUT].isConnected() || outputs[THRU_OUTPUT].isConnected())) { - return; - } +bool Detune::active() { + return outputs[OUT_PLUS_OUTPUT].isConnected() || outputs[OUT_MINUS_OUTPUT].isConnected() || outputs[THRU_OUTPUT].isConnected(); +} + +int Detune::channels() { + return inputs[IN_INPUT].getChannels(); +} - float cents = params[CENTS_PARAM].getValue(); +void Detune::modulateChannel(int c) { + _cents[c] = params[CENTS_PARAM].getValue(); if (inputs[CV_INPUT].isConnected()) { - cents *= clamp(inputs[CV_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f); - cents = roundf(cents); + _cents[c] *= clamp(inputs[CV_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); + _cents[c] = roundf(_cents[c]); } - cents /= 100.0f; + _cents[c] /= 100.0f;; +} - float inCV = 0.0f; - if (inputs[IN_INPUT].isConnected()) { - inCV = inputs[IN_INPUT].getVoltage(); - } +void Detune::processChannel(const ProcessArgs& args, int c) { + float inCV = inputs[IN_INPUT].getVoltage(c); - if (_cents != cents || _inCV != inCV) { - _cents = cents; - _inCV = inCV; - if (_cents < 0.001f) { - _plusCV = _inCV; - _minusCV = _inCV; + if (_cents[c] != _lastCents[c] || inCV != _lastInCV[c]) { + _lastCents[c] = _cents[c]; + _lastInCV[c] = inCV; + if (_cents[c] < 0.001f) { + _plusCV[c] = inCV; + _minusCV[c] = inCV; } else { - float semitone = cvToSemitone(_inCV); - _plusCV = semitoneToCV(semitone + cents); - _minusCV = semitoneToCV(semitone - cents); + float semitone = cvToSemitone(inCV); + _plusCV[c] = semitoneToCV(semitone + _cents[c]); + _minusCV[c] = semitoneToCV(semitone - _cents[c]); } } - outputs[THRU_OUTPUT].setVoltage(_inCV); - outputs[OUT_PLUS_OUTPUT].setVoltage(_plusCV); - outputs[OUT_MINUS_OUTPUT].setVoltage(_minusCV); + outputs[THRU_OUTPUT].setChannels(_channels); + outputs[THRU_OUTPUT].setVoltage(inCV, c); + outputs[OUT_PLUS_OUTPUT].setChannels(_channels); + outputs[OUT_PLUS_OUTPUT].setVoltage(_plusCV[c], c); + outputs[OUT_MINUS_OUTPUT].setChannels(_channels); + outputs[OUT_MINUS_OUTPUT].setVoltage(_minusCV[c], c); } struct DetuneWidget : ModuleWidget { diff --git a/src/Detune.hpp b/src/Detune.hpp @@ -32,17 +32,26 @@ struct Detune : BGModule { NUM_LIGHTS }; - float _cents = -1.0f; - float _inCV = -1000.0f; - float _plusCV; - float _minusCV; + float _cents[maxChannels] {}; + float _lastCents[maxChannels]; + float _lastInCV[maxChannels]; + float _plusCV[maxChannels] {}; + float _minusCV[maxChannels] {}; Detune() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(CENTS_PARAM, 0.0f, 50.0f, 0.0f, "Cents"); + + for (int i = 0; i < maxChannels; ++i) { + _lastCents[i] = -1.0f; + _lastInCV[i] = -1000.0f; + } } - void processChannel(const ProcessArgs& args, int _c) override; + bool active() override; + int channels() override; + void modulateChannel(int c) override; + void processChannel(const ProcessArgs& args, int c) override; }; } // namespace bogaudio diff --git a/src/Stack.cpp b/src/Stack.cpp @@ -1,42 +1,50 @@ #include "Stack.hpp" -void Stack::processChannel(const ProcessArgs& args, int _c) { +bool Stack::active() { + return outputs[OUT_OUTPUT].isConnected() || outputs[THRU_OUTPUT].isConnected(); +} + +int Stack::channels() { + return std::max(1, inputs[IN_INPUT].getChannels()); +} + +void Stack::always(const ProcessArgs& args) { lights[QUANTIZE_LIGHT].value = params[QUANTIZE_PARAM].getValue() > 0.5f; - if (!(outputs[OUT_OUTPUT].isConnected() || outputs[THRU_OUTPUT].isConnected())) { - return; - } +} - float semitones = roundf(params[OCTAVE_PARAM].getValue()) * 12.0f; - semitones += roundf(params[SEMIS_PARAM].getValue()); +void Stack::modulateChannel(int c) { + _semitones[c] = roundf(params[OCTAVE_PARAM].getValue()) * 12.0f; + _semitones[c] += roundf(params[SEMIS_PARAM].getValue()); if (inputs[CV_INPUT].isConnected()) { - semitones += clamp(inputs[CV_INPUT].getVoltage(), -5.0f, 5.0f) * 10.0f; + _semitones[c] += clamp(inputs[CV_INPUT].getPolyVoltage(c), -5.0f, 5.0f) * 10.0f; } if (params[QUANTIZE_PARAM].getValue() > 0.5f) { - semitones = roundf(semitones); - } - - float inCV = 0.0f; - if (inputs[IN_INPUT].isConnected()) { - inCV = clamp(inputs[IN_INPUT].getVoltage(), _minCVOut, _maxCVOut); + _semitones[c] = roundf(_semitones[c]); } +} +void Stack::processChannel(const ProcessArgs& args, int c) { + float inCV = clamp(inputs[IN_INPUT].getVoltage(c), _minCVOut, _maxCVOut); float fine = params[FINE_PARAM].getValue(); - if (_semitones != semitones || _inCV != inCV || _fine != fine) { - _semitones = semitones; - _inCV = inCV; - _fine = fine; - _outCV = clamp(semitoneToCV((_inCV != 0.0f ? cvToSemitone(_inCV) : referenceSemitone) + _semitones + _fine), _minCVOut, _maxCVOut); + if (_semitones[c] != _lastSemitones[c] || inCV != _lastInCV[c] || fine != _lastFine[c]) { + _lastSemitones[c] = _semitones[c]; + _lastInCV[c] = inCV; + _lastFine[c] = fine; + _outCV[c] = clamp(semitoneToCV((inCV != 0.0f ? cvToSemitone(inCV) : referenceSemitone) + _semitones[c] + fine), _minCVOut, _maxCVOut); } if (inputs[IN_INPUT].isConnected()) { - outputs[THRU_OUTPUT].setVoltage(_inCV); + outputs[THRU_OUTPUT].setChannels(_channels); + outputs[THRU_OUTPUT].setVoltage(inCV, c); } else { - outputs[THRU_OUTPUT].setVoltage(_semitones / 10.0); + assert(c == 0); + outputs[THRU_OUTPUT].setVoltage(_semitones[c] / 10.0); } - outputs[OUT_OUTPUT].setVoltage(_outCV); + outputs[OUT_OUTPUT].setChannels(_channels); + outputs[OUT_OUTPUT].setVoltage(_outCV[c], c); } struct StackWidget : ModuleWidget { diff --git a/src/Stack.hpp b/src/Stack.hpp @@ -38,10 +38,11 @@ struct Stack : BGModule { const float _minCVOut = semitoneToCV(24.0); // C1 const float _maxCVOut = semitoneToCV(120.0); // C9 - float _semitones = -1000.0f; - float _inCV = -1000.0f; - float _fine = -1000.0f; - float _outCV; + float _semitones[maxChannels] {}; + float _lastSemitones[maxChannels]; + float _lastInCV[maxChannels]; + float _lastFine[maxChannels]; + float _outCV[maxChannels] {}; Stack() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); @@ -49,9 +50,19 @@ struct Stack : BGModule { configParam(OCTAVE_PARAM, -3.0f, 3.0f, 0.0f, "Octaves"); configParam(FINE_PARAM, -0.99f, 0.99f, 0.0f, "Fine tune", " cents", 0.0f, 100.0f); configParam(QUANTIZE_PARAM, 0.0f, 1.0f, 1.0f, "Quantize"); + + for (int i = 0; i < maxChannels; ++i) { + _lastSemitones[i] = -1000.0f; + _lastInCV[i] = -1000.0f; + _lastFine[i] = -1000.0f; + } } - void processChannel(const ProcessArgs& args, int _c) override; + bool active() override; + int channels() override; + void modulateChannel(int c) override; + void always(const ProcessArgs& args) override; + void processChannel(const ProcessArgs& args, int c) override; }; } // namespace bogaudio