BogaudioModules

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

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:
Msrc/AD.cpp | 2+-
Msrc/AMRM.cpp | 27++++++++++++++++++++++++++-
Msrc/AMRM.hpp | 3+++
Msrc/ASR.cpp | 2+-
Msrc/Additator.cpp | 2+-
Msrc/Bool.cpp | 4++--
Msrc/Cmp.cpp | 2+-
Msrc/DADSRH.cpp | 2+-
Msrc/DADSRHPlus.cpp | 2+-
Msrc/DGate.cpp | 2+-
Msrc/EightFO.cpp | 2+-
Msrc/FMOp.cpp | 2+-
Msrc/LFO.cpp | 2+-
Msrc/LLFO.cpp | 2+-
Msrc/Offset.cpp | 2+-
Msrc/Shaper.cpp | 2+-
Msrc/ShaperPlus.cpp | 2+-
Msrc/Stack.cpp | 2+-
Msrc/Sums.cpp | 2+-
Msrc/Switch.cpp | 2+-
Msrc/Walk.cpp | 2+-
Msrc/XCO.cpp | 2+-
Msrc/addressable_sequence.cpp | 2+-
Msrc/module.cpp | 2+-
Msrc/vco_base.cpp | 2+-
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) {