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