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.

78 lines
2.2KB

  1. #include "RJModules.hpp"
  2. #include <iostream>
  3. #include <cmath>
  4. namespace rack_plugin_RJModules {
  5. struct Panner: Module {
  6. enum ParamIds {
  7. CH1_PARAM,
  8. CH2_PARAM,
  9. NUM_PARAMS
  10. };
  11. enum InputIds {
  12. CH1_INPUT,
  13. CH1_CV_INPUT,
  14. NUM_INPUTS
  15. };
  16. enum OutputIds {
  17. CH1_OUTPUT,
  18. CH2_OUTPUT,
  19. NUM_OUTPUTS
  20. };
  21. Panner() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  22. void step() override;
  23. };
  24. void Panner::step() {
  25. float ch1 = inputs[CH1_INPUT].value;
  26. float combined_input = params[CH1_PARAM].value * clamp(inputs[CH1_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  27. float left_percent = combined_input;
  28. float right_percent = 1 - combined_input;
  29. outputs[CH2_OUTPUT].value = ch1 * left_percent;
  30. outputs[CH1_OUTPUT].value = ch1 * right_percent;
  31. }
  32. struct PannerWidget: ModuleWidget {
  33. PannerWidget(Panner *module);
  34. };
  35. PannerWidget::PannerWidget(Panner *module) : ModuleWidget(module) {
  36. box.size = Vec(15*10, 380);
  37. {
  38. SVGPanel *panel = new SVGPanel();
  39. panel->box.size = box.size;
  40. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Panner.svg")));
  41. addChild(panel);
  42. }
  43. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  44. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  45. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  46. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  47. addParam(ParamWidget::create<RoundBlackKnob>(Vec(57, 139), module, Panner::CH1_PARAM, 0.0, 1.0, 0.0));
  48. addInput(Port::create<PJ301MPort>(Vec(22, 129), Port::INPUT, module, Panner::CH1_INPUT));
  49. addInput(Port::create<PJ301MPort>(Vec(22, 160), Port::INPUT, module, Panner::CH1_CV_INPUT));
  50. addOutput(Port::create<PJ301MPort>(Vec(110, 125), Port::OUTPUT, module, Panner::CH1_OUTPUT));
  51. addOutput(Port::create<PJ301MPort>(Vec(110, 175), Port::OUTPUT, module, Panner::CH2_OUTPUT));
  52. }
  53. } // namespace rack_plugin_RJModules
  54. using namespace rack_plugin_RJModules;
  55. RACK_PLUGIN_MODEL_INIT(RJModules, Panner) {
  56. Model *modelPanner = Model::create<Panner, PannerWidget>("RJModules", "Panner", "[MIX] Panner", PANNING_TAG);
  57. return modelPanner;
  58. }