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.

97 lines
2.7KB

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