commit 4db015af00269ebc9961f18c3b0ab7946134efe9
parent 408973946167b5c8d8a61ef1a184afb2fd5cefd7
Author: Matt Demanett <matt@demanett.net>
Date: Wed, 11 Sep 2019 00:10:15 -0400
Poly: DETUNE and STACK.
Diffstat:
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