Mix4x.cpp (8764B)
1 2 #include "Mix4x.hpp" 3 4 void Mix4x::sampleRateChange() { 5 float sr = APP->engine->getSampleRate(); 6 for (int i = 0; i < 4; ++i) { 7 _channels[i]->setSampleRate(sr); 8 } 9 _returnASL.setParams(sr, MixerChannel::levelSlewTimeMS, MixerChannel::maxDecibels - MixerChannel::minDecibels); 10 _returnBSL.setParams(sr, MixerChannel::levelSlewTimeMS, MixerChannel::maxDecibels - MixerChannel::minDecibels); 11 } 12 13 void Mix4x::modulate() { 14 for (int i = 0; i < 4; ++i) { 15 _channels[i]->modulate(); 16 } 17 } 18 19 void Mix4x::processAll(const ProcessArgs& args) { 20 if (!baseConnected()) { 21 outputs[SEND_A_OUTPUT].setVoltage(0.0f); 22 outputs[SEND_B_OUTPUT].setVoltage(0.0f); 23 return; 24 } 25 26 Mix4ExpanderMessage* from = fromBase(); 27 Mix4ExpanderMessage* to = toBase(); 28 float sendA = 0.0f; 29 float sendB = 0.0f; 30 bool sendAActive = outputs[SEND_A_OUTPUT].isConnected(); 31 bool sendBActive = outputs[SEND_B_OUTPUT].isConnected(); 32 for (int i = 0; i < 4; ++i) { 33 if (from->active[i]) { 34 _channels[i]->next(from->preFader[i], from->postFader[i], sendAActive, sendBActive); 35 to->postEQ[i] = _channels[i]->postEQ; 36 sendA += _channels[i]->sendA; 37 sendB += _channels[i]->sendB; 38 } 39 else { 40 to->postEQ[i] = from->preFader[i]; 41 } 42 } 43 outputs[SEND_A_OUTPUT].setVoltage(_saturatorA.next(sendA)); 44 outputs[SEND_B_OUTPUT].setVoltage(_saturatorA.next(sendB)); 45 46 bool lAActive = inputs[L_A_INPUT].isConnected(); 47 bool rAActive = inputs[R_A_INPUT].isConnected(); 48 if (lAActive || rAActive) { 49 float levelA = clamp(params[LEVEL_A_PARAM].getValue(), 0.0f, 1.0f); 50 if (inputs[LEVEL_A_INPUT].isConnected()) { 51 levelA *= clamp(inputs[LEVEL_A_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f); 52 } 53 levelA = 1.0f - levelA; 54 levelA *= Amplifier::minDecibels; 55 _returnAAmp.setLevel(_returnASL.next(levelA)); 56 if (lAActive) { 57 to->returnA[0] = _returnAAmp.next(inputs[L_A_INPUT].getVoltage()); 58 } 59 else { 60 to->returnA[0] = 0.0f; 61 } 62 if (rAActive) { 63 to->returnA[1] = _returnAAmp.next(inputs[R_A_INPUT].getVoltage()); 64 } 65 else { 66 to->returnA[1] = to->returnA[0]; 67 } 68 } 69 70 bool lBActive = inputs[L_B_INPUT].isConnected(); 71 bool rBActive = inputs[R_B_INPUT].isConnected(); 72 if (lBActive || rBActive) { 73 float levelB = clamp(params[LEVEL_B_PARAM].getValue(), 0.0f, 1.0f); 74 levelB = 1.0f - levelB; 75 levelB *= Amplifier::minDecibels; 76 _returnBAmp.setLevel(_returnBSL.next(levelB)); 77 if (lBActive) { 78 to->returnB[0] = _returnBAmp.next(inputs[L_B_INPUT].getVoltage()); 79 } 80 else { 81 to->returnB[0] = 0.0f; 82 } 83 if (rBActive) { 84 to->returnB[1] = _returnBAmp.next(inputs[R_B_INPUT].getVoltage()); 85 } 86 else { 87 to->returnB[1] = to->returnB[0]; 88 } 89 } 90 } 91 92 struct Mix4xWidget : BGModuleWidget { 93 static constexpr int hp = 15; 94 95 Mix4xWidget(Mix4x* module) { 96 setModule(module); 97 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 98 setPanel(box.size, "Mix4x"); 99 createScrews(); 100 101 // generated by svg_widgets.rb 102 auto low1ParamPosition = Vec(18.5, 43.0); 103 auto mid1ParamPosition = Vec(18.5, 89.0); 104 auto high1ParamPosition = Vec(18.5, 135.0); 105 auto a1ParamPosition = Vec(18.5, 180.0); 106 auto preA1ParamPosition = Vec(30.0, 208.0); 107 auto b1ParamPosition = Vec(18.5, 236.0); 108 auto preB1ParamPosition = Vec(30.0, 264.0); 109 auto low2ParamPosition = Vec(61.5, 43.0); 110 auto mid2ParamPosition = Vec(61.5, 89.0); 111 auto high2ParamPosition = Vec(61.5, 135.0); 112 auto a2ParamPosition = Vec(61.5, 180.0); 113 auto preA2ParamPosition = Vec(73.0, 208.0); 114 auto b2ParamPosition = Vec(61.5, 236.0); 115 auto preB2ParamPosition = Vec(73.0, 264.0); 116 auto low3ParamPosition = Vec(104.5, 43.0); 117 auto mid3ParamPosition = Vec(104.5, 89.0); 118 auto high3ParamPosition = Vec(104.5, 135.0); 119 auto a3ParamPosition = Vec(104.5, 180.0); 120 auto preA3ParamPosition = Vec(116.0, 208.0); 121 auto b3ParamPosition = Vec(104.5, 236.0); 122 auto preB3ParamPosition = Vec(116.0, 264.0); 123 auto low4ParamPosition = Vec(147.5, 43.0); 124 auto mid4ParamPosition = Vec(147.5, 89.0); 125 auto high4ParamPosition = Vec(147.5, 135.0); 126 auto a4ParamPosition = Vec(147.5, 180.0); 127 auto preA4ParamPosition = Vec(159.0, 208.0); 128 auto b4ParamPosition = Vec(147.5, 236.0); 129 auto preB4ParamPosition = Vec(159.0, 264.0); 130 auto levelAParamPosition = Vec(190.5, 138.0); 131 auto levelBParamPosition = Vec(190.5, 328.0); 132 133 auto a1InputPosition = Vec(14.5, 290.0); 134 auto b1InputPosition = Vec(14.5, 325.0); 135 auto a2InputPosition = Vec(57.5, 290.0); 136 auto b2InputPosition = Vec(57.5, 325.0); 137 auto a3InputPosition = Vec(100.5, 290.0); 138 auto b3InputPosition = Vec(100.5, 325.0); 139 auto a4InputPosition = Vec(143.5, 290.0); 140 auto b4InputPosition = Vec(143.5, 325.0); 141 auto lAInputPosition = Vec(186.5, 62.0); 142 auto rAInputPosition = Vec(186.5, 97.0); 143 auto levelAInputPosition = Vec(186.5, 170.0); 144 auto lBInputPosition = Vec(186.5, 252.0); 145 auto rBInputPosition = Vec(186.5, 287.0); 146 147 auto sendAOutputPosition = Vec(186.5, 24.0); 148 auto sendBOutputPosition = Vec(186.5, 214.0); 149 // end generated by svg_widgets.rb 150 151 addParam(createParam<Knob16>(low1ParamPosition, module, Mix4x::LOW1_PARAM)); 152 addParam(createParam<Knob16>(mid1ParamPosition, module, Mix4x::MID1_PARAM)); 153 addParam(createParam<Knob16>(high1ParamPosition, module, Mix4x::HIGH1_PARAM)); 154 addParam(createParam<Knob16>(a1ParamPosition, module, Mix4x::A1_PARAM)); 155 addParam(createParam<IndicatorButtonGreen9>(preA1ParamPosition, module, Mix4x::PRE_A1_PARAM)); 156 addParam(createParam<Knob16>(b1ParamPosition, module, Mix4x::B1_PARAM)); 157 addParam(createParam<IndicatorButtonGreen9>(preB1ParamPosition, module, Mix4x::PRE_B1_PARAM)); 158 addParam(createParam<Knob16>(low2ParamPosition, module, Mix4x::LOW2_PARAM)); 159 addParam(createParam<Knob16>(mid2ParamPosition, module, Mix4x::MID2_PARAM)); 160 addParam(createParam<Knob16>(high2ParamPosition, module, Mix4x::HIGH2_PARAM)); 161 addParam(createParam<Knob16>(a2ParamPosition, module, Mix4x::A2_PARAM)); 162 addParam(createParam<IndicatorButtonGreen9>(preA2ParamPosition, module, Mix4x::PRE_A2_PARAM)); 163 addParam(createParam<Knob16>(b2ParamPosition, module, Mix4x::B2_PARAM)); 164 addParam(createParam<IndicatorButtonGreen9>(preB2ParamPosition, module, Mix4x::PRE_B2_PARAM)); 165 addParam(createParam<Knob16>(low3ParamPosition, module, Mix4x::LOW3_PARAM)); 166 addParam(createParam<Knob16>(mid3ParamPosition, module, Mix4x::MID3_PARAM)); 167 addParam(createParam<Knob16>(high3ParamPosition, module, Mix4x::HIGH3_PARAM)); 168 addParam(createParam<Knob16>(a3ParamPosition, module, Mix4x::A3_PARAM)); 169 addParam(createParam<IndicatorButtonGreen9>(preA3ParamPosition, module, Mix4x::PRE_A3_PARAM)); 170 addParam(createParam<Knob16>(b3ParamPosition, module, Mix4x::B3_PARAM)); 171 addParam(createParam<IndicatorButtonGreen9>(preB3ParamPosition, module, Mix4x::PRE_B3_PARAM)); 172 addParam(createParam<Knob16>(low4ParamPosition, module, Mix4x::LOW4_PARAM)); 173 addParam(createParam<Knob16>(mid4ParamPosition, module, Mix4x::MID4_PARAM)); 174 addParam(createParam<Knob16>(high4ParamPosition, module, Mix4x::HIGH4_PARAM)); 175 addParam(createParam<Knob16>(a4ParamPosition, module, Mix4x::A4_PARAM)); 176 addParam(createParam<IndicatorButtonGreen9>(preA4ParamPosition, module, Mix4x::PRE_A4_PARAM)); 177 addParam(createParam<Knob16>(b4ParamPosition, module, Mix4x::B4_PARAM)); 178 addParam(createParam<IndicatorButtonGreen9>(preB4ParamPosition, module, Mix4x::PRE_B4_PARAM)); 179 addParam(createParam<Knob16>(levelAParamPosition, module, Mix4x::LEVEL_A_PARAM)); 180 addParam(createParam<Knob16>(levelBParamPosition, module, Mix4x::LEVEL_B_PARAM)); 181 182 addInput(createInput<Port24>(a1InputPosition, module, Mix4x::A1_INPUT)); 183 addInput(createInput<Port24>(b1InputPosition, module, Mix4x::B1_INPUT)); 184 addInput(createInput<Port24>(a2InputPosition, module, Mix4x::A2_INPUT)); 185 addInput(createInput<Port24>(b2InputPosition, module, Mix4x::B2_INPUT)); 186 addInput(createInput<Port24>(a3InputPosition, module, Mix4x::A3_INPUT)); 187 addInput(createInput<Port24>(b3InputPosition, module, Mix4x::B3_INPUT)); 188 addInput(createInput<Port24>(a4InputPosition, module, Mix4x::A4_INPUT)); 189 addInput(createInput<Port24>(b4InputPosition, module, Mix4x::B4_INPUT)); 190 addInput(createInput<Port24>(lAInputPosition, module, Mix4x::L_A_INPUT)); 191 addInput(createInput<Port24>(rAInputPosition, module, Mix4x::R_A_INPUT)); 192 addInput(createInput<Port24>(levelAInputPosition, module, Mix4x::LEVEL_A_INPUT)); 193 addInput(createInput<Port24>(lBInputPosition, module, Mix4x::L_B_INPUT)); 194 addInput(createInput<Port24>(rBInputPosition, module, Mix4x::R_B_INPUT)); 195 196 addOutput(createOutput<Port24>(sendAOutputPosition, module, Mix4x::SEND_A_OUTPUT)); 197 addOutput(createOutput<Port24>(sendBOutputPosition, module, Mix4x::SEND_B_OUTPUT)); 198 } 199 }; 200 201 Model* modelMix4x = createModel<Mix4x, Mix4xWidget>("Bogaudio-Mix4x", "MIX4X", "Expander for MIX4, adds EQs and sends", "Mixer", "Expander");