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.

98 lines
2.7KB

  1. #include "LindenbergResearch.hpp"
  2. namespace rack_plugin_LindenbergResearch {
  3. using namespace lrt;
  4. struct ReShaper : Module {
  5. enum ParamIds {
  6. RESHAPER_AMOUNT,
  7. RESHAPER_CV_AMOUNT,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. RESHAPER_INPUT,
  12. RESHAPER_CV_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. RESHAPER_OUTPUT,
  17. NUM_OUTPUTS
  18. };
  19. enum LightIds {
  20. NUM_LIGHTS
  21. };
  22. ReShaper() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  23. void step() override;
  24. };
  25. void ReShaper::step() {
  26. // normalize signal input to [-1.0...+1.0]
  27. float x = clamp(inputs[RESHAPER_INPUT].value * 0.1f, -1.f, 1.f);
  28. float cv = inputs[RESHAPER_CV_INPUT].value * params[RESHAPER_CV_AMOUNT].value;
  29. float a = clamp(params[RESHAPER_AMOUNT].value + cv, 1.f, 50.f);
  30. // do the acid!
  31. float out = x * (fabs(x) + a) / (x * x + (a - 1) * fabs(x) + 1);
  32. outputs[RESHAPER_OUTPUT].value = out * 5.0f;
  33. }
  34. /**
  35. * @brief Reshaper Panel
  36. */
  37. struct ReShaperWidget : LRModuleWidget {
  38. ReShaperWidget(ReShaper *module);
  39. };
  40. ReShaperWidget::ReShaperWidget(ReShaper *module) : LRModuleWidget(module) {
  41. // setPanel(SVG::load(assetPlugin(plugin, "res/ReShaper.svg")));
  42. panel = new LRPanel();
  43. panel->setBackground(SVG::load(assetPlugin(plugin, "res/ReShaper.svg")));
  44. addChild(panel);
  45. box.size = panel->box.size;
  46. // ***** SCREWS **********
  47. addChild(Widget::create<ScrewDarkA>(Vec(15, 1)));
  48. addChild(Widget::create<ScrewDarkA>(Vec(box.size.x - 30, 1)));
  49. addChild(Widget::create<ScrewDarkA>(Vec(15, 366)));
  50. addChild(Widget::create<ScrewDarkA>(Vec(box.size.x - 30, 366)));
  51. // ***** SCREWS **********
  52. // ***** MAIN KNOBS ******
  53. addParam(ParamWidget::create<LRBigKnob>(Vec(32, 216), module, ReShaper::RESHAPER_AMOUNT, 1.f, 50.f, 1.f));
  54. addParam(ParamWidget::create<LRSmallKnob>(Vec(48, 126), module, ReShaper::RESHAPER_CV_AMOUNT, 0.f, 5.f, 0.f));
  55. // ***** MAIN KNOBS ******
  56. // ***** INPUTS **********
  57. addInput(Port::create<LRIOPort>(Vec(21, 60), Port::INPUT, module, ReShaper::RESHAPER_INPUT));
  58. addInput(Port::create<LRIOPort>(Vec(71, 60), Port::INPUT, module, ReShaper::RESHAPER_CV_INPUT));
  59. // ***** INPUTS **********
  60. // ***** OUTPUTS *********
  61. addOutput(Port::create<LRIOPort>(Vec(46, 320), Port::OUTPUT, module, ReShaper::RESHAPER_OUTPUT));
  62. // ***** OUTPUTS *********
  63. }
  64. } // namespace rack_plugin_LindenbergResearch
  65. using namespace rack_plugin_LindenbergResearch;
  66. RACK_PLUGIN_MODEL_INIT(LindenbergResearch, ReShaper) {
  67. Model *modelReShaper = Model::create<ReShaper, ReShaperWidget>("Lindenberg Research", "ReShaper", "ReShaper Wavefolder", WAVESHAPER_TAG);
  68. return modelReShaper;
  69. }