commit bdbe157616ca28a0fadf97cf5ea8ce87040f1bbd
parent 52a009148690c6499f8005daa388baf0b515f543
Author: Matt Demanett <matt@demanett.net>
Date: Thu, 21 Jun 2018 22:08:01 -0400
Random fixes.
Diffstat:
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);
}