BogaudioModules

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

Pan.cpp (2763B)


      1 
      2 #include "Pan.hpp"
      3 #include "mixer.hpp"
      4 
      5 void Pan::sampleRateChange() {
      6 	float sr = APP->engine->getSampleRate();
      7 	for (int c = 0; c < maxChannels; ++c) {
      8 		_slew1[c].setParams(sr, MIXER_PAN_SLEW_MS, 2.0f);
      9 		_slew2[c].setParams(sr, MIXER_PAN_SLEW_MS, 2.0f);
     10 	}
     11 }
     12 
     13 bool Pan::active() {
     14 	return (inputs[IN1_INPUT].isConnected() || inputs[IN2_INPUT].isConnected()) && (outputs[L_OUTPUT].isConnected() || outputs[R_OUTPUT].isConnected());
     15 }
     16 
     17 int Pan::channels() {
     18 	return inputs[IN1_INPUT].getChannels();
     19 }
     20 
     21 void Pan::processChannel(const ProcessArgs& args, int c) {
     22 	float pan = params[PAN1_PARAM].getValue();
     23 	if (inputs[CV1_INPUT].isConnected()) {
     24 		pan *= clamp(inputs[CV1_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
     25 	}
     26 	_panner1[c].setPan(_slew1[c].next(pan));
     27 
     28 	pan = params[PAN2_PARAM].getValue();
     29 	if (inputs[CV2_INPUT].isConnected()) {
     30 		pan *= clamp(inputs[CV2_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
     31 	}
     32 	_panner2[c].setPan(_slew2[c].next(pan));
     33 
     34 	float l1 = 0.0f, r1 = 0.0f;
     35 	_panner1[c].next(inputs[IN1_INPUT].getPolyVoltage(c), l1, r1);
     36 	float l2 = 0.0f, r2 = 0.0f;
     37 	_panner2[c].next(inputs[IN2_INPUT].getPolyVoltage(c), l2, r2);
     38 	outputs[L_OUTPUT].setChannels(_channels);
     39 	outputs[L_OUTPUT].setVoltage(_saturatorLeft[c].next(l1 + l2), c);
     40 	outputs[R_OUTPUT].setChannels(_channels);
     41 	outputs[R_OUTPUT].setVoltage(_saturatorRight[c].next(r1 + r2), c);
     42 }
     43 
     44 struct PanWidget : BGModuleWidget {
     45 	static constexpr int hp = 3;
     46 
     47 	PanWidget(Pan* module) {
     48 		setModule(module);
     49 		box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
     50 		setPanel(box.size, "Pan");
     51 		createScrews();
     52 
     53 		// generated by svg_widgets.rb
     54 		auto pan1ParamPosition = Vec(9.5, 24.5);
     55 		auto pan2ParamPosition = Vec(9.5, 147.5);
     56 
     57 		auto cv1InputPosition = Vec(10.5, 62.0);
     58 		auto in1InputPosition = Vec(10.5, 97.0);
     59 		auto cv2InputPosition = Vec(10.5, 185.0);
     60 		auto in2InputPosition = Vec(10.5, 220.0);
     61 
     62 		auto lOutputPosition = Vec(10.5, 268.0);
     63 		auto rOutputPosition = Vec(10.5, 303.0);
     64 		// end generated by svg_widgets.rb
     65 
     66 		addParam(createParam<Knob26>(pan1ParamPosition, module, Pan::PAN1_PARAM));
     67 		addParam(createParam<Knob26>(pan2ParamPosition, module, Pan::PAN2_PARAM));
     68 
     69 		addInput(createInput<Port24>(cv1InputPosition, module, Pan::CV1_INPUT));
     70 		addInput(createInput<Port24>(in1InputPosition, module, Pan::IN1_INPUT));
     71 		addInput(createInput<Port24>(cv2InputPosition, module, Pan::CV2_INPUT));
     72 		addInput(createInput<Port24>(in2InputPosition, module, Pan::IN2_INPUT));
     73 
     74 		addOutput(createOutput<Port24>(lOutputPosition, module, Pan::L_OUTPUT));
     75 		addOutput(createOutput<Port24>(rOutputPosition, module, Pan::R_OUTPUT));
     76 	}
     77 };
     78 
     79 Model* modelPan = bogaudio::createModel<Pan, PanWidget>("Bogaudio-Pan", "PAN", "Dual stereo panner", "Panning", "Dual", "Polyphonic");