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.

128 lines
3.6KB

  1. #include "HetrickCV.hpp"
  2. namespace rack_plugin_HetrickCV {
  3. #ifdef USE_VST2
  4. #define plugin "HetrickCV"
  5. #endif // USE_VST2
  6. struct FlipPan : Module
  7. {
  8. enum ParamIds
  9. {
  10. AMOUNT_PARAM,
  11. SCALE_PARAM,
  12. STYLE_PARAM,
  13. NUM_PARAMS
  14. };
  15. enum InputIds
  16. {
  17. LEFT_INPUT,
  18. RIGHT_INPUT,
  19. AMOUNT_INPUT,
  20. NUM_INPUTS
  21. };
  22. enum OutputIds
  23. {
  24. LEFT_OUTPUT,
  25. RIGHT_OUTPUT,
  26. NUM_OUTPUTS
  27. };
  28. FlipPan() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS)
  29. {
  30. }
  31. void step() override;
  32. float paraPanShape(const float _input) const
  33. {
  34. return (4.0f - _input) * _input * 0.3333333f;
  35. }
  36. // For more advanced Module features, read Rack's engine.hpp header file
  37. // - toJson, fromJson: serialization of internal data
  38. // - onSampleRateChange: event triggered by a change of sample rate
  39. // - reset, randomize: implements special behavior when user clicks these from the context menu
  40. };
  41. void FlipPan::step()
  42. {
  43. float inL = inputs[LEFT_INPUT].value;
  44. float inR = inputs[RIGHT_INPUT].value;
  45. bool linear = (params[STYLE_PARAM].value == 0.0f);
  46. float pan = params[AMOUNT_PARAM].value + (inputs[AMOUNT_INPUT].value * params[SCALE_PARAM].value);
  47. pan = clampf(pan, 0.0f, 5.0f) * 0.2f;
  48. if(linear)
  49. {
  50. outputs[LEFT_OUTPUT].value = LERP(pan, inR, inL);
  51. outputs[RIGHT_OUTPUT].value = LERP(pan, inL, inR);
  52. }
  53. else
  54. {
  55. pan = (pan * 2.0f) - 1.0f;
  56. const float panL = paraPanShape(1.0f - pan);
  57. const float panR = paraPanShape(1.0f + pan);
  58. outputs[LEFT_OUTPUT].value = (inL * panL) + (inR * panR);
  59. outputs[RIGHT_OUTPUT].value = (inL * panR) + (inR * panL);
  60. }
  61. }
  62. struct CKSSRot : SVGSwitch, ToggleSwitch {
  63. CKSSRot() {
  64. addFrame(SVG::load(assetPlugin(plugin, "res/CKSS_rot_0.svg")));
  65. addFrame(SVG::load(assetPlugin(plugin, "res/CKSS_rot_1.svg")));
  66. sw->wrap();
  67. box.size = sw->box.size;
  68. }
  69. };
  70. struct FlipPanWidget : ModuleWidget { FlipPanWidget(FlipPan *module); };
  71. FlipPanWidget::FlipPanWidget(FlipPan *module) : ModuleWidget(module)
  72. {
  73. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  74. {
  75. auto *panel = new SVGPanel();
  76. panel->box.size = box.size;
  77. panel->setBackground(SVG::load(assetPlugin(plugin, "res/FlipPan.svg")));
  78. addChild(panel);
  79. }
  80. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  81. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  82. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  83. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  84. //////PARAMS//////
  85. addParam(ParamWidget::create<Davies1900hBlackKnob>(Vec(27, 62), module, FlipPan::AMOUNT_PARAM, 0.0, 5.0, 2.5));
  86. addParam(ParamWidget::create<Trimpot>(Vec(36, 112), module, FlipPan::SCALE_PARAM, -1.0, 1.0, 1.0));
  87. addParam(ParamWidget::create<CKSSRot>(Vec(35, 200), module, FlipPan::STYLE_PARAM, 0.0, 1.0, 0.0));
  88. //////INPUTS//////
  89. addInput(Port::create<PJ301MPort>(Vec(10, 235), Port::INPUT, module, FlipPan::LEFT_INPUT));
  90. addInput(Port::create<PJ301MPort>(Vec(55, 235), Port::INPUT, module, FlipPan::RIGHT_INPUT));
  91. addInput(Port::create<PJ301MPort>(Vec(33, 145), Port::INPUT, module, FlipPan::AMOUNT_INPUT));
  92. //////OUTPUTS//////
  93. addOutput(Port::create<PJ301MPort>(Vec(10, 285), Port::OUTPUT, module, FlipPan::LEFT_OUTPUT));
  94. addOutput(Port::create<PJ301MPort>(Vec(55, 285), Port::OUTPUT, module, FlipPan::RIGHT_OUTPUT));
  95. }
  96. } // namespace rack_plugin_HetrickCV
  97. using namespace rack_plugin_HetrickCV;
  98. RACK_PLUGIN_MODEL_INIT(HetrickCV, FlipPan) {
  99. Model *modelFlipPan = Model::create<FlipPan, FlipPanWidget>("HetrickCV", "FlipPan", "Flip Pan", PANNING_TAG);
  100. return modelFlipPan;
  101. }