You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.7KB

  1. #include "Pan.hpp"
  2. #include "mixer.hpp"
  3. void Pan::onSampleRateChange() {
  4. _slew1.setParams(engineGetSampleRate(), MixerChannel::panSlewTimeMS, 2.0f);
  5. _slew2.setParams(engineGetSampleRate(), MixerChannel::panSlewTimeMS, 2.0f);
  6. }
  7. void Pan::step() {
  8. if (!((inputs[IN1_INPUT].active || inputs[IN2_INPUT].active) && (outputs[L_OUTPUT].active || outputs[R_OUTPUT].active))) {
  9. return;
  10. }
  11. float pan = params[PAN1_PARAM].value;
  12. if (inputs[CV1_INPUT].active) {
  13. pan *= clamp(inputs[CV1_INPUT].value / 5.0f, -1.0f, 1.0f);
  14. }
  15. _panner1.setPan(_slew1.next(pan));
  16. pan = params[PAN2_PARAM].value;
  17. if (inputs[CV2_INPUT].active) {
  18. pan *= clamp(inputs[CV2_INPUT].value / 5.0f, -1.0f, 1.0f);
  19. }
  20. _panner2.setPan(_slew2.next(pan));
  21. float l1 = 0.0f, r1 = 0.0f;
  22. _panner1.next(inputs[IN1_INPUT].value, l1, r1);
  23. float l2 = 0.0f, r2 = 0.0f;
  24. _panner2.next(inputs[IN2_INPUT].value, l2, r2);
  25. outputs[L_OUTPUT].value = _saturatorLeft.next(l1 + l2);
  26. outputs[R_OUTPUT].value = _saturatorRight.next(r1 + r2);
  27. }
  28. struct PanWidget : ModuleWidget {
  29. static constexpr int hp = 3;
  30. PanWidget(Pan* module) : ModuleWidget(module) {
  31. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  32. {
  33. SVGPanel *panel = new SVGPanel();
  34. panel->box.size = box.size;
  35. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Pan.svg")));
  36. addChild(panel);
  37. }
  38. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  39. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  40. // generated by svg_widgets.rb
  41. auto pan1ParamPosition = Vec(9.5, 24.5);
  42. auto pan2ParamPosition = Vec(9.5, 147.5);
  43. auto cv1InputPosition = Vec(10.5, 62.0);
  44. auto in1InputPosition = Vec(10.5, 97.0);
  45. auto cv2InputPosition = Vec(10.5, 185.0);
  46. auto in2InputPosition = Vec(10.5, 220.0);
  47. auto lOutputPosition = Vec(10.5, 268.0);
  48. auto rOutputPosition = Vec(10.5, 303.0);
  49. // end generated by svg_widgets.rb
  50. addParam(ParamWidget::create<Knob26>(pan1ParamPosition, module, Pan::PAN1_PARAM, -1.0, 1.0, 0.0));
  51. addParam(ParamWidget::create<Knob26>(pan2ParamPosition, module, Pan::PAN2_PARAM, -1.0, 1.0, 0.0));
  52. addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, Pan::CV1_INPUT));
  53. addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, Pan::IN1_INPUT));
  54. addInput(Port::create<Port24>(cv2InputPosition, Port::INPUT, module, Pan::CV2_INPUT));
  55. addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, Pan::IN2_INPUT));
  56. addOutput(Port::create<Port24>(lOutputPosition, Port::OUTPUT, module, Pan::L_OUTPUT));
  57. addOutput(Port::create<Port24>(rOutputPosition, Port::OUTPUT, module, Pan::R_OUTPUT));
  58. }
  59. };
  60. RACK_PLUGIN_MODEL_INIT(Bogaudio, Pan) {
  61. Model *modelPan = createModel<Pan, PanWidget>("Bogaudio-Pan", "Pan", "dual panner", PANNING_TAG, DUAL_TAG);
  62. return modelPan;
  63. }