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