VCM.cpp (4018B)
1 2 #include "VCM.hpp" 3 4 bool VCM::LevelParamQuantity::isLinear() { 5 return dynamic_cast<VCM*>(module)->isLinear(); 6 } 7 8 bool VCM::active() { 9 return outputs[MIX_OUTPUT].isConnected(); 10 } 11 12 int VCM::channels() { 13 return inputs[IN1_INPUT].getChannels(); 14 } 15 16 void VCM::processChannel(const ProcessArgs& args, int c) { 17 bool linear = isLinear(); 18 float out = channelStep(c, inputs[IN1_INPUT], params[LEVEL1_PARAM], inputs[CV1_INPUT], _amplifier1[c], linear); 19 out += channelStep(c, inputs[IN2_INPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT], _amplifier2[c], linear); 20 out += channelStep(c, inputs[IN3_INPUT], params[LEVEL3_PARAM], inputs[CV3_INPUT], _amplifier3[c], linear); 21 out += channelStep(c, inputs[IN4_INPUT], params[LEVEL4_PARAM], inputs[CV4_INPUT], _amplifier4[c], linear); 22 float level = params[MIX_PARAM].getValue(); 23 if (inputs[MIX_CV_INPUT].isConnected()) { 24 level *= clamp(inputs[MIX_CV_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); 25 } 26 out *= level; 27 if (!_disableOutputLimit) { 28 out = clamp(out, -12.0f, 12.0f); 29 } 30 outputs[MIX_OUTPUT].setChannels(_channels); 31 outputs[MIX_OUTPUT].setVoltage(level * out, c); 32 } 33 34 float VCM::channelStep(int c, Input& input, Param& knob, Input& cv, Amplifier& amplifier, bool linear) { 35 if (!input.isConnected()) { 36 return 0.0f; 37 } 38 float level = knob.getValue(); 39 if (cv.isConnected()) { 40 level *= clamp(cv.getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); 41 } 42 if (linear) { 43 return level * input.getPolyVoltage(c); 44 } 45 level = 1.0f - level; 46 level *= Amplifier::minDecibels; 47 amplifier.setLevel(level); 48 return amplifier.next(input.getPolyVoltage(c)); 49 } 50 51 struct VCMWidget : DisableOutputLimitModuleWidget { 52 static constexpr int hp = 10; 53 54 VCMWidget(VCM* module) { 55 setModule(module); 56 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 57 setPanel(box.size, "VCM"); 58 createScrews(); 59 60 // generated by svg_widgets.rb 61 auto level1ParamPosition = Vec(89.5, 35.5); 62 auto level2ParamPosition = Vec(89.5, 99.5); 63 auto level3ParamPosition = Vec(89.5, 163.5); 64 auto level4ParamPosition = Vec(89.5, 228.5); 65 auto mixParamPosition = Vec(22.5, 293.5); 66 auto linearParamPosition = Vec(91.0, 342.7); 67 68 auto in1InputPosition = Vec(14.0, 37.0); 69 auto cv1InputPosition = Vec(45.0, 37.0); 70 auto in2InputPosition = Vec(14.0, 101.0); 71 auto cv2InputPosition = Vec(45.0, 101.0); 72 auto in3InputPosition = Vec(14.0, 165.0); 73 auto cv3InputPosition = Vec(45.0, 165.0); 74 auto in4InputPosition = Vec(14.0, 230.0); 75 auto cv4InputPosition = Vec(45.0, 230.0); 76 auto mixCvInputPosition = Vec(81.0, 294.0); 77 78 auto mixOutputPosition = Vec(112.0, 294.0); 79 // end generated by svg_widgets.rb 80 81 addParam(createParam<Knob38>(level1ParamPosition, module, VCM::LEVEL1_PARAM)); 82 addParam(createParam<Knob38>(level2ParamPosition, module, VCM::LEVEL2_PARAM)); 83 addParam(createParam<Knob38>(level3ParamPosition, module, VCM::LEVEL3_PARAM)); 84 addParam(createParam<Knob38>(level4ParamPosition, module, VCM::LEVEL4_PARAM)); 85 addParam(createParam<Knob38>(mixParamPosition, module, VCM::MIX_PARAM)); 86 addParam(createParam<IndicatorButtonGreen9>(linearParamPosition, module, VCM::LINEAR_PARAM)); 87 88 addInput(createInput<Port24>(in1InputPosition, module, VCM::IN1_INPUT)); 89 addInput(createInput<Port24>(cv1InputPosition, module, VCM::CV1_INPUT)); 90 addInput(createInput<Port24>(in2InputPosition, module, VCM::IN2_INPUT)); 91 addInput(createInput<Port24>(cv2InputPosition, module, VCM::CV2_INPUT)); 92 addInput(createInput<Port24>(in3InputPosition, module, VCM::IN3_INPUT)); 93 addInput(createInput<Port24>(cv3InputPosition, module, VCM::CV3_INPUT)); 94 addInput(createInput<Port24>(in4InputPosition, module, VCM::IN4_INPUT)); 95 addInput(createInput<Port24>(cv4InputPosition, module, VCM::CV4_INPUT)); 96 addInput(createInput<Port24>(mixCvInputPosition, module, VCM::MIX_CV_INPUT)); 97 98 addOutput(createOutput<Port24>(mixOutputPosition, module, VCM::MIX_OUTPUT)); 99 } 100 }; 101 102 Model* modelVCM = bogaudio::createModel<VCM, VCMWidget>("Bogaudio-VCM", "VCM", "4-channel CV controllable mixer", "Mixer", "Polyphonic");