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.

93 lines
2.3KB

  1. #include "Template.hpp"
  2. namespace rack_plugin_PG_Instruments {
  3. struct PGPanner : Module
  4. {
  5. enum ParamIds
  6. {
  7. PAN_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds
  11. {
  12. INPUT,
  13. PAN_INPUT,
  14. NUM_INPUTS
  15. };
  16. enum OutputIds
  17. {
  18. LEFT_OUTPUT,
  19. RIGHT_OUTPUT,
  20. NUM_OUTPUTS
  21. };
  22. enum LightIds
  23. {
  24. RUNNING_LIGHT,
  25. NUM_LIGHTS
  26. };
  27. float panning = 0.5f;
  28. PGPanner() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  29. {
  30. onReset();
  31. }
  32. void onReset() override
  33. {
  34. }
  35. void onRandomize() override
  36. {
  37. }
  38. void step() override
  39. {
  40. panning = params[PAN_PARAM].value;
  41. float mono = inputs[INPUT].value;
  42. float panInput = inputs[PAN_INPUT].value;
  43. float pan = panning + panInput;
  44. float leftGain = cosf(pan * M_PI / 2.0f) * mono;
  45. float rightGain = sinf(pan * M_PI / 2.0f) * mono;
  46. outputs[LEFT_OUTPUT].value = leftGain;
  47. outputs[RIGHT_OUTPUT].value = rightGain;
  48. }
  49. };
  50. struct PGPannerWidget : ModuleWidget
  51. {
  52. PGPannerWidget(PGPanner *module) : ModuleWidget(module)
  53. {
  54. setPanel(SVG::load(assetPlugin(plugin, "res/PGPanner.svg")));
  55. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  56. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  57. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  58. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  59. addParam(ParamWidget::create<RoundLargeBlackKnob>(Vec(20, 40), module, PGPanner::PAN_PARAM, 0.0f, 1.0, 0.5f));
  60. addInput(Port::create<PJ301MPort>(Vec(26, 100), Port::INPUT, module, PGPanner::INPUT));
  61. addInput(Port::create<PJ301MPort>(Vec(26, 160), Port::INPUT, module, PGPanner::PAN_INPUT));
  62. addOutput(Port::create<PJ301MPort>(Vec(12, 220), Port::OUTPUT, module, PGPanner::LEFT_OUTPUT));
  63. addOutput(Port::create<PJ301MPort>(Vec(42, 220), Port::OUTPUT, module, PGPanner::RIGHT_OUTPUT));
  64. }
  65. };
  66. } // namespace rack_plugin_PG_Instruments
  67. using namespace rack_plugin_PG_Instruments;
  68. RACK_PLUGIN_MODEL_INIT(PG_Instruments, PGPanner) {
  69. Model *modelPGPanner = Model::create<PGPanner, PGPannerWidget>("PG-Instruments", "PGPanner", "PG Panner", ATTENUATOR_TAG);
  70. return modelPGPanner;
  71. }