BogaudioModules

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

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");