BogaudioModules

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

output_range.hpp (2164B)


      1 #pragma once
      2 
      3 #include "bogaudio.hpp"
      4 
      5 using namespace rack;
      6 
      7 namespace bogaudio {
      8 
      9 struct OutputRange {
     10 	float _rangeOffset = 0.0f;
     11 	float _rangeScale = 10.0f;
     12 
     13 	struct OutputRangeParamQuantity : ParamQuantity {
     14 		float getDisplayValue() override;
     15 		void setDisplayValue(float v) override;
     16 	};
     17 };
     18 
     19 template<class BASE>
     20 struct OutputRangeModule : BASE, OutputRange {
     21 	json_t* saveToJson(json_t* root) override {
     22 		root = BASE::saveToJson(root);
     23 		json_object_set_new(root, "range_offset", json_real(_rangeOffset));
     24 		json_object_set_new(root, "range_scale", json_real(_rangeScale));
     25 		return root;
     26 	}
     27 
     28 	void loadFromJson(json_t* root) override {
     29 		BASE::loadFromJson(root);
     30 
     31 		json_t* ro = json_object_get(root, "range_offset");
     32 		if (ro) {
     33 			_rangeOffset = json_real_value(ro);
     34 		}
     35 
     36 		json_t* rs = json_object_get(root, "range_scale");
     37 		if (rs) {
     38 			_rangeScale = json_real_value(rs);
     39 		}
     40 	}
     41 };
     42 
     43 struct OutputRangeOptionMenuItem : OptionMenuItem {
     44 	OutputRangeOptionMenuItem(OutputRange* module, const char* label, float offset, float scale)
     45 	: OptionMenuItem(
     46 		label,
     47 		[=]() { return module->_rangeOffset == offset && module->_rangeScale == scale; },
     48 		[=]() {
     49 			module->_rangeOffset = offset;
     50 			module->_rangeScale = scale;
     51 		}
     52 	)
     53 	{}
     54 
     55 	static void addOutputRangeOptionsToMenu(Module* module, Menu* menu) {
     56 		auto m = dynamic_cast<OutputRange*>(module);
     57 		assert(m);
     58 		OptionsMenuItem* mi = new OptionsMenuItem("Range");
     59 		mi->addItem(OutputRangeOptionMenuItem(m, "+/-10V", 0.0f, 10.0f));
     60 		mi->addItem(OutputRangeOptionMenuItem(m, "+/-5V", 0.0f, 5.0f));
     61 		mi->addItem(OutputRangeOptionMenuItem(m, "+/-3V", 0.0f, 3.0f));
     62 		mi->addItem(OutputRangeOptionMenuItem(m, "+/-2V", 0.0f, 2.0f));
     63 		mi->addItem(OutputRangeOptionMenuItem(m, "+/-1V", 0.0f, 1.0f));
     64 		mi->addItem(OutputRangeOptionMenuItem(m, "0V-10V", 1.0f, 5.0f));
     65 		mi->addItem(OutputRangeOptionMenuItem(m, "0V-5V", 1.0f, 2.5f));
     66 		mi->addItem(OutputRangeOptionMenuItem(m, "0V-3V", 1.0f, 1.5f));
     67 		mi->addItem(OutputRangeOptionMenuItem(m, "0V-2V", 1.0f, 1.0f));
     68 		mi->addItem(OutputRangeOptionMenuItem(m, "0V-1V", 1.0f, 0.5f));
     69 		OptionsMenuItem::addToMenu(mi, menu);
     70 	}
     71 };
     72 
     73 } // namespace bogaudio