BogaudioModules

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

commit bdbe157616ca28a0fadf97cf5ea8ce87040f1bbd
parent 52a009148690c6499f8005daa388baf0b515f543
Author: Matt Demanett <matt@demanett.net>
Date:   Thu, 21 Jun 2018 22:08:01 -0400

Random fixes.

Diffstat:
Mres-src/ADSR-src.svg | 22+++++++++++++++++++++-
Mres-src/FMOp-src.svg | 2+-
Mres-src/Follow-src.svg | 14++------------
Mres/ADSR.svg | 0
Mres/FMOp.svg | 0
Mres/Follow.svg | 0
Msrc/Bool.cpp | 6+++---
Msrc/Follow.cpp | 4++--
Msrc/Offset.cpp | 44++------------------------------------------
Msrc/Offset.hpp | 9+++------
Msrc/Pan.cpp | 4++--
Msrc/Pan.hpp | 2++
Msrc/Sums.cpp | 33++++++++++++++++++++++++---------
Msrc/Sums.hpp | 5+++--
Msrc/VCA.cpp | 2+-
Msrc/VCM.cpp | 8++++++--
Msrc/VCM.hpp | 5+++--
Msrc/bogaudio.cpp | 2+-
Asrc/disable_output_limit.cpp | 17+++++++++++++++++
Asrc/disable_output_limit.hpp | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/mixer.cpp | 2+-
Msrc/widgets.cpp | 2+-
22 files changed, 144 insertions(+), 88 deletions(-)

diff --git a/res-src/ADSR-src.svg b/res-src/ADSR-src.svg @@ -78,6 +78,26 @@ </g> </symbol> + <symbol id="knobguide-linear" viewBox="0 0 45px 45px"> + <g transform="translate(22.5 22.5)"> + <g transform="rotate(-240) translate(17 0)"> + <g transform="translate(3 0) rotate(240)"> + <text font-size="6.5pt" transform="translate(-2.8 3.3)">0</text> + </g> + </g> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-210) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-180) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-150) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-120) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-90) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-60) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(-30) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(0) translate(17 0)" /> + <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" transform="rotate(30) translate(17 0)" /> + <polyline points="0,0 3.5,0" stroke-width="1" stroke="#333" transform="rotate(60) translate(17 0)" /> + </g> + </symbol> + <symbol id="input" viewBox="0 0 24px 24px"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0" /> @@ -142,7 +162,7 @@ <g transform="translate(0 139)"> <text font-size="6pt" letter-spacing="2px" transform="translate(13 0)">SUS</text> <use id="SUSTAIN_PARAM" xlink:href="#knob" transform="translate(0 0)" /> - <use xlink:href="#knobguide" transform="translate(0 0)" /> + <use xlink:href="#knobguide-linear" transform="translate(0 0)" /> <use id="SUSTAIN_LIGHT" xlink:href="#light-tiny" transform="translate(20.8 40)" /> </g> diff --git a/res-src/FMOp-src.svg b/res-src/FMOp-src.svg @@ -240,7 +240,7 @@ <text font-size="8pt" letter-spacing="2px" transform="translate(8 25) rotate(270)">SUS</text> <use id="SUSTAIN_PARAM" xlink:href="#knob-medium" transform="translate(20 0)" /> <!-- <rect width="30" height="18" fill="#0f0" transform="translate(20 26)" /> --> - <use xlink:href="#knobguide-time" transform="translate(10.5 -9.5)" /> + <use xlink:href="#knobguide-linear" transform="translate(10.5 -9.5)" /> </g> <g transform="translate(87 229)"> <!-- <polyline points="0,0 200,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(-140 -10)" /> --> diff --git a/res-src/Follow-src.svg b/res-src/Follow-src.svg @@ -50,26 +50,16 @@ <symbol id="knobguide-scale" viewBox="0 0 45px 45px"> <g transform="translate(22.5 22.5)"> <text font-size="5.0pt" transform="rotate(-240) translate(20 0) rotate(240) translate(-2 2)">0</text> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-225) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-210) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-195) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-180) translate(17 0)" /> - <polyline points="0,0 3.5,0" stroke-width="1.0" stroke="#333" transform="rotate(-165) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-150) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-135) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-120) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-105) translate(17 0)" /> - <text font-size="5.0pt" transform="rotate(-90) translate(19 0) rotate(90) translate(-2 2)">1</text> + <polyline points="0,0 3.5,0" stroke-width="1.0" stroke="#333" transform="rotate(-90) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-60) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-75) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-45) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-30) translate(17 0)" /> - <polyline points="0,0 3.5,0" stroke-width="1.0" stroke="#333" transform="rotate(-15) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(0) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(15) translate(17 0)" /> <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(30) translate(17 0)" /> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(45) translate(17 0)" /> - <text font-size="5.0pt" transform="rotate(60) translate(20 0) rotate(-60) translate(-2 2)">2</text> + <text font-size="5.0pt" transform="rotate(60) translate(20 0) rotate(-60) translate(-2 2)">1</text> </g> </symbol> diff --git a/res/ADSR.svg b/res/ADSR.svg Binary files differ. diff --git a/res/FMOp.svg b/res/FMOp.svg Binary files differ. diff --git a/res/Follow.svg b/res/Follow.svg Binary files differ. diff --git a/src/Bool.cpp b/src/Bool.cpp @@ -2,13 +2,13 @@ #include "Bool.hpp" void Bool::step() { - bool a = inputs[A_INPUT].value > 2.0f; - bool b = inputs[B_INPUT].value > 2.0f; + bool a = inputs[A_INPUT].value > 1.0f; + bool b = inputs[B_INPUT].value > 1.0f; outputs[AND_OUTPUT].value = a && b ? 5.0f : 0.0f; outputs[OR_OUTPUT].value = a || b ? 5.0f : 0.0f; outputs[XOR_OUTPUT].value = a ^ b ? 5.0f : 0.0f; - outputs[NOT_OUTPUT].value = (inputs[NOT_INPUT].active && inputs[NOT_INPUT].value > 2.0f) ? 0.0f : 5.0f; + outputs[NOT_OUTPUT].value = (inputs[NOT_INPUT].active && inputs[NOT_INPUT].value > 1.0f) ? 0.0f : 5.0f; } struct BoolWidget : ModuleWidget { diff --git a/src/Follow.cpp b/src/Follow.cpp @@ -18,7 +18,7 @@ void Follow::step() { scale *= clamp(inputs[SCALE_INPUT].value / 5.0f, -1.0f, 1.0f); } - outputs[OUT_OUTPUT].value = scale * _rms.next(inputs[IN_INPUT].value); + outputs[OUT_OUTPUT].value = scale * 2.0f * _rms.next(inputs[IN_INPUT].value); } } @@ -50,7 +50,7 @@ struct FollowWidget : ModuleWidget { // end generated by svg_widgets.rb addParam(ParamWidget::create<Knob29>(responseParamPosition, module, Follow::RESPONSE_PARAM, 0.0, 1.0, 0.3)); - addParam(ParamWidget::create<Knob29>(scaleParamPosition, module, Follow::SCALE_PARAM, 0.0, 2.0, 1.0)); + addParam(ParamWidget::create<Knob29>(scaleParamPosition, module, Follow::SCALE_PARAM, 0.0, 1.0, 1.0)); addInput(Port::create<Port24>(responseInputPosition, Port::INPUT, module, Follow::RESPONSE_INPUT)); addInput(Port::create<Port24>(scaleInputPosition, Port::INPUT, module, Follow::SCALE_INPUT)); diff --git a/src/Offset.cpp b/src/Offset.cpp @@ -1,21 +1,6 @@ #include "Offset.hpp" -#define DISABLE_OUTPUT_LIMIT "disableOutputLimit" - -json_t* Offset::toJson() { - json_t* root = json_object(); - json_object_set_new(root, DISABLE_OUTPUT_LIMIT, json_boolean(_disableOutputLimit)); - return root; -} - -void Offset::fromJson(json_t* root) { - json_t* dol = json_object_get(root, DISABLE_OUTPUT_LIMIT); - if (dol) { - _disableOutputLimit = json_is_true(dol); - } -} - void Offset::step() { float offset = knobValue(params[OFFSET_PARAM], inputs[OFFSET_INPUT]); float scale = knobValue(params[SCALE_PARAM], inputs[SCALE_INPUT]); @@ -39,28 +24,10 @@ float Offset::knobValue(const Param& knob, const Input& cv) const { return v; } -struct DisableOutputLimitMenuItem : MenuItem { - Offset* _module; - - DisableOutputLimitMenuItem(Offset* module, const char* label) - : _module(module) - { - this->text = label; - } - - void onAction(EventAction &e) override { - _module->_disableOutputLimit = !_module->_disableOutputLimit; - } - - void step() override { - rightText = _module->_disableOutputLimit ? "✔" : ""; - } -}; - -struct OffsetWidget : ModuleWidget { +struct OffsetWidget : DisableOutputLimitModuleWidget { static constexpr int hp = 3; - OffsetWidget(Offset* module) : ModuleWidget(module) { + OffsetWidget(Offset* module) : DisableOutputLimitModuleWidget(module) { box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); { @@ -93,13 +60,6 @@ struct OffsetWidget : ModuleWidget { addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, Offset::OUT_OUTPUT)); } - - void appendContextMenu(Menu* menu) override { - Offset* offset = dynamic_cast<Offset*>(module); - assert(offset); - menu->addChild(new MenuLabel()); - menu->addChild(new DisableOutputLimitMenuItem(offset, "Diable Output Limit")); - } }; Model* modelOffset = createModel<Offset, OffsetWidget>("Bogaudio-Offset", "Offset", "CV offset and scaler", ATTENUATOR_TAG); diff --git a/src/Offset.hpp b/src/Offset.hpp @@ -1,12 +1,13 @@ #pragma once #include "bogaudio.hpp" +#include "disable_output_limit.hpp" extern Model* modelOffset; namespace bogaudio { -struct Offset : Module { +struct Offset : DisableOutputLimitModule { enum ParamIds { OFFSET_PARAM, SCALE_PARAM, @@ -25,12 +26,8 @@ struct Offset : Module { NUM_OUTPUTS }; - bool _disableOutputLimit = false; + Offset() : DisableOutputLimitModule(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} - Offset() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} - - json_t* toJson() override; - void fromJson(json_t* root) override; void step() override; float knobValue(const Param& knob, const Input& cv) const; diff --git a/src/Pan.cpp b/src/Pan.cpp @@ -28,8 +28,8 @@ void Pan::step() { _panner1.next(inputs[IN1_INPUT].value, l1, r1); float l2 = 0.0f, r2 = 0.0f; _panner2.next(inputs[IN2_INPUT].value, l2, r2); - outputs[L_OUTPUT].value = l1 + l2; - outputs[R_OUTPUT].value = r1 + r2; + outputs[L_OUTPUT].value = _saturatorLeft.next(l1 + l2); + outputs[R_OUTPUT].value = _saturatorRight.next(r1 + r2); } struct PanWidget : ModuleWidget { diff --git a/src/Pan.hpp b/src/Pan.hpp @@ -38,6 +38,8 @@ struct Pan : Module { Panner _panner2; SlewLimiter _slew1; SlewLimiter _slew2; + Saturator _saturatorLeft; + Saturator _saturatorRight; Pan() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onSampleRateChange(); diff --git a/src/Sums.cpp b/src/Sums.cpp @@ -4,23 +4,38 @@ void Sums::step() { float a = inputs[A_INPUT].value; float b = inputs[B_INPUT].value; - outputs[SUM_OUTPUT].value = a + b; - outputs[DIFFERENCE_OUTPUT].value = a - b; - outputs[MAX_OUTPUT].value = std::max(a, b); - outputs[MIN_OUTPUT].value = std::min(a, b); + if (_disableOutputLimit) { + outputs[SUM_OUTPUT].value = a + b, + outputs[DIFFERENCE_OUTPUT].value = a - b; + outputs[MAX_OUTPUT].value = std::max(a, b); + outputs[MIN_OUTPUT].value = std::min(a, b); - if (inputs[NEGATE_INPUT].active) { - outputs[NEGATE_OUTPUT].value = -inputs[NEGATE_INPUT].value; + if (inputs[NEGATE_INPUT].active) { + outputs[NEGATE_OUTPUT].value = -inputs[NEGATE_INPUT].value; + } + else { + outputs[NEGATE_OUTPUT].value = 0.0f; + } } else { - outputs[NEGATE_OUTPUT].value = 0.0f; + outputs[SUM_OUTPUT].value = clamp(a + b, -12.0f, 12.0f); + outputs[DIFFERENCE_OUTPUT].value = clamp(a - b, -12.0f, 12.0f); + outputs[MAX_OUTPUT].value = clamp(std::max(a, b), -12.0f, 12.0f); + outputs[MIN_OUTPUT].value = clamp(std::min(a, b), -12.0f, 12.0f); + + if (inputs[NEGATE_INPUT].active) { + outputs[NEGATE_OUTPUT].value = clamp(-inputs[NEGATE_INPUT].value, -12.0f, 12.0f); + } + else { + outputs[NEGATE_OUTPUT].value = 0.0f; + } } } -struct SumsWidget : ModuleWidget { +struct SumsWidget : DisableOutputLimitModuleWidget { static constexpr int hp = 3; - SumsWidget(Sums* module) : ModuleWidget(module) { + SumsWidget(Sums* module) : DisableOutputLimitModuleWidget(module) { box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); { diff --git a/src/Sums.hpp b/src/Sums.hpp @@ -1,12 +1,13 @@ #pragma once #include "bogaudio.hpp" +#include "disable_output_limit.hpp" extern Model* modelSums; namespace bogaudio { -struct Sums : Module { +struct Sums : DisableOutputLimitModule { enum ParamsIds { NUM_PARAMS }; @@ -31,7 +32,7 @@ struct Sums : Module { NUM_LIGHTS }; - Sums() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { + Sums() : DisableOutputLimitModule(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } void step() override; diff --git a/src/VCA.cpp b/src/VCA.cpp @@ -11,7 +11,7 @@ void VCA::step() { bool linear = params[LINEAR_PARAM].value > 0.5f; lights[LINEAR_LIGHT].value = linear; channelStep(inputs[IN1_INPUT], outputs[OUT1_OUTPUT], params[LEVEL1_PARAM], inputs[CV1_INPUT], _amplifier1, _levelSL1, linear); - channelStep(inputs[IN2_INPUT], outputs[OUT2_OUTPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT], _amplifier2, _levelSL1, linear); + channelStep(inputs[IN2_INPUT], outputs[OUT2_OUTPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT], _amplifier2, _levelSL2, linear); } void VCA::channelStep(Input& input, Output& output, Param& knob, Input& cv, Amplifier& amplifier, SlewLimiter& levelSL, bool linear) { diff --git a/src/VCM.cpp b/src/VCM.cpp @@ -13,6 +13,10 @@ void VCM::step() { if (inputs[MIX_CV_INPUT].active) { level *= clamp(inputs[MIX_CV_INPUT].value / 10.0f, 0.0f, 1.0f); } + out *= level; + if (!_disableOutputLimit) { + out = clamp(out, -12.0f, 12.0f); + } outputs[MIX_OUTPUT].value = level * out; } } @@ -34,10 +38,10 @@ float VCM::channelStep(Input& input, Param& knob, Input& cv, Amplifier& amplifie return amplifier.next(input.value); } -struct VCMWidget : ModuleWidget { +struct VCMWidget : DisableOutputLimitModuleWidget { static constexpr int hp = 10; - VCMWidget(VCM* module) : ModuleWidget(module) { + VCMWidget(VCM* module) : DisableOutputLimitModuleWidget(module) { box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); { diff --git a/src/VCM.hpp b/src/VCM.hpp @@ -1,6 +1,7 @@ #pragma once #include "bogaudio.hpp" +#include "disable_output_limit.hpp" #include "dsp/signal.hpp" using namespace bogaudio::dsp; @@ -9,7 +10,7 @@ extern Model* modelVCM; namespace bogaudio { -struct VCM : Module { +struct VCM : DisableOutputLimitModule { enum ParamsIds { LEVEL1_PARAM, LEVEL2_PARAM, @@ -48,7 +49,7 @@ struct VCM : Module { Amplifier _amplifier3; Amplifier _amplifier4; - VCM() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { + VCM() : DisableOutputLimitModule(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onReset(); } diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp @@ -88,7 +88,6 @@ void init(rack::Plugin *p) { p->addModel(modelBool); p->addModel(modelCVD); p->addModel(modelFlipFlop); - p->addModel(modelLag); p->addModel(modelManual); p->addModel(modelMult); p->addModel(modelNoise); @@ -98,6 +97,7 @@ void init(rack::Plugin *p) { p->addModel(modelSwitch); #ifdef EXPERIMENTAL + p->addModel(modelLag); p->addModel(modelRM); #endif diff --git a/src/disable_output_limit.cpp b/src/disable_output_limit.cpp @@ -0,0 +1,17 @@ + +#include "disable_output_limit.hpp" + +#define DISABLE_OUTPUT_LIMIT "disableOutputLimit" + +json_t* DisableOutputLimitModule::toJson() { + json_t* root = json_object(); + json_object_set_new(root, DISABLE_OUTPUT_LIMIT, json_boolean(_disableOutputLimit)); + return root; +} + +void DisableOutputLimitModule::fromJson(json_t* root) { + json_t* dol = json_object_get(root, DISABLE_OUTPUT_LIMIT); + if (dol) { + _disableOutputLimit = json_is_true(dol); + } +} diff --git a/src/disable_output_limit.hpp b/src/disable_output_limit.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "bogaudio.hpp" + +namespace bogaudio { + +struct DisableOutputLimitModule : Module { + bool _disableOutputLimit = false; + + DisableOutputLimitModule(int numParams, int numInputs, int numOutputs, int numLights = 0) + : Module(numParams, numInputs, numOutputs, numLights) + { + } + + json_t* toJson() override; + void fromJson(json_t* root) override; +}; + +struct DisableOutputLimitMenuItem : MenuItem { + DisableOutputLimitModule* _module; + + DisableOutputLimitMenuItem(DisableOutputLimitModule* module, const char* label) + : _module(module) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_disableOutputLimit = !_module->_disableOutputLimit; + } + + void step() override { + rightText = _module->_disableOutputLimit ? "✔" : ""; + } +}; + +struct DisableOutputLimitModuleWidget : ModuleWidget { + DisableOutputLimitModuleWidget(Module* module) : ModuleWidget(module) { + } + + void appendContextMenu(Menu* menu) override { + DisableOutputLimitModule* dolm = dynamic_cast<DisableOutputLimitModule*>(module); + assert(dolm); + menu->addChild(new MenuLabel()); + menu->addChild(new DisableOutputLimitMenuItem(dolm, "Diable Output Limit")); + } +}; + +} // namespace bogaudio diff --git a/src/mixer.cpp b/src/mixer.cpp @@ -32,7 +32,7 @@ void MixerChannel::next(bool stereo) { } out = _amplifier.next(_inInput.value); - rms = _rms.next(out) / 5.0f; + rms = _rms.next(out / 5.0f); if (stereo) { float pan = clamp(_panParam.value, -1.0f, 1.0f); if (_panInput.active) { diff --git a/src/widgets.cpp b/src/widgets.cpp @@ -131,7 +131,7 @@ NVGcolor bogaudio::decibelsToColor(float db) { if (db < 0.0f) { return nvgRGBA((1.0f - db / -24.0f) * 0xff, 0xff, 0x00, 0xff); } - return nvgRGBA(0xff, (1.0f - db / 18.0f) * 0xff, 0x00, 0xff); + return nvgRGBA(0xff, (1.0f - std::min(db, 9.0f) / 9.0f) * 0xff, 0x00, 0xff); }