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:
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;
};