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.

116 lines
3.6KB

  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 MentalClip : Module {
  12. enum ParamIds {
  13. THRESH1_PARAM, GAIN1_PARAM,
  14. THRESH2_PARAM, GAIN2_PARAM,
  15. NUM_PARAMS
  16. };
  17. enum InputIds {
  18. INPUT1, THRESH1_CV_INPUT, GAIN1_CV_INPUT,
  19. INPUT2, THRESH2_CV_INPUT, GAIN2_CV_INPUT,
  20. NUM_INPUTS
  21. };
  22. enum OutputIds {
  23. OUTPUT1,
  24. OUTPUT2,
  25. NUM_OUTPUTS
  26. };
  27. MentalClip() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  28. void step() override;
  29. };
  30. /////////////////////////////////////////////////////
  31. void MentalClip::step() {
  32. float signal_in1 = inputs[INPUT1].value;
  33. float threshold1 = params[THRESH1_PARAM].value * 6 + inputs[THRESH1_CV_INPUT].value/2;
  34. float gain1 = params[GAIN1_PARAM].value * 5 + inputs[GAIN1_CV_INPUT].value / 2;
  35. float signal_in2 = inputs[INPUT2].value;
  36. float threshold2 = params[THRESH2_PARAM].value * 6 + inputs[THRESH2_CV_INPUT].value/2;
  37. float gain2 = params[GAIN2_PARAM].value * 5 + inputs[GAIN2_CV_INPUT].value / 2;
  38. float clipped1 = signal_in1;
  39. float clipped2 = signal_in2;
  40. if (std::abs(signal_in1) > threshold1)
  41. {
  42. if (signal_in1 > 0)
  43. {
  44. clipped1 = threshold1;
  45. } else
  46. {
  47. clipped1 = - threshold1;
  48. }
  49. }
  50. if (std::abs(signal_in2) > threshold2)
  51. {
  52. if (signal_in2 > 0)
  53. {
  54. clipped2 = threshold2;
  55. } else
  56. {
  57. clipped2 = - threshold2;
  58. }
  59. }
  60. outputs[OUTPUT1].value = clipped1 * gain1;
  61. outputs[OUTPUT2].value = clipped2 * gain2;
  62. }
  63. //////////////////////////////////////////////////////////////////
  64. struct MentalClipWidget : ModuleWidget {
  65. MentalClipWidget(MentalClip *module);
  66. };
  67. MentalClipWidget::MentalClipWidget(MentalClip *module) : ModuleWidget(module)
  68. {
  69. setPanel(SVG::load(assetPlugin(plugin, "res/MentalClip.svg")));
  70. // label
  71. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y / 2 - 169), module, MentalClip::THRESH1_PARAM, 0.0, 1.0, 1.0));
  72. addInput(Port::create<CVInPort>(Vec(3, box.size.y / 2 - 148), Port::INPUT, module, MentalClip::THRESH1_CV_INPUT));
  73. // label
  74. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y / 2 - 112), module, MentalClip::GAIN1_PARAM, 0.0, 1.0, 0.5));
  75. addInput(Port::create<CVInPort>(Vec(3, box.size.y / 2 - 91), Port::INPUT, module, MentalClip::GAIN1_CV_INPUT));
  76. // output
  77. addInput(Port::create<InPort>(Vec(3, box.size.y / 2 - 55), Port::INPUT, module, MentalClip::INPUT1));
  78. addOutput(Port::create<OutPort>(Vec(3, box.size.y / 2 - 28), Port::OUTPUT, module, MentalClip::OUTPUT1));
  79. // label
  80. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y - 175), module, MentalClip::THRESH2_PARAM, 0.0, 1.0, 1.0));
  81. addInput(Port::create<CVInPort>(Vec(3, box.size.y - 154), Port::INPUT, module, MentalClip::THRESH2_CV_INPUT));
  82. // label
  83. addParam(ParamWidget::create<SmlKnob>(Vec(6, box.size.y - 122), module, MentalClip::GAIN2_PARAM, 0.0, 1.0, 0.5));
  84. addInput(Port::create<CVInPort>(Vec(3, box.size.y - 101), Port::INPUT, module, MentalClip::GAIN2_CV_INPUT));
  85. // output
  86. addInput(Port::create<InPort>(Vec(3, box.size.y - 65), Port::INPUT, module, MentalClip::INPUT2));
  87. addOutput(Port::create<OutPort>(Vec(3, box.size.y - 38), Port::OUTPUT, module, MentalClip::OUTPUT2));
  88. }
  89. } // namespace rack_plugin_mental
  90. using namespace rack_plugin_mental;
  91. RACK_PLUGIN_MODEL_INIT(mental, MentalClip) {
  92. Model *modelMentalClip = Model::create<MentalClip, MentalClipWidget>("mental", "MentalClip", "Clipper", DISTORTION_TAG);
  93. return modelMentalClip;
  94. }