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.

93 lines
3.0KB

  1. #include "RJModules.hpp"
  2. #include <iostream>
  3. #include <cmath>
  4. #include <random>
  5. #include "VAStateVariableFilter.h"
  6. namespace rack_plugin_RJModules {
  7. struct Notch: Module {
  8. enum ParamIds {
  9. FREQ_PARAM,
  10. VOL_PARAM,
  11. WIDTH_PARAM,
  12. NUM_PARAMS
  13. };
  14. enum InputIds {
  15. CH1_INPUT,
  16. FREQ_CV_INPUT,
  17. VOL_CV_INPUT,
  18. WIDTH_CV_INPUT,
  19. NUM_INPUTS
  20. };
  21. enum OutputIds {
  22. CH1_OUTPUT,
  23. NUM_OUTPUTS
  24. };
  25. VAStateVariableFilter *notchFilter = new VAStateVariableFilter();
  26. Notch() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  27. void step() override;
  28. };
  29. void Notch::step() {
  30. float dry = inputs[CH1_INPUT].value;
  31. float wet = 0.0;
  32. dry += 1.0e-6 * (2.0*randomUniform() - 1.0)*1000;
  33. notchFilter->setFilterType(5);
  34. notchFilter->setCutoffFreq(params[FREQ_PARAM].value * clamp(inputs[FREQ_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f));
  35. notchFilter->setShelfGain(params[VOL_PARAM].value * clamp(inputs[VOL_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f));
  36. notchFilter->setResonance(params[WIDTH_PARAM].value * clamp(inputs[WIDTH_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f));
  37. notchFilter->setSampleRate(engineGetSampleRate());
  38. wet = notchFilter->processAudioSample(dry, 1);
  39. outputs[CH1_OUTPUT].value = wet;
  40. }
  41. struct NotchWidget: ModuleWidget {
  42. NotchWidget(Notch *module);
  43. };
  44. NotchWidget::NotchWidget(Notch *module) : ModuleWidget(module) {
  45. box.size = Vec(15*10, 380);
  46. {
  47. SVGPanel *panel = new SVGPanel();
  48. panel->box.size = box.size;
  49. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Notch.svg")));
  50. addChild(panel);
  51. }
  52. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  53. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  54. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  55. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  56. addParam(ParamWidget::create<RoundHugeBlackKnob>(Vec(47, 61), module, Notch::FREQ_PARAM, 30.0, 6000.0, 1000.0));
  57. addParam(ParamWidget::create<RoundHugeBlackKnob>(Vec(47, 143), module, Notch::VOL_PARAM, 0.0, 5.0, 2));
  58. addParam(ParamWidget::create<RoundHugeBlackKnob>(Vec(47, 228), module, Notch::WIDTH_PARAM, 0.0, 1.0, 0.5));
  59. addInput(Port::create<PJ301MPort>(Vec(22, 100), Port::INPUT, module, Notch::FREQ_CV_INPUT));
  60. addInput(Port::create<PJ301MPort>(Vec(22, 180), Port::INPUT, module, Notch::VOL_CV_INPUT));
  61. addInput(Port::create<PJ301MPort>(Vec(22, 260), Port::INPUT, module, Notch::WIDTH_CV_INPUT));
  62. addInput(Port::create<PJ301MPort>(Vec(22, 310), Port::INPUT, module, Notch::CH1_INPUT));
  63. addOutput(Port::create<PJ301MPort>(Vec(110, 310), Port::OUTPUT, module, Notch::CH1_OUTPUT));
  64. }
  65. } // namespace rack_plugin_RJModules
  66. using namespace rack_plugin_RJModules;
  67. RACK_PLUGIN_MODEL_INIT(RJModules, Notch) {
  68. Model *modelNotch = Model::create<Notch, NotchWidget>("RJModules", "Notch", "[FILT] Notch", FILTER_TAG);//UTILITY_TAG);
  69. return modelNotch;
  70. }