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