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
5.5KB

  1. #include "Bidoo.hpp"
  2. #include "BidooComponents.hpp"
  3. #include "dsp/ringbuffer.hpp"
  4. #include "dep/freeverb/revmodel.hpp"
  5. #include "dep/filters/pitchshifter.h"
  6. #include "dsp/digital.hpp"
  7. #define BUFF_SIZE 1024
  8. using namespace std;
  9. namespace rack_plugin_Bidoo {
  10. struct REI : Module {
  11. enum ParamIds {
  12. SIZE_PARAM,
  13. DAMP_PARAM,
  14. FREEZE_PARAM,
  15. WIDTH_PARAM,
  16. DRY_PARAM,
  17. WET_PARAM,
  18. SHIMM_PARAM,
  19. SHIMMPITCH_PARAM,
  20. CLIPPING_PARAM,
  21. NUM_PARAMS
  22. };
  23. enum InputIds {
  24. IN_L_INPUT,
  25. IN_R_INPUT,
  26. SIZE_INPUT,
  27. DAMP_INPUT,
  28. FREEZE_INPUT,
  29. WIDTH_INPUT,
  30. SHIMM_INPUT,
  31. SHIMMPITCH_INPUT,
  32. NUM_INPUTS
  33. };
  34. enum OutputIds {
  35. OUT_L_OUTPUT,
  36. OUT_R_OUTPUT,
  37. NUM_OUTPUTS
  38. };
  39. enum LightIds {
  40. NUM_LIGHTS
  41. };
  42. DoubleRingBuffer<float,BUFF_SIZE> in_Buffer;
  43. DoubleRingBuffer<float,2*BUFF_SIZE> pin_Buffer;
  44. revmodel revprocessor;
  45. SchmittTrigger freezeTrigger;
  46. bool freeze = false;
  47. float sr = engineGetSampleRate();
  48. PitchShifter *pShifter = NULL;
  49. int delay=0;
  50. REI() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  51. pShifter = new PitchShifter(BUFF_SIZE, 8, engineGetSampleRate());
  52. memset((void*)in_Buffer.data, 0, sizeof(in_Buffer.data));
  53. memset((void*)pin_Buffer.data, 0, sizeof(pin_Buffer.data));
  54. }
  55. void step() override;
  56. };
  57. void REI::step() {
  58. float outL = 0.0f, outR = 0.0f;
  59. float wOutL = 0.0f, wOutR = 0.0f;
  60. float inL = 0.0f, inR = 0.0f;
  61. revprocessor.setdamp(clamp(params[DAMP_PARAM].value+inputs[DAMP_INPUT].value,0.0f,1.0f));
  62. revprocessor.setroomsize(clamp(params[SIZE_PARAM].value+inputs[SIZE_INPUT].value,0.0f,1.0f));
  63. revprocessor.setwet(clamp(params[WET_PARAM].value,0.0f,1.0f));
  64. revprocessor.setdry(clamp(params[DRY_PARAM].value,0.0f,1.0f));
  65. revprocessor.setwidth(clamp(params[WIDTH_PARAM].value+inputs[WIDTH_INPUT].value,0.0f,1.0f));
  66. if (freezeTrigger.process(params[FREEZE_PARAM].value + inputs[FREEZE_INPUT].value )) freeze = !freeze;
  67. revprocessor.setmode(freeze?1.0:0.0);
  68. inL = inputs[IN_L_INPUT].value;
  69. inR = inputs[IN_R_INPUT].value;
  70. float fact = clamp(params[SHIMM_PARAM].value+rescale(inputs[SHIMM_INPUT].value,0.0f,10.0f,0.0f,1.0f),0.0f,1.0f);
  71. if (pin_Buffer.size()>BUFF_SIZE) {
  72. revprocessor.process(inL, inR, fact*(*pin_Buffer.startData()), outL, outR, wOutL, wOutR);
  73. pin_Buffer.startIncr(1);
  74. }
  75. else {
  76. revprocessor.process(inL, inR, 0.0f, outL, outR, wOutL, wOutR);
  77. }
  78. if (params[CLIPPING_PARAM].value==1.0f) {
  79. outL = clamp(outL,-7.0f,7.0f);
  80. outR= clamp(outR,-7.0f,7.0f);
  81. }
  82. else {
  83. outL = tanh(outL/5.0f)*7.0f;
  84. outR= tanh(outR/5.0f)*7.0f;
  85. }
  86. in_Buffer.push((outL + outR)/2.0f);
  87. if (in_Buffer.full()) {
  88. pShifter->process(clamp(params[SHIMMPITCH_PARAM].value + inputs[SHIMMPITCH_INPUT].value,0.5f,4.0f), in_Buffer.startData(), pin_Buffer.endData());
  89. pin_Buffer.endIncr(in_Buffer.size());
  90. in_Buffer.clear();
  91. }
  92. outputs[OUT_L_OUTPUT].value = outL;
  93. outputs[OUT_R_OUTPUT].value = outR;
  94. }
  95. struct REIWidget : ModuleWidget {
  96. REIWidget(REI *module) : ModuleWidget(module) {
  97. setPanel(SVG::load(assetPlugin(plugin, "res/REI.svg")));
  98. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  99. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  100. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  101. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  102. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 45), module, REI::SIZE_PARAM, 0.0f, 1.0f, 0.5f));
  103. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 85), module, REI::DAMP_PARAM, 0.0f, 1.0f, 0.5f));
  104. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 125), module, REI::WIDTH_PARAM, 0.0f, 1.0f, 0.5f));
  105. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 165), module, REI::DRY_PARAM, 0.0f, 1.0f, 0.5f));
  106. addParam(ParamWidget::create<BidooBlueKnob>(Vec(63, 165), module, REI::WET_PARAM, 0.0f, 1.0f, 0.5f));
  107. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 205), module, REI::SHIMM_PARAM, 0.0f, 1.0f, 0.0f));
  108. addParam(ParamWidget::create<BidooBlueKnob>(Vec(13, 245), module, REI::SHIMMPITCH_PARAM, 0.5f, 4.0f, 2.0f));
  109. addParam(ParamWidget::create<BlueCKD6>(Vec(13, 285), module, REI::FREEZE_PARAM, 0.0f, 10.0f, 0.0f));
  110. addParam(ParamWidget::create<CKSS>(Vec(75.0f, 15.0f), module, REI::CLIPPING_PARAM, 0.0f, 1.0f, 1.0f));
  111. addInput(Port::create<PJ301MPort>(Vec(65.0f, 47.0f), Port::INPUT, module, REI::SIZE_INPUT));
  112. addInput(Port::create<PJ301MPort>(Vec(65.0f, 87.0f), Port::INPUT, module, REI::DAMP_INPUT));
  113. addInput(Port::create<PJ301MPort>(Vec(65.0f, 127.0f), Port::INPUT, module, REI::WIDTH_INPUT));
  114. addInput(Port::create<PJ301MPort>(Vec(65.0f, 207.0f), Port::INPUT, module, REI::SHIMM_INPUT));
  115. addInput(Port::create<PJ301MPort>(Vec(65.0f, 247.0f), Port::INPUT, module, REI::SHIMMPITCH_INPUT));
  116. addInput(Port::create<PJ301MPort>(Vec(65.0f, 287.0f), Port::INPUT, module, REI::FREEZE_INPUT));
  117. //Changed ports opposite way around
  118. addInput(Port::create<TinyPJ301MPort>(Vec(24.0f, 319.0f), Port::INPUT, module, REI::IN_L_INPUT));
  119. addInput(Port::create<TinyPJ301MPort>(Vec(24.0f, 339.0f), Port::INPUT, module, REI::IN_R_INPUT));
  120. addOutput(Port::create<TinyPJ301MPort>(Vec(78.0f, 319.0f),Port::OUTPUT, module, REI::OUT_L_OUTPUT));
  121. addOutput(Port::create<TinyPJ301MPort>(Vec(78.0f, 339.0f),Port::OUTPUT, module, REI::OUT_R_OUTPUT));
  122. }
  123. };
  124. } // namespace rack_plugin_Bidoo
  125. using namespace rack_plugin_Bidoo;
  126. RACK_PLUGIN_MODEL_INIT(Bidoo, REI) {
  127. Model *modelREI = Model::create<REI, REIWidget>("Bidoo", "REI", "REI reverberator", REVERB_TAG, EFFECT_TAG);
  128. return modelREI;
  129. }