BogaudioModules

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

AddrSeq.hpp (4093B)


      1 #pragma once
      2 
      3 #include "AddrSeq_shared.hpp"
      4 
      5 namespace bogaudio {
      6 
      7 typedef ChainableExpandableModule<AddrSeqExpanderMessage, AddrSeqStep, 8, OutputRangeAddressableSequenceModule> AddrSeqBase;
      8 
      9 struct AddrSeq : AddrSeqBase {
     10 	enum ParamsIds {
     11 		STEPS_PARAM,
     12 		DIRECTION_PARAM,
     13 		SELECT_PARAM,
     14 		OUT1_PARAM,
     15 		OUT2_PARAM,
     16 		OUT3_PARAM,
     17 		OUT4_PARAM,
     18 		OUT5_PARAM,
     19 		OUT6_PARAM,
     20 		OUT7_PARAM,
     21 		OUT8_PARAM,
     22 		NUM_PARAMS
     23 	};
     24 
     25 	enum InputsIds {
     26 		CLOCK_INPUT,
     27 		RESET_INPUT,
     28 		SELECT_INPUT,
     29 		NUM_INPUTS
     30 	};
     31 
     32 	enum OutputsIds {
     33 		OUT_OUTPUT,
     34 		NUM_OUTPUTS
     35 	};
     36 
     37 	enum LightsIds {
     38 		OUT1_LIGHT,
     39 		OUT2_LIGHT,
     40 		OUT3_LIGHT,
     41 		OUT4_LIGHT,
     42 		OUT5_LIGHT,
     43 		OUT6_LIGHT,
     44 		OUT7_LIGHT,
     45 		OUT8_LIGHT,
     46 		NUM_LIGHTS
     47 	};
     48 
     49 	struct StepsParamQuantity : ParamQuantity {
     50 		float getDisplayValue() override {
     51 			float v = getValue();
     52 			if (!module) {
     53 				return v;
     54 			}
     55 
     56 			auto m = dynamic_cast<AddrSeq*>(module);
     57 			std::lock_guard<SpinLock> lock(m->_elementsLock);
     58 			int n = m->_elements.size();
     59 			v = clamp(v, 1.0f, 8.0f);
     60 			v -= 1.0f;
     61 			v /= 7.0f;
     62 			v *= n - 1;
     63 			v += 1.0f;
     64 			return (int)v;
     65 		}
     66 
     67 		void setDisplayValue(float dv) override {
     68 			if (!module) {
     69 				return;
     70 			}
     71 
     72 			auto m = dynamic_cast<AddrSeq*>(module);
     73 			std::lock_guard<SpinLock> lock(m->_elementsLock);
     74 			int n = m->_elements.size();
     75 			dv = clamp(dv, 1.0f, (float)n);
     76 			dv -= 1.0f;
     77 			dv /= (float)(n - 1);
     78 			dv *= 7.0f;
     79 			dv += 1.0f;
     80 			setValue(dv);
     81 		}
     82 	};
     83 
     84 	struct SelectParamQuantity : ParamQuantity {
     85 		float getDisplayValue() override {
     86 			float v = getValue();
     87 			if (!module) {
     88 				return v;
     89 			}
     90 
     91 			auto m = dynamic_cast<AddrSeq*>(module);
     92 			std::lock_guard<SpinLock> lock(m->_elementsLock);
     93 			int n = m->_elements.size();
     94 			v = clamp(v, 0.0f, 7.0f);
     95 			v /= 7.0f;
     96 			v *= n - 1;
     97 			v += 1.0f;
     98 			return (int)v;
     99 		}
    100 
    101 		void setDisplayValue(float dv) override {
    102 			if (!module) {
    103 				return;
    104 			}
    105 
    106 			auto m = dynamic_cast<AddrSeq*>(module);
    107 			std::lock_guard<SpinLock> lock(m->_elementsLock);
    108 			int n = m->_elements.size();
    109 			dv = clamp(dv, 1.0f, (float)n);
    110 			dv -= 1.0f;
    111 			dv /= (float)(n - 1);
    112 			dv *= 7.0f;
    113 			setValue(dv);
    114 		}
    115 	};
    116 
    117 	AddrSeq() {
    118 		config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
    119 		configParam<StepsParamQuantity>(STEPS_PARAM, 1.0f, 8.0f, 8.0f, "Steps");
    120 		configSwitch(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction", {"Reverse", "Forward"});
    121 		configParam<SelectParamQuantity>(SELECT_PARAM, 0.0f, 7.0f, 0.0f, "Select step");
    122 		configParam<OutputRangeParamQuantity>(OUT1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1", " V");
    123 		configParam<OutputRangeParamQuantity>(OUT2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2", " V");
    124 		configParam<OutputRangeParamQuantity>(OUT3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3", " V");
    125 		configParam<OutputRangeParamQuantity>(OUT4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4", " V");
    126 		configParam<OutputRangeParamQuantity>(OUT5_PARAM, -1.0f, 1.0f, 0.0f, "Step 5", " V");
    127 		configParam<OutputRangeParamQuantity>(OUT6_PARAM, -1.0f, 1.0f, 0.0f, "Step 6", " V");
    128 		configParam<OutputRangeParamQuantity>(OUT7_PARAM, -1.0f, 1.0f, 0.0f, "Step 7", " V");
    129 		configParam<OutputRangeParamQuantity>(OUT8_PARAM, -1.0f, 1.0f, 0.0f, "Step 8", " V");
    130 
    131 		configInput(CLOCK_INPUT, "Clock");
    132 		configInput(RESET_INPUT, "Reset");
    133 		configInput(SELECT_INPUT, "Select CV");
    134 
    135 		configOutput(OUT_OUTPUT, "Sequence");
    136 
    137 		setInputIDs(CLOCK_INPUT, SELECT_INPUT);
    138 		setLocalElements({
    139 			new AddrSeqStep(params[OUT1_PARAM], lights[OUT1_LIGHT]),
    140 			new AddrSeqStep(params[OUT2_PARAM], lights[OUT2_LIGHT]),
    141 			new AddrSeqStep(params[OUT3_PARAM], lights[OUT3_LIGHT]),
    142 			new AddrSeqStep(params[OUT4_PARAM], lights[OUT4_LIGHT]),
    143 			new AddrSeqStep(params[OUT5_PARAM], lights[OUT5_LIGHT]),
    144 			new AddrSeqStep(params[OUT6_PARAM], lights[OUT6_LIGHT]),
    145 			new AddrSeqStep(params[OUT7_PARAM], lights[OUT7_LIGHT]),
    146 			new AddrSeqStep(params[OUT8_PARAM], lights[OUT8_LIGHT])
    147 		});
    148 		registerBase();
    149 		setExpanderModelPredicate([](Model* m) { return m == modelAddrSeqX; });
    150 	}
    151 
    152 	void processAlways(const ProcessArgs& args) override;
    153 	void processChannel(const ProcessArgs& args, int c) override;
    154 };
    155 
    156 } // namespace bogaudio