BogaudioModules

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

commit 96550552d4d20e8fcb440dd7b7ad8a343460007b
parent 40a056484446a19f75d126607b7710d71d00d56a
Author: Matt Demanett <matt@demanett.net>
Date:   Sun, 30 Jun 2019 23:17:40 -0400

ADDR-SEQ: add context menu options for output range. #53

Diffstat:
Msrc/AddrSeq.cpp | 93++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/AddrSeq.hpp | 16++++++++++++++++
2 files changed, 108 insertions(+), 1 deletion(-)

diff --git a/src/AddrSeq.cpp b/src/AddrSeq.cpp @@ -2,6 +2,7 @@ #include "AddrSeq.hpp" #define SELECT_ON_CLOCK "select_on_clock" +#define RANGE "range" void AddrSeq::onReset() { _step = 0; @@ -16,6 +17,7 @@ void AddrSeq::onSampleRateChange() { json_t* AddrSeq::dataToJson() { json_t* root = json_object(); json_object_set_new(root, SELECT_ON_CLOCK, json_boolean(_selectOnClock)); + json_object_set_new(root, RANGE, json_integer(_range)); return root; } @@ -24,6 +26,64 @@ void AddrSeq::dataFromJson(json_t* root) { if (s) { _selectOnClock = json_is_true(s); } + + json_t* r = json_object_get(root, RANGE); + if (r) { + int range = json_integer_value(r); + if (range >= B10_RANGE && range <= U1_RANGE) { + setRange((Range)range); + } + } +} + +void AddrSeq::setRange(Range range) { + _range = range; + + switch (_range) { + case B10_RANGE: { + _rangeOffset = 0.0f; + _rangeScale = 10.0f; + break; + } + case B5_RANGE: { + _rangeOffset = 0.0f; + _rangeScale = 5.0f; + break; + } + case B3_RANGE: { + _rangeOffset = 0.0f; + _rangeScale = 3.0f; + break; + } + case B1_RANGE: { + _rangeOffset = 0.0f; + _rangeScale = 1.0f; + break; + } + case U10_RANGE: { + _rangeOffset = 1.0f; + _rangeScale = 5.0f; + break; + } + case U5_RANGE: { + _rangeOffset = 1.0f; + _rangeScale = 2.5f; + break; + } + case U3_RANGE: { + _rangeOffset = 1.0f; + _rangeScale = 1.5f; + break; + } + case U1_RANGE: { + _rangeOffset = 1.0f; + _rangeScale = 0.5f; + break; + } + default: { + assert(false); + } + } } void AddrSeq::process(const ProcessArgs& args) { @@ -52,7 +112,9 @@ void AddrSeq::process(const ProcessArgs& args) { out += params[OUT1_PARAM + i].getValue() * (step == i); lights[OUT1_LIGHT + i].value = step == i; } - outputs[OUT_OUTPUT].setVoltage(out * 10.0f); + out += _rangeOffset; + out *= _rangeScale; + outputs[OUT_OUTPUT].setVoltage(out); } struct SelectOnClockMenuItem : MenuItem { @@ -73,6 +135,26 @@ struct SelectOnClockMenuItem : MenuItem { } }; +struct RangeMenuItem : MenuItem { + AddrSeq* _module; + AddrSeq::Range _range; + + RangeMenuItem(AddrSeq* module, const char* label, AddrSeq::Range range) + : _module(module) + , _range(range) + { + this->text = label; + } + + void onAction(const event::Action& e) override { + _module->setRange(_range); + } + + void step() override { + rightText = _module->_range == _range ? "✔" : ""; + } +}; + struct AddrSeqWidget : ModuleWidget { static constexpr int hp = 6; @@ -160,6 +242,15 @@ struct AddrSeqWidget : ModuleWidget { assert(m); menu->addChild(new MenuLabel()); menu->addChild(new SelectOnClockMenuItem(m, "Select on clock")); + menu->addChild(new MenuLabel()); + menu->addChild(new RangeMenuItem(m, "Range: +/-10V", AddrSeq::B10_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: +/-5V", AddrSeq::B5_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: +/-3V", AddrSeq::B3_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: +/-1V", AddrSeq::B1_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: 0V-10V", AddrSeq::U10_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: 0V-5V", AddrSeq::U5_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: 0V-3V", AddrSeq::U3_RANGE)); + menu->addChild(new RangeMenuItem(m, "Range: 0V-1V", AddrSeq::U1_RANGE)); } }; diff --git a/src/AddrSeq.hpp b/src/AddrSeq.hpp @@ -49,12 +49,26 @@ struct AddrSeq : Module { NUM_LIGHTS }; + enum Range { + B10_RANGE, + B5_RANGE, + B3_RANGE, + B1_RANGE, + U10_RANGE, + U5_RANGE, + U3_RANGE, + U1_RANGE + }; + Trigger _clock; Trigger _reset; bogaudio::dsp::Timer _timer; int _step; bool _selectOnClock = false; int _select = 0; + Range _range; + float _rangeOffset; + float _rangeScale; AddrSeq() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); @@ -72,12 +86,14 @@ struct AddrSeq : Module { onReset(); onSampleRateChange(); + setRange(B5_RANGE); } void onReset() override; void onSampleRateChange() override; json_t* dataToJson() override; void dataFromJson(json_t* root) override; + void setRange(Range range); void process(const ProcessArgs& args) override; };