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.

99 lines
3.0KB

  1. #include "Template.hpp"
  2. namespace rack_plugin_PG_Instruments {
  3. #define NUM_PANNERS 4
  4. #define LEFT_MARGIN 20
  5. #define TOP_MARGIN 100
  6. #define SPACING 36
  7. struct PGQuadPanner : Module
  8. {
  9. enum ParamIds
  10. {
  11. ENUMS(LEVEL_PARAM, NUM_PANNERS),
  12. ENUMS(PAN_PARAM, NUM_PANNERS),
  13. NUM_PARAMS
  14. };
  15. enum InputIds
  16. {
  17. ENUMS(INPUT, NUM_PANNERS),
  18. NUM_INPUTS
  19. };
  20. enum OutputIds
  21. {
  22. LEFT_OUTPUT,
  23. RIGHT_OUTPUT,
  24. NUM_OUTPUTS
  25. };
  26. //float panning[NUM_PANNERS] = { 0.5f, 0.5f, 0.5f, 0.5f };
  27. PGQuadPanner() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, 0)
  28. {
  29. }
  30. void step() override
  31. {
  32. float left = 0.0f;
  33. float right = 0.0f;
  34. for(int i = 0; i < NUM_PANNERS; i++)
  35. {
  36. float input = inputs[INPUT + i].value;
  37. float panning = params[PAN_PARAM + i].value;
  38. float level = params[LEVEL_PARAM + i].value;
  39. float l, r;
  40. pan(input, panning, level, l, r);
  41. left += l;
  42. right += r;
  43. }
  44. outputs[LEFT_OUTPUT].value = left;
  45. outputs[RIGHT_OUTPUT].value = right;
  46. }
  47. void pan(float input, float panning, float level, float &left, float &right)
  48. {
  49. left = cosf(panning * M_PI / 2.0f) * input * level;
  50. right = sinf(panning * M_PI / 2.0f) * input * level;
  51. }
  52. };
  53. struct PGQuadPannerWidget : ModuleWidget
  54. {
  55. PGQuadPannerWidget(PGQuadPanner *module) : ModuleWidget(module)
  56. {
  57. setPanel(SVG::load(assetPlugin(plugin, "res/PGQuadPanner.svg")));
  58. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  59. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  60. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  61. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  62. for(int i = 0; i < NUM_PANNERS; i++)
  63. {
  64. addInput(Port::create<PJ301MPort>(Vec(LEFT_MARGIN, TOP_MARGIN + SPACING * i), Port::INPUT, module, PGQuadPanner::INPUT + i));
  65. addParam(ParamWidget::create<RoundBlackKnob>(Vec(LEFT_MARGIN + 40, TOP_MARGIN + SPACING * i), module, PGQuadPanner::PAN_PARAM + i, 0.0f, 1.0, 0.5f));
  66. addParam(ParamWidget::create<RoundBlackKnob>(Vec(LEFT_MARGIN + 80, TOP_MARGIN + SPACING * i), module, PGQuadPanner::LEVEL_PARAM + i, 0.0f, 1.0f, 0.7f));
  67. }
  68. addOutput(Port::create<PJ301MPort>(Vec(LEFT_MARGIN + 120, TOP_MARGIN + SPACING), Port::OUTPUT, module, PGQuadPanner::LEFT_OUTPUT));
  69. addOutput(Port::create<PJ301MPort>(Vec(LEFT_MARGIN + 120, TOP_MARGIN + SPACING * 2), Port::OUTPUT, module, PGQuadPanner::RIGHT_OUTPUT));
  70. }
  71. };
  72. } // namespace rack_plugin_PG_Instruments
  73. using namespace rack_plugin_PG_Instruments;
  74. RACK_PLUGIN_MODEL_INIT(PG_Instruments, PGQuadPanner) {
  75. Model *modelPGQuadPanner = Model::create<PGQuadPanner, PGQuadPannerWidget>("PG-Instruments", "PGQuadPanner", "PG Quad Panner", ATTENUATOR_TAG);
  76. return modelPGQuadPanner;
  77. }