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.

124 lines
3.8KB

  1. ///////////////////////////////////////////////////
  2. //
  3. // Wave Folder VCV Module
  4. //
  5. // Strum 2017
  6. //
  7. ///////////////////////////////////////////////////
  8. #include "mental.hpp"
  9. namespace rack_plugin_mental {
  10. //////////////////////////////////////////////////////
  11. struct MentalFold : Module {
  12. enum ParamIds {
  13. THRESH_PARAM,
  14. GAIN_PARAM,
  15. THRESH_PARAM2,
  16. GAIN_PARAM2,
  17. NUM_PARAMS
  18. };
  19. enum InputIds {
  20. INPUT_1,
  21. THRESH_CV_INPUT,
  22. GAIN_CV_INPUT,
  23. INPUT_2,
  24. THRESH_CV_INPUT2,
  25. GAIN_CV_INPUT2,
  26. NUM_INPUTS
  27. };
  28. enum OutputIds {
  29. OUTPUT_1,
  30. OUTPUT_2,
  31. NUM_OUTPUTS
  32. };
  33. MentalFold() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  34. void step() override;
  35. };
  36. /////////////////////////////////////////////////////
  37. void MentalFold::step() {
  38. float signal_in_1 = inputs[INPUT_1].value;
  39. float signal_in_2 = inputs[INPUT_2].value;
  40. float threshold_fold = params[THRESH_PARAM].value * 6 + inputs[THRESH_CV_INPUT].value;
  41. float threshold_fold2 = params[THRESH_PARAM2].value * 6 + inputs[THRESH_CV_INPUT2].value;
  42. float gain = params[GAIN_PARAM].value * 5 + inputs[GAIN_CV_INPUT].value / 2;
  43. float gain2 = params[GAIN_PARAM2].value * 5 + inputs[GAIN_CV_INPUT2].value / 2;
  44. float modified = signal_in_1;
  45. float modified2 = signal_in_2;
  46. if (std::abs(signal_in_1) > threshold_fold )
  47. {
  48. if (signal_in_1 > 0)
  49. {
  50. modified = threshold_fold - (signal_in_1 - threshold_fold );
  51. } else
  52. {
  53. modified = - threshold_fold - (signal_in_1 + threshold_fold );
  54. }
  55. }
  56. if (std::abs(signal_in_2) > threshold_fold2 )
  57. {
  58. if (signal_in_2 > 0)
  59. {
  60. modified2 = threshold_fold2 - (signal_in_2 - threshold_fold2 );
  61. } else
  62. {
  63. modified2 = - threshold_fold2 - (signal_in_2 + threshold_fold2 );
  64. }
  65. }
  66. outputs[OUTPUT_1].value = modified * gain;
  67. outputs[OUTPUT_2].value = modified2 * gain2;
  68. }
  69. //////////////////////////////////////////////////////////////////
  70. struct MentalFoldWidget : ModuleWidget {
  71. MentalFoldWidget(MentalFold *module);
  72. };
  73. MentalFoldWidget::MentalFoldWidget(MentalFold *module) : ModuleWidget(module)
  74. {
  75. setPanel(SVG::load(assetPlugin(plugin, "res/MentalFold.svg")));
  76. // label
  77. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y / 2 - 169), module, MentalFold::THRESH_PARAM, 0.0, 1.0, 1.0));
  78. addInput(Port::create<CVInPort>(Vec(3, box.size.y / 2 - 148), Port::INPUT, module, MentalFold::THRESH_CV_INPUT));
  79. // label
  80. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y / 2 - 112), module, MentalFold::GAIN_PARAM, 0.0, 1.0, 0.5));
  81. addInput(Port::create<CVInPort>(Vec(3, box.size.y / 2 - 91), Port::INPUT, module, MentalFold::GAIN_CV_INPUT));
  82. // output
  83. addInput(Port::create<InPort>(Vec(3, box.size.y / 2 - 55), Port::INPUT, module, MentalFold::INPUT_1));
  84. addOutput(Port::create<OutPort>(Vec(3, box.size.y / 2 - 28), Port::OUTPUT, module, MentalFold::OUTPUT_1));
  85. // label
  86. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y - 177), module, MentalFold::THRESH_PARAM2, 0.0, 1.0, 1.0));
  87. addInput(Port::create<CVInPort>(Vec(3, box.size.y - 156), Port::INPUT, module, MentalFold::THRESH_CV_INPUT2));
  88. // label
  89. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y - 120), module, MentalFold::GAIN_PARAM2, 0.0, 1.0, 0.5));
  90. addInput(Port::create<CVInPort>(Vec(3, box.size.y - 99), Port::INPUT, module, MentalFold::GAIN_CV_INPUT2));
  91. // output
  92. addInput(Port::create<InPort>(Vec(3, box.size.y - 65), Port::INPUT, module, MentalFold::INPUT_2));
  93. addOutput(Port::create<OutPort>(Vec(3, box.size.y - 38), Port::OUTPUT, module, MentalFold::OUTPUT_2));
  94. }
  95. } // namespace rack_plugin_mental
  96. using namespace rack_plugin_mental;
  97. RACK_PLUGIN_MODEL_INIT(mental, MentalFold) {
  98. Model *modelMentalFold = Model::create<MentalFold, MentalFoldWidget>("mental", "MentalFold", "Wave Folder", DISTORTION_TAG);
  99. return modelMentalFold;
  100. }