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.

158 lines
3.6KB

  1. #include "ML_modules.hpp"
  2. #include "../freeverb/revmodel.hpp"
  3. #include "dsp/digital.hpp"
  4. namespace rack_plugin_ML_modules {
  5. struct FreeVerb : Module {
  6. enum ParamIds {
  7. ROOMSIZE_PARAM,
  8. DAMP_PARAM,
  9. FREEZE_PARAM,
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. IN_INPUT,
  14. ROOMSIZE_INPUT,
  15. DAMP_INPUT,
  16. FREEZE_INPUT,
  17. NUM_INPUTS
  18. };
  19. enum OutputIds {
  20. OUT1_OUTPUT,
  21. OUT2_OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. enum LighIds {
  25. FREEZE_LIGHT,
  26. NUM_LIGHTS
  27. };
  28. revmodel reverb;
  29. float roomsize, damp;
  30. bool freeze=false;
  31. SchmittTrigger buttonTrigger;
  32. FreeVerb() : Module( NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS ) {
  33. float gSampleRate = engineGetSampleRate();
  34. reverb.init(gSampleRate);
  35. };
  36. void step() override;
  37. void onSampleRateChange() override;
  38. };
  39. void FreeVerb::onSampleRateChange() {
  40. float gSampleRate = engineGetSampleRate();
  41. reverb.init(gSampleRate);
  42. reverb.setdamp(damp);
  43. reverb.setroomsize(roomsize);
  44. };
  45. void FreeVerb::step() {
  46. float out1, out2;
  47. out1 = out2 = 0.0;
  48. float old_roomsize = roomsize;
  49. float old_damp = damp;
  50. bool old_freeze = freeze;
  51. float input = clamp(inputs[IN_INPUT].value,-10.0f,10.0f);
  52. if(inputs[ROOMSIZE_INPUT].active) {
  53. roomsize = clamp(inputs[ROOMSIZE_INPUT].value/8.0f, 0.0f, 1.0f);
  54. } else {
  55. roomsize = params[ROOMSIZE_PARAM].value;
  56. };
  57. if(inputs[DAMP_INPUT].active) {
  58. damp = clamp(inputs[DAMP_INPUT].value/8.0f, 0.0f, 1.0f);
  59. } else {
  60. damp = params[DAMP_PARAM].value;
  61. };
  62. if(inputs[FREEZE_INPUT].active) {
  63. freeze = inputs[FREEZE_INPUT].value > 1.0;
  64. } else {
  65. if(buttonTrigger.process(params[FREEZE_PARAM].value)) freeze = !freeze;
  66. };
  67. if( old_damp != damp ) reverb.setdamp(damp);
  68. if( old_roomsize != roomsize) reverb.setroomsize(roomsize);
  69. lights[FREEZE_LIGHT].value = freeze?10.0:0.0;
  70. if(freeze != old_freeze) reverb.setmode(freeze?1.0:0.0);
  71. reverb.process(input, out1, out2);
  72. outputs[OUT1_OUTPUT].value = out1;
  73. outputs[OUT2_OUTPUT].value = out2;
  74. };
  75. struct FreeVerbWidget : ModuleWidget {
  76. FreeVerbWidget(FreeVerb *module);
  77. };
  78. FreeVerbWidget::FreeVerbWidget(FreeVerb *module) : ModuleWidget(module) {
  79. box.size = Vec(15*6, 380);
  80. {
  81. SVGPanel *panel = new SVGPanel();
  82. panel->box.size = box.size;
  83. panel->setBackground(SVG::load(assetPlugin(plugin,"res/FreeVerb.svg")));
  84. addChild(panel);
  85. }
  86. addChild(Widget::create<MLScrew>(Vec(15, 0)));
  87. addChild(Widget::create<MLScrew>(Vec(15, 365)));
  88. addInput(Port::create<MLPort>(Vec(33, 50), Port::INPUT, module, FreeVerb::IN_INPUT));
  89. addInput(Port::create<MLPort>(Vec(53, 120), Port::INPUT, module, FreeVerb::ROOMSIZE_INPUT));
  90. addInput(Port::create<MLPort>(Vec(53, 183), Port::INPUT, module, FreeVerb::DAMP_INPUT));
  91. addInput(Port::create<MLPort>(Vec(53, 246), Port::INPUT, module, FreeVerb::FREEZE_INPUT));
  92. addParam(ParamWidget::create<SmallBlueMLKnob>(Vec(10, 122), module, FreeVerb::ROOMSIZE_PARAM, 0.0, 1.0, 0.5));
  93. addParam(ParamWidget::create<SmallBlueMLKnob>(Vec(10, 186), module, FreeVerb::DAMP_PARAM, 0.0, 1.0, 0.5));
  94. addParam(ParamWidget::create<ML_MediumLEDButton>(Vec(14, 250), module, FreeVerb::FREEZE_PARAM, 0.0, 10.0, 0.0));
  95. addChild(ModuleLightWidget::create<MLMediumLight<GreenLight>>(Vec(18,254), module, FreeVerb::FREEZE_LIGHT));
  96. addOutput(Port::create<MLPort>(Vec(11, 313), Port::OUTPUT, module, FreeVerb::OUT1_OUTPUT));
  97. addOutput(Port::create<MLPort>(Vec(55, 313), Port::OUTPUT, module, FreeVerb::OUT2_OUTPUT));
  98. }
  99. } // namespace rack_plugin_ML_modules
  100. using namespace rack_plugin_ML_modules;
  101. RACK_PLUGIN_MODEL_INIT(ML_modules, FreeVerb) {
  102. Model *modelFreeVerb = Model::create<FreeVerb, FreeVerbWidget>("ML modules", "FreeVerb", "FreeVerb", REVERB_TAG);
  103. return modelFreeVerb;
  104. }