BogaudioModules

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

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