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.

148 lines
5.2KB

  1. #include "Bidoo.hpp"
  2. #include "BidooComponents.hpp"
  3. #include "dsp/ringbuffer.hpp"
  4. #include "dep/freeverb/revmodel.hpp"
  5. #include "dep/filters/smbPitchShift.hpp"
  6. #include "dsp/digital.hpp"
  7. using namespace std;
  8. namespace rack_plugin_Bidoo {
  9. struct DFUZE : Module {
  10. enum ParamIds {
  11. SIZE_PARAM,
  12. DAMP_PARAM,
  13. FREEZE_PARAM,
  14. WIDTH_PARAM,
  15. DRY_PARAM,
  16. WET_PARAM,
  17. SHIMM_PARAM,
  18. NUM_PARAMS
  19. };
  20. enum InputIds {
  21. IN_L_INPUT,
  22. IN_R_INPUT,
  23. SIZE_INPUT,
  24. DAMP_INPUT,
  25. FREEZE_INPUT,
  26. WIDTH_INPUT,
  27. SHIMM_INPUT,
  28. NUM_INPUTS
  29. };
  30. enum OutputIds {
  31. OUT_L_OUTPUT,
  32. OUT_R_OUTPUT,
  33. NUM_OUTPUTS
  34. };
  35. enum LightIds {
  36. NUM_LIGHTS
  37. };
  38. DoubleRingBuffer<float,4096> in_L_Buffer, in_R_Buffer;
  39. DoubleRingBuffer<float,4096> pin_L_Buffer, pin_R_Buffer;
  40. revmodel revprocessor;
  41. SchmittTrigger freezeTrigger;
  42. bool freeze = false;
  43. float sr = engineGetSampleRate();
  44. DFUZE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  45. }
  46. void step() override;
  47. };
  48. void DFUZE::step() {
  49. float outL = 0.0f, outR = 0.0f;
  50. float wOutL = 0.0f, wOutR = 0.0f;
  51. float inL = 0.0f, inR = 0.0f;
  52. // if (sr != engineGetSampleRate()) {
  53. // revprocessor.setsamplerate(engineGetSampleRate());
  54. // in_L_Buffer.clear();
  55. // in_R_Buffer.clear();
  56. // pin_L_Buffer.clear();
  57. // pin_R_Buffer.clear();
  58. // sr = engineGetSampleRate();
  59. // }
  60. revprocessor.setdamp(clamp(params[DAMP_PARAM].value+inputs[DAMP_INPUT].value,0.0f,1.0f));
  61. revprocessor.setroomsize(clamp(params[SIZE_PARAM].value+inputs[SIZE_INPUT].value,0.0f,1.0f));
  62. revprocessor.setwet(clamp(params[WET_PARAM].value,0.0f,1.0f));
  63. revprocessor.setdry(clamp(params[DRY_PARAM].value,0.0f,1.0f));
  64. revprocessor.setwidth(clamp(params[WIDTH_PARAM].value+inputs[WIDTH_INPUT].value,0.0f,1.0f));
  65. if (freezeTrigger.process(params[FREEZE_PARAM].value + inputs[FREEZE_INPUT].value )) freeze = !freeze;
  66. revprocessor.setmode(freeze?1.0:0.0);
  67. inL = inputs[IN_L_INPUT].value;
  68. inR = inputs[IN_R_INPUT].value;
  69. if (pin_L_Buffer.size()>0) {
  70. revprocessor.process(inL, inR, params[SHIMM_PARAM].value * (*pin_L_Buffer.startData()) * 5, clamp(params[SHIMM_PARAM].value+inputs[SHIMM_INPUT].value,0.0f,0.08f) * (*pin_R_Buffer.startData()) * 5, outL, outR, wOutL, wOutR);
  71. pin_L_Buffer.startIncr(1);
  72. pin_R_Buffer.startIncr(1);
  73. }
  74. else {
  75. revprocessor.process(inL, inR, 0.0f, 0.0f, outL, outR, wOutL, wOutR);
  76. }
  77. in_L_Buffer.push(wOutL/10);
  78. in_R_Buffer.push(wOutR/10);
  79. if (in_L_Buffer.full()) {
  80. smbPitchShift(2.0f, in_L_Buffer.size(), 2048, 4, engineGetSampleRate(), in_L_Buffer.startData(), pin_L_Buffer.endData());
  81. smbPitchShift(2.0f, in_R_Buffer.size(), 2048, 4, engineGetSampleRate(), in_R_Buffer.startData(), pin_R_Buffer.endData());
  82. pin_L_Buffer.endIncr(in_L_Buffer.size());
  83. pin_R_Buffer.endIncr(in_L_Buffer.size());
  84. in_L_Buffer.clear();
  85. in_R_Buffer.clear();
  86. }
  87. outputs[OUT_L_OUTPUT].value = outL;
  88. outputs[OUT_R_OUTPUT].value = outR;
  89. }
  90. struct DFUZEWidget : ModuleWidget {
  91. DFUZEWidget(DFUZE *module) : ModuleWidget(module) {
  92. setPanel(SVG::load(assetPlugin(plugin, "res/DFUZE.svg")));
  93. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  94. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  95. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  96. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  97. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 50), module, DFUZE::SIZE_PARAM, 0.0f, 1.0f, 0.5f));
  98. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 95), module, DFUZE::DAMP_PARAM, 0.0f, 1.0f, 0.5f));
  99. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 140), module, DFUZE::WIDTH_PARAM, 0.0f, 1.0f, 0.5f));
  100. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 185), module, DFUZE::DRY_PARAM, 0.0f, 1.0f, 0.0f));
  101. addParam(ParamWidget::create<BidooBlueKnob>(Vec(63, 185), module, DFUZE::WET_PARAM, 0.0f, 1.0f, 1.0f));
  102. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 230), module, DFUZE::SHIMM_PARAM, 0.0f, 0.08f, 0.0f));
  103. addParam(ParamWidget::create<BlueCKD6>(Vec(13, 276), module, DFUZE::FREEZE_PARAM, 0.0f, 10.0f, 0.0f));
  104. addInput(Port::create<PJ301MPort>(Vec(65.0f, 52.0f), Port::INPUT, module, DFUZE::SIZE_INPUT));
  105. addInput(Port::create<PJ301MPort>(Vec(65.0f, 97.0f), Port::INPUT, module, DFUZE::DAMP_INPUT));
  106. addInput(Port::create<PJ301MPort>(Vec(65.0f, 142.0f), Port::INPUT, module, DFUZE::WIDTH_INPUT));
  107. addInput(Port::create<PJ301MPort>(Vec(65.0f, 232.0f), Port::INPUT, module, DFUZE::SHIMM_INPUT));
  108. addInput(Port::create<PJ301MPort>(Vec(65.0f, 277.0f), Port::INPUT, module, DFUZE::FREEZE_INPUT));
  109. //Changed ports opposite way around
  110. addInput(Port::create<TinyPJ301MPort>(Vec(24.0f, 319.0f), Port::INPUT, module, DFUZE::IN_L_INPUT));
  111. addInput(Port::create<TinyPJ301MPort>(Vec(24.0f, 339.0f), Port::INPUT, module, DFUZE::IN_R_INPUT));
  112. addOutput(Port::create<TinyPJ301MPort>(Vec(78.0f, 319.0f),Port::OUTPUT, module, DFUZE::OUT_L_OUTPUT));
  113. addOutput(Port::create<TinyPJ301MPort>(Vec(78.0f, 339.0f),Port::OUTPUT, module, DFUZE::OUT_R_OUTPUT));
  114. }
  115. };
  116. } // namespace rack_plugin_Bidoo
  117. using namespace rack_plugin_Bidoo;
  118. RACK_PLUGIN_MODEL_INIT(Bidoo, DFUZE) {
  119. Model *modelDFUZE = Model::create<DFUZE, DFUZEWidget>("Bidoo", "dFUZE", "dFUZE reverberator", REVERB_TAG, EFFECT_TAG);
  120. return modelDFUZE;
  121. }