commit a9d251c296fba9a91a3c8ac19d76c409478e7b39
parent a0b6c688b9596a60db145d07839277eb00a363df
Author: Matt Demanett <matt@demanett.net>
Date: Mon, 9 Dec 2019 23:13:28 -0500
Fix a bunch of poly problems: make minimum channels 1 in module base class, adjust subclasses accordingly.
Diffstat:
25 files changed, 53 insertions(+), 25 deletions(-)
diff --git a/src/AD.cpp b/src/AD.cpp
@@ -47,7 +47,7 @@ bool AD::active() {
}
int AD::channels() {
- return std::max(1, inputs[TRIGGER_INPUT].getChannels());
+ return inputs[TRIGGER_INPUT].getChannels();
}
void AD::addChannel(int c) {
diff --git a/src/AMRM.cpp b/src/AMRM.cpp
@@ -1,12 +1,27 @@
#include "AMRM.hpp"
+#define POLY_INPUT "poly_input"
+
+json_t* AMRM::dataToJson() {
+ json_t* root = json_object();
+ json_object_set_new(root, POLY_INPUT, json_integer(_polyInputID));
+ return root;
+}
+
+void AMRM::dataFromJson(json_t* root) {
+ json_t* p = json_object_get(root, POLY_INPUT);
+ if (p) {
+ _polyInputID = json_integer_value(p);
+ }
+}
+
bool AMRM::active() {
return outputs[OUT_OUTPUT].isConnected() || outputs[RECTIFY_OUTPUT].isConnected();
}
int AMRM::channels() {
- return inputs[CARRIER_INPUT].getChannels();
+ return _polyInputID == MODULATOR_INPUT ? inputs[MODULATOR_INPUT].getChannels() : inputs[CARRIER_INPUT].getChannels();
}
void AMRM::processChannel(const ProcessArgs& args, int c) {
@@ -78,6 +93,16 @@ struct AMRMWidget : ModuleWidget {
addOutput(createOutput<Port24>(rectifyOutputPosition, module, AMRM::RECTIFY_OUTPUT));
addOutput(createOutput<Port24>(outOutputPosition, module, AMRM::OUT_OUTPUT));
}
+
+ void appendContextMenu(Menu* menu) override {
+ AMRM* m = dynamic_cast<AMRM*>(module);
+ assert(m);
+ menu->addChild(new MenuLabel());
+ OptionsMenuItem* p = new OptionsMenuItem("Polyphony channels from");
+ p->addItem(OptionMenuItem("CAR input", [m]() { return m->_polyInputID == AMRM::CARRIER_INPUT; }, [m]() { m->_polyInputID = AMRM::CARRIER_INPUT; }));
+ p->addItem(OptionMenuItem("MOD input", [m]() { return m->_polyInputID == AMRM::MODULATOR_INPUT; }, [m]() { m->_polyInputID = AMRM::MODULATOR_INPUT; }));
+ OptionsMenuItem::addToMenu(p, menu);
+ }
};
Model* modelAMRM = bogaudio::createModel<AMRM, AMRMWidget>("Bogaudio-AMRM", "AM/RM", "Variable ring/amplitude modulator and rectifier", "Ring modulator", "Effect", "Polyphonic");
diff --git a/src/AMRM.hpp b/src/AMRM.hpp
@@ -31,6 +31,7 @@ struct AMRM : BGModule {
};
Saturator _saturator;
+ int _polyInputID = CARRIER_INPUT;
AMRM() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
@@ -38,6 +39,8 @@ struct AMRM : BGModule {
configParam(DRYWET_PARAM, 0.0f, 1.0f, 1.0f, "Wet mix", "%", 0.0f, 100.0f);
}
+ json_t* dataToJson() override;
+ void dataFromJson(json_t* root) override;
bool active() override;
int channels() override;
void processChannel(const ProcessArgs& args, int c) override;
diff --git a/src/ASR.cpp b/src/ASR.cpp
@@ -47,7 +47,7 @@ bool ASR::active() {
}
int ASR::channels() {
- return std::max(1, inputs[TRIGGER_INPUT].getChannels());
+ return inputs[TRIGGER_INPUT].getChannels();
}
void ASR::addChannel(int c) {
diff --git a/src/Additator.cpp b/src/Additator.cpp
@@ -37,7 +37,7 @@ bool Additator::active() {
}
int Additator::channels() {
- return std::max(1, inputs[PITCH_INPUT].getChannels());
+ return inputs[PITCH_INPUT].getChannels();
}
void Additator::addChannel(int c) {
diff --git a/src/Bool.cpp b/src/Bool.cpp
@@ -4,7 +4,7 @@
void Bool::processChannel(const ProcessArgs& args, int c) {
assert(c == 0);
- for (int i = 0, cn = inputs[A_INPUT].getChannels(); i < cn; ++i) {
+ for (int i = 0, cn = std::max(1, inputs[A_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);
@@ -15,7 +15,7 @@ void Bool::processChannel(const ProcessArgs& args, int c) {
outputs[XOR_OUTPUT].setVoltage(5.0f * (a ^ b), i);
}
- int cn = inputs[NOT_INPUT].getChannels();
+ int cn = std::max(1, 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);
diff --git a/src/Cmp.cpp b/src/Cmp.cpp
@@ -18,7 +18,7 @@ bool Cmp::active() {
}
int Cmp::channels() {
- return std::max(1, inputs[A_INPUT].getChannels());
+ return inputs[A_INPUT].getChannels();
}
void Cmp::modulate() {
diff --git a/src/DADSRH.cpp b/src/DADSRH.cpp
@@ -8,7 +8,7 @@ void DADSRH::reset() {
}
int DADSRH::channels() {
- return std::max(1, inputs[TRIGGER_INPUT].getChannels());
+ return inputs[TRIGGER_INPUT].getChannels();
}
void DADSRH::addChannel(int c) {
diff --git a/src/DADSRHPlus.cpp b/src/DADSRHPlus.cpp
@@ -8,7 +8,7 @@ void DADSRHPlus::reset() {
}
int DADSRHPlus::channels() {
- return std::max(1, inputs[TRIGGER_INPUT].getChannels());
+ return inputs[TRIGGER_INPUT].getChannels();
}
void DADSRHPlus::addChannel(int c) {
diff --git a/src/DGate.cpp b/src/DGate.cpp
@@ -17,7 +17,7 @@ void DGate::reset() {
}
int DGate::channels() {
- return std::max(1, inputs[TRIGGER_INPUT].getChannels());
+ return inputs[TRIGGER_INPUT].getChannels();
}
void DGate::addChannel(int c) {
diff --git a/src/EightFO.cpp b/src/EightFO.cpp
@@ -46,7 +46,7 @@ bool EightFO::active() {
}
int EightFO::channels() {
- return std::max(1, inputs[PITCH_INPUT].getChannels());
+ return inputs[PITCH_INPUT].getChannels();
}
void EightFO::addChannel(int c) {
diff --git a/src/FMOp.cpp b/src/FMOp.cpp
@@ -84,7 +84,7 @@ bool FMOp::active() {
}
int FMOp::channels() {
- return std::max(1, inputs[PITCH_INPUT].getChannels());
+ return inputs[PITCH_INPUT].getChannels();
}
void FMOp::addChannel(int c) {
diff --git a/src/LFO.cpp b/src/LFO.cpp
@@ -34,7 +34,7 @@ bool LFO::active() {
}
int LFO::channels() {
- return std::max(1, inputs[PITCH_INPUT].getChannels());
+ return inputs[PITCH_INPUT].getChannels();
}
void LFO::addChannel(int c) {
diff --git a/src/LLFO.cpp b/src/LLFO.cpp
@@ -18,7 +18,7 @@ bool LLFO::active() {
}
int LLFO::channels() {
- return std::max(1, inputs[PITCH_INPUT].getChannels());
+ return inputs[PITCH_INPUT].getChannels();
}
void LLFO::addChannel(int c) {
diff --git a/src/Offset.cpp b/src/Offset.cpp
@@ -2,7 +2,7 @@
#include "Offset.hpp"
int Offset::channels() {
- return std::max(1, inputs[IN_INPUT].getChannels());
+ return inputs[IN_INPUT].getChannels();
}
void Offset::processChannel(const ProcessArgs& args, int c) {
diff --git a/src/Shaper.cpp b/src/Shaper.cpp
@@ -8,7 +8,7 @@ void Shaper::reset() {
}
int Shaper::channels() {
- return std::max(1, inputs[TRIGGER_INPUT].getChannels());
+ return inputs[TRIGGER_INPUT].getChannels();
}
void Shaper::addChannel(int c) {
diff --git a/src/ShaperPlus.cpp b/src/ShaperPlus.cpp
@@ -8,7 +8,7 @@ void ShaperPlus::reset() {
}
int ShaperPlus::channels() {
- return std::max(1, inputs[SIGNAL_INPUT].getChannels());
+ return inputs[SIGNAL_INPUT].getChannels();
}
void ShaperPlus::addChannel(int c) {
diff --git a/src/Stack.cpp b/src/Stack.cpp
@@ -6,7 +6,7 @@ bool Stack::active() {
}
int Stack::channels() {
- return std::max(1, inputs[IN_INPUT].getChannels());
+ return inputs[IN_INPUT].getChannels();
}
void Stack::modulateChannel(int c) {
diff --git a/src/Sums.cpp b/src/Sums.cpp
@@ -4,7 +4,7 @@
void Sums::processChannel(const ProcessArgs& args, int c) {
assert(c == 0);
- for (int i = 0, cn = inputs[A_INPUT].getChannels(); i < cn; ++i) {
+ for (int i = 0, cn = std::max(1, inputs[A_INPUT].getChannels()); i < cn; ++i) {
float a = inputs[A_INPUT].getPolyVoltage(i);
float b = inputs[B_INPUT].getPolyVoltage(i);
outputs[SUM_OUTPUT].setChannels(cn);
diff --git a/src/Switch.cpp b/src/Switch.cpp
@@ -12,7 +12,7 @@ bool bogaudio::Switch::active() {
}
int bogaudio::Switch::channels() {
- return std::max(1, inputs[GATE_INPUT].getChannels());
+ return inputs[GATE_INPUT].getChannels();
}
void bogaudio::Switch::channelsChanged(int before, int after) {
diff --git a/src/Walk.cpp b/src/Walk.cpp
@@ -33,7 +33,7 @@ int Walk::channels() {
if (!(_polyInputID == OFFSET_INPUT || _polyInputID == SCALE_INPUT || _polyInputID == JUMP_INPUT)) {
id = RATE_INPUT;
}
- return std::max(1, inputs[id].getChannels());
+ return inputs[id].getChannels();
}
void Walk::modulateChannel(int c) {
diff --git a/src/XCO.cpp b/src/XCO.cpp
@@ -67,7 +67,7 @@ bool XCO::active() {
}
int XCO::channels() {
- return std::max(1, inputs[PITCH_INPUT].getChannels());
+ return inputs[PITCH_INPUT].getChannels();
}
void XCO::addChannel(int c) {
diff --git a/src/addressable_sequence.cpp b/src/addressable_sequence.cpp
@@ -48,7 +48,7 @@ void AddressableSequenceModule::dataFromJson(json_t* root) {
}
int AddressableSequenceModule::channels() {
- return std::max(1, _polyInputID == _selectInputID ? inputs[_selectInputID].getChannels() : inputs[_clockInputID].getChannels());
+ return _polyInputID == _selectInputID ? inputs[_selectInputID].getChannels() : inputs[_clockInputID].getChannels();
}
int AddressableSequenceModule::nextStep(
diff --git a/src/module.cpp b/src/module.cpp
@@ -22,7 +22,7 @@ void BGModule::process(const ProcessArgs& args) {
_steps = 0;
int channelsBefore = _channels;
- int channelsNow = channels();
+ int channelsNow = std::max(1, channels());
if (channelsBefore != channelsNow) {
_channels = channelsNow;
channelsChanged(channelsBefore, channelsNow);
diff --git a/src/vco_base.cpp b/src/vco_base.cpp
@@ -89,7 +89,7 @@ void VCOBase::dataFromJson(json_t* root) {
}
int VCOBase::channels() {
- return std::max(1, _polyInputID == _fmInputID ? inputs[_fmInputID].getChannels() : inputs[_pitchInputID].getChannels());
+ return _polyInputID == _fmInputID ? inputs[_fmInputID].getChannels() : inputs[_pitchInputID].getChannels();
}
void VCOBase::addChannel(int c) {