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.

137 lines
4.2KB

  1. #include "HetrickCV.hpp"
  2. namespace rack_plugin_HetrickCV {
  3. struct Delta : Module
  4. {
  5. enum ParamIds
  6. {
  7. AMOUNT_PARAM,
  8. SCALE_PARAM,
  9. NUM_PARAMS
  10. };
  11. enum InputIds
  12. {
  13. MAIN_INPUT,
  14. AMOUNT_INPUT,
  15. NUM_INPUTS
  16. };
  17. enum OutputIds
  18. {
  19. GT_GATE_OUTPUT,
  20. GT_TRIG_OUTPUT,
  21. LT_GATE_OUTPUT,
  22. LT_TRIG_OUTPUT,
  23. CHANGE_OUTPUT,
  24. DELTA_OUTPUT,
  25. NUM_OUTPUTS
  26. };
  27. enum LightIds
  28. {
  29. GT_LIGHT,
  30. LT_LIGHT,
  31. CHANGE_LIGHT,
  32. NUM_LIGHTS
  33. };
  34. Delta() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  35. {
  36. }
  37. TriggerGenWithSchmitt ltTrig, gtTrig;
  38. float lastInput = 0.0f;
  39. bool rising = false;
  40. bool falling = false;
  41. void step() override;
  42. // For more advanced Module features, read Rack's engine.hpp header file
  43. // - toJson, fromJson: serialization of internal data
  44. // - onSampleRateChange: event triggered by a change of sample rate
  45. // - reset, randomize: implements special behavior when user clicks these from the context menu
  46. };
  47. void Delta::step()
  48. {
  49. float input = inputs[MAIN_INPUT].value;
  50. float delta = input - lastInput;
  51. lastInput = input;
  52. rising = (delta > 0.0f);
  53. falling = (delta < 0.0f);
  54. float boost = params[AMOUNT_PARAM].value + (inputs[AMOUNT_INPUT].value * params[SCALE_PARAM].value);
  55. boost = clampf(boost, 0.0f, 5.0f) * 8000.0f + 1;
  56. outputs[GT_TRIG_OUTPUT].value = gtTrig.process(rising) ? 5.0f : 0.0f;
  57. outputs[LT_TRIG_OUTPUT].value = ltTrig.process(falling) ? 5.0f : 0.0f;
  58. outputs[GT_GATE_OUTPUT].value = rising ? 5.0f : 0.0f;
  59. outputs[LT_GATE_OUTPUT].value = falling ? 5.0f : 0.0f;
  60. float allTrigs = outputs[GT_TRIG_OUTPUT].value + outputs[LT_TRIG_OUTPUT].value;
  61. allTrigs = clampf(allTrigs, 0.0f, 5.0f);
  62. const float deltaOutput = clampf(delta * boost, -5.0f, 5.0f);
  63. outputs[CHANGE_OUTPUT].value = allTrigs;
  64. outputs[DELTA_OUTPUT].value = deltaOutput;
  65. lights[GT_LIGHT].setBrightnessSmooth(outputs[GT_GATE_OUTPUT].value);
  66. lights[LT_LIGHT].setBrightnessSmooth(outputs[LT_GATE_OUTPUT].value);
  67. lights[CHANGE_LIGHT].setBrightnessSmooth(allTrigs);
  68. }
  69. struct DeltaWidget : ModuleWidget { DeltaWidget(Delta *module); };
  70. DeltaWidget::DeltaWidget(Delta *module) : ModuleWidget(module)
  71. {
  72. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  73. {
  74. auto *panel = new SVGPanel();
  75. panel->box.size = box.size;
  76. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Delta.svg")));
  77. addChild(panel);
  78. }
  79. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  80. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  81. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  82. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  83. //////PARAMS//////
  84. addParam(ParamWidget::create<Davies1900hBlackKnob>(Vec(27, 62), module, Delta::AMOUNT_PARAM, 0.0, 5.0, 0.0));
  85. addParam(ParamWidget::create<Trimpot>(Vec(36, 112), module, Delta::SCALE_PARAM, -1.0, 1.0, 1.0));
  86. //////INPUTS//////
  87. addInput(Port::create<PJ301MPort>(Vec(12, 195), Port::INPUT, module, Delta::MAIN_INPUT));
  88. addInput(Port::create<PJ301MPort>(Vec(33, 145), Port::INPUT, module, Delta::AMOUNT_INPUT));
  89. //////OUTPUTS//////
  90. addOutput(Port::create<PJ301MPort>(Vec(53, 195), Port::OUTPUT, module, Delta::DELTA_OUTPUT));
  91. addOutput(Port::create<PJ301MPort>(Vec(12, 285), Port::OUTPUT, module, Delta::LT_GATE_OUTPUT));
  92. addOutput(Port::create<PJ301MPort>(Vec(53, 285), Port::OUTPUT, module, Delta::GT_GATE_OUTPUT));
  93. addOutput(Port::create<PJ301MPort>(Vec(12, 315), Port::OUTPUT, module, Delta::LT_TRIG_OUTPUT));
  94. addOutput(Port::create<PJ301MPort>(Vec(53, 315), Port::OUTPUT, module, Delta::GT_TRIG_OUTPUT));
  95. addOutput(Port::create<PJ301MPort>(Vec(32.5, 245), Port::OUTPUT, module, Delta::CHANGE_OUTPUT));
  96. //////BLINKENLIGHTS//////
  97. addChild(ModuleLightWidget::create<SmallLight<RedLight>>(Vec(22, 275), module, Delta::LT_LIGHT));
  98. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(Vec(62, 275), module, Delta::GT_LIGHT));
  99. addChild(ModuleLightWidget::create<SmallLight<RedLight>>(Vec(42, 275), module, Delta::CHANGE_LIGHT));
  100. }
  101. } // namespace rack_plugin_HetrickCV
  102. using namespace rack_plugin_HetrickCV;
  103. RACK_PLUGIN_MODEL_INIT(HetrickCV, Delta) {
  104. Model *modelDelta = Model::create<Delta, DeltaWidget>("HetrickCV", "Delta", "Delta", LOGIC_TAG);
  105. return modelDelta;
  106. }