BogaudioModules

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

Pgmr.hpp (5308B)


      1 #pragma once
      2 
      3 #include <algorithm>
      4 #include <functional>
      5 
      6 #include "Pgmr_shared.hpp"
      7 
      8 namespace bogaudio {
      9 
     10 typedef ChainableExpandableModule<PgmrExpanderMessage, PgmrStep, 4, OutputRangeAddressableSequenceModule> PgmrBase;
     11 
     12 struct Pgmr : PgmrBase {
     13 	enum ParamsIds {
     14 		DIRECTION_PARAM,
     15 		SELECT_ON_CLOCK_PARAM,
     16 		CVA1_PARAM,
     17 		CVB1_PARAM,
     18 		CVC1_PARAM,
     19 		CVD1_PARAM,
     20 		SELECT1_PARAM,
     21 		CVA2_PARAM,
     22 		CVB2_PARAM,
     23 		CVC2_PARAM,
     24 		CVD2_PARAM,
     25 		SELECT2_PARAM,
     26 		CVA3_PARAM,
     27 		CVB3_PARAM,
     28 		CVC3_PARAM,
     29 		CVD3_PARAM,
     30 		SELECT3_PARAM,
     31 		CVA4_PARAM,
     32 		CVB4_PARAM,
     33 		CVC4_PARAM,
     34 		CVD4_PARAM,
     35 		SELECT4_PARAM,
     36 		NUM_PARAMS
     37 	};
     38 
     39 	enum InputsIds {
     40 		CLOCK_INPUT,
     41 		SELECT_INPUT,
     42 		SELECT1_INPUT,
     43 		SELECT2_INPUT,
     44 		SELECT3_INPUT,
     45 		SELECT4_INPUT,
     46 		NUM_INPUTS
     47 	};
     48 
     49 	enum OutputsIds {
     50 		A_OUTPUT,
     51 		B_OUTPUT,
     52 		C_OUTPUT,
     53 		D_OUTPUT,
     54 		SELECT_ALL_OUTPUT,
     55 		SELECT1_OUTPUT,
     56 		SELECT2_OUTPUT,
     57 		SELECT3_OUTPUT,
     58 		SELECT4_OUTPUT,
     59 		NUM_OUTPUTS
     60 	};
     61 
     62 	enum LightsIds {
     63 		SELECT1_LIGHT,
     64 		SELECT2_LIGHT,
     65 		SELECT3_LIGHT,
     66 		SELECT4_LIGHT,
     67 		NUM_LIGHTS
     68 	};
     69 
     70 	float _sampleTime = 0.001f;
     71 	bool _selectTriggers = false;
     72 	int _lastSteps[maxChannels] {};
     73 	rack::dsp::PulseGenerator _allPulseGens[maxChannels];
     74 	bool _saveLastTriggeredToPatch = false;
     75 	std::function<void()>* _restoreLastTriggered = NULL;
     76 	int _restoreLastTriggeredExpectedElementsN = 0;
     77 
     78 	Pgmr() {
     79 		config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
     80 		configSwitch(DIRECTION_PARAM, 0.0f, 1.0f, 1.0f, "Direction", {"Reverse", "Forward"});
     81 		configSwitch(SELECT_ON_CLOCK_PARAM, 0.0f, 1.0f, 0.0f, "Select on clock", {"Disabled", "Enabled"});
     82 		configParam<OutputRangeParamQuantity>(CVA1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1A", " V");
     83 		configParam<OutputRangeParamQuantity>(CVB1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1B", " V");
     84 		configParam<OutputRangeParamQuantity>(CVC1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1C", " V");
     85 		configParam<OutputRangeParamQuantity>(CVD1_PARAM, -1.0f, 1.0f, 0.0f, "Step 1D", " V");
     86 		configButton(SELECT1_PARAM, "Select 1");
     87 		configParam<OutputRangeParamQuantity>(CVA2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2A", " V");
     88 		configParam<OutputRangeParamQuantity>(CVB2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2B", " V");
     89 		configParam<OutputRangeParamQuantity>(CVC2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2C", " V");
     90 		configParam<OutputRangeParamQuantity>(CVD2_PARAM, -1.0f, 1.0f, 0.0f, "Step 2D", " V");
     91 		configButton(SELECT2_PARAM, "Select 2");
     92 		configParam<OutputRangeParamQuantity>(CVA3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3A", " V");
     93 		configParam<OutputRangeParamQuantity>(CVB3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3B", " V");
     94 		configParam<OutputRangeParamQuantity>(CVC3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3C", " V");
     95 		configParam<OutputRangeParamQuantity>(CVD3_PARAM, -1.0f, 1.0f, 0.0f, "Step 3D", " V");
     96 		configButton(SELECT3_PARAM, "Select 3");
     97 		configParam<OutputRangeParamQuantity>(CVA4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4A", " V");
     98 		configParam<OutputRangeParamQuantity>(CVB4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4B", " V");
     99 		configParam<OutputRangeParamQuantity>(CVC4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4C", " V");
    100 		configParam<OutputRangeParamQuantity>(CVD4_PARAM, -1.0f, 1.0f, 0.0f, "Step 4D", " V");
    101 		configButton(SELECT4_PARAM, "Select 4");
    102 		setInputIDs(CLOCK_INPUT, SELECT_INPUT);
    103 
    104 		configInput(CLOCK_INPUT, "Clock");
    105 		configInput(SELECT_INPUT, "Select CV");
    106 		configInput(SELECT1_INPUT, "Select 1 trigger");
    107 		configInput(SELECT2_INPUT, "Select 2 trigger");
    108 		configInput(SELECT3_INPUT, "Select 3 trigger");
    109 		configInput(SELECT4_INPUT, "Select 4 trigger");
    110 
    111 		configOutput(A_OUTPUT, "Sequence A");
    112 		configOutput(B_OUTPUT, "Sequence B");
    113 		configOutput(C_OUTPUT, "Sequence C");
    114 		configOutput(D_OUTPUT, "Sequence D");
    115 		configOutput(SELECT_ALL_OUTPUT, "Step change trigger");
    116 		configOutput(SELECT1_OUTPUT, "Select 1 trigger");
    117 		configOutput(SELECT2_OUTPUT, "Select 2 trigger");
    118 		configOutput(SELECT3_OUTPUT, "Select 3 trigger");
    119 		configOutput(SELECT4_OUTPUT, "Select 4 trigger");
    120 
    121 		setLocalElements({
    122 			new PgmrStep(params[CVA1_PARAM], params[CVB1_PARAM], params[CVC1_PARAM], params[CVD1_PARAM], lights[SELECT1_LIGHT], params[SELECT1_PARAM], inputs[SELECT1_INPUT], outputs[SELECT1_OUTPUT]),
    123 			new PgmrStep(params[CVA2_PARAM], params[CVB2_PARAM], params[CVC2_PARAM], params[CVD2_PARAM], lights[SELECT2_LIGHT], params[SELECT2_PARAM], inputs[SELECT2_INPUT], outputs[SELECT2_OUTPUT]),
    124 			new PgmrStep(params[CVA3_PARAM], params[CVB3_PARAM], params[CVC3_PARAM], params[CVD3_PARAM], lights[SELECT3_LIGHT], params[SELECT3_PARAM], inputs[SELECT3_INPUT], outputs[SELECT3_OUTPUT]),
    125 			new PgmrStep(params[CVA4_PARAM], params[CVB4_PARAM], params[CVC4_PARAM], params[CVD4_PARAM], lights[SELECT4_LIGHT], params[SELECT4_PARAM], inputs[SELECT4_INPUT], outputs[SELECT4_OUTPUT])
    126 		});
    127 		registerBase();
    128 		setExpanderModelPredicate([](Model* m) { return m == modelPgmrX; });
    129 
    130 		std::fill_n(_lastSteps, maxChannels, -1);
    131 	}
    132 	virtual ~Pgmr() {
    133 		if (_restoreLastTriggered) {
    134 			delete _restoreLastTriggered;
    135 		}
    136 	}
    137 
    138 	void reset() override;
    139 	void sampleRateChange() override;
    140 	json_t* saveToJson(json_t* root) override;
    141 	void loadFromJson(json_t* root) override;
    142 	void modulate() override;
    143 	void processAlways(const ProcessArgs& args) override;
    144 	void processChannel(const ProcessArgs& args, int c) override;
    145 	void elementsChanged() override;
    146 };
    147 
    148 } // namespace bogaudio