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.

105 lines
2.2KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. using namespace std;
  4. namespace rack_plugin_cf {
  5. struct CHOKE : Module {
  6. enum ParamIds {
  7. TR1_PARAM,
  8. TR2_PARAM,
  9. PAN_PARAM,
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. TRIG1_INPUT,
  14. TRIG2_INPUT,
  15. IN1_INPUT,
  16. IN2_INPUT,
  17. NUM_INPUTS
  18. };
  19. enum OutputIds {
  20. OUT_OUTPUT,
  21. NUM_OUTPUTS
  22. };
  23. enum LightIds {
  24. L2_LIGHT,
  25. NUM_LIGHTS
  26. };
  27. bool play = false;
  28. SchmittTrigger tr1Trigger;
  29. SchmittTrigger tr2Trigger;
  30. CHOKE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
  31. void step() override;
  32. };
  33. void CHOKE::step() {
  34. if (tr1Trigger.process(inputs[TRIG1_INPUT].value))
  35. {
  36. play = false ;
  37. };
  38. if (tr2Trigger.process(inputs[TRIG2_INPUT].value))
  39. {
  40. play = true ;
  41. };
  42. if (play)
  43. outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value*(1-clamp(-params[PAN_PARAM].value,0.0f,1.0f));
  44. else outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value*(1-clamp(params[PAN_PARAM].value,0.0f,1.0f));
  45. lights[L2_LIGHT].value=play;
  46. }
  47. struct CHOKEWidget : ModuleWidget {
  48. CHOKEWidget(CHOKE *module);
  49. //void step() override;
  50. };
  51. CHOKEWidget::CHOKEWidget(CHOKE *module) : ModuleWidget(module) {
  52. setPanel(SVG::load(assetPlugin(plugin, "res/CHOKE.svg")));
  53. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  54. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  55. addParam(ParamWidget::create<Trimpot>(Vec(6, 298), module, CHOKE::PAN_PARAM, -1.0f, 1.0f, 0.0f));
  56. addInput(Port::create<PJ301MPort>(Vec(3, 61), Port::INPUT, module, CHOKE::IN1_INPUT));
  57. addInput(Port::create<PJ301MPort>(Vec(3, 91), Port::INPUT, module, CHOKE::TRIG1_INPUT));
  58. addInput(Port::create<PJ301MPort>(Vec(3, 181), Port::INPUT, module, CHOKE::IN2_INPUT));
  59. addInput(Port::create<PJ301MPort>(Vec(3, 211), Port::INPUT, module, CHOKE::TRIG2_INPUT));
  60. addChild(ModuleLightWidget::create<LargeLight<BlueLight>>(Vec(8, 276), module, CHOKE::L2_LIGHT));
  61. addOutput(Port::create<PJ301MPort>(Vec(3, 321), Port::OUTPUT, module, CHOKE::OUT_OUTPUT));
  62. }
  63. } // namespace rack_plugin_cf
  64. using namespace rack_plugin_cf;
  65. RACK_PLUGIN_MODEL_INIT(cf, CHOKE) {
  66. Model *modelCHOKE = Model::create<CHOKE, CHOKEWidget>("cf", "CHOKE", "Choke", UTILITY_TAG);
  67. return modelCHOKE;
  68. }