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.

95 lines
5.2KB

  1. #include "plugin.hpp"
  2. struct Pulses : Module {
  3. enum ParamIds {
  4. ENUMS(PUSH_PARAMS, 10),
  5. NUM_PARAMS
  6. };
  7. enum InputIds {
  8. NUM_INPUTS
  9. };
  10. enum OutputIds {
  11. ENUMS(TRIG_OUTPUTS, 10),
  12. ENUMS(GATE_OUTPUTS, 10),
  13. NUM_OUTPUTS
  14. };
  15. enum LightIds {
  16. ENUMS(PUSH_LIGHTS, 10),
  17. NUM_LIGHTS
  18. };
  19. dsp::BooleanTrigger tapTriggers[10];
  20. dsp::PulseGenerator pulseGenerators[10];
  21. Pulses() {
  22. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
  23. for (int i = 0; i < 10; i++) {
  24. configButton(PUSH_PARAMS + i, string::f("Row %d button", i + 1));
  25. configOutput(TRIG_OUTPUTS + i, string::f("Row %d trigger", i + 1));
  26. configOutput(GATE_OUTPUTS + i, string::f("Row %d gate", i + 1));
  27. }
  28. }
  29. void process(const ProcessArgs& args) override {
  30. for (int i = 0; i < 10; i++) {
  31. bool tap = params[PUSH_PARAMS + i].getValue() > 0.f;
  32. if (tapTriggers[i].process(tap)) {
  33. pulseGenerators[i].trigger(1e-3f);
  34. }
  35. bool pulse = pulseGenerators[i].process(args.sampleTime);
  36. outputs[TRIG_OUTPUTS + i].setVoltage(pulse ? 10.f : 0.f);
  37. outputs[GATE_OUTPUTS + i].setVoltage(tap ? 10.f : 0.f);
  38. lights[PUSH_LIGHTS + i].setBrightness(tap);
  39. }
  40. }
  41. };
  42. struct PulsesWidget : ModuleWidget {
  43. PulsesWidget(Pulses* module) {
  44. setModule(module);
  45. setPanel(createPanel(asset::plugin(pluginInstance, "res/Pulses.svg")));
  46. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  47. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  48. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  49. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  50. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 21.968)), module, Pulses::PUSH_PARAMS + 0, Pulses::PUSH_LIGHTS + 0));
  51. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 32.095)), module, Pulses::PUSH_PARAMS + 1, Pulses::PUSH_LIGHTS + 1));
  52. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 42.222)), module, Pulses::PUSH_PARAMS + 2, Pulses::PUSH_LIGHTS + 2));
  53. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 52.35)), module, Pulses::PUSH_PARAMS + 3, Pulses::PUSH_LIGHTS + 3));
  54. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 62.477)), module, Pulses::PUSH_PARAMS + 4, Pulses::PUSH_LIGHTS + 4));
  55. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 72.605)), module, Pulses::PUSH_PARAMS + 5, Pulses::PUSH_LIGHTS + 5));
  56. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 82.732)), module, Pulses::PUSH_PARAMS + 6, Pulses::PUSH_LIGHTS + 6));
  57. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 92.86)), module, Pulses::PUSH_PARAMS + 7, Pulses::PUSH_LIGHTS + 7));
  58. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 102.987)), module, Pulses::PUSH_PARAMS + 8, Pulses::PUSH_LIGHTS + 8));
  59. addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(7.28, 113.115)), module, Pulses::PUSH_PARAMS + 9, Pulses::PUSH_LIGHTS + 9));
  60. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 21.968)), module, Pulses::TRIG_OUTPUTS + 0));
  61. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 32.095)), module, Pulses::TRIG_OUTPUTS + 1));
  62. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 42.222)), module, Pulses::TRIG_OUTPUTS + 2));
  63. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 52.35)), module, Pulses::TRIG_OUTPUTS + 3));
  64. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 62.477)), module, Pulses::TRIG_OUTPUTS + 4));
  65. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 72.605)), module, Pulses::TRIG_OUTPUTS + 5));
  66. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 82.732)), module, Pulses::TRIG_OUTPUTS + 6));
  67. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 92.86)), module, Pulses::TRIG_OUTPUTS + 7));
  68. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 102.987)), module, Pulses::TRIG_OUTPUTS + 8));
  69. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.313, 113.115)), module, Pulses::TRIG_OUTPUTS + 9));
  70. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 21.968)), module, Pulses::GATE_OUTPUTS + 0));
  71. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 32.095)), module, Pulses::GATE_OUTPUTS + 1));
  72. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 42.222)), module, Pulses::GATE_OUTPUTS + 2));
  73. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 52.35)), module, Pulses::GATE_OUTPUTS + 3));
  74. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 62.477)), module, Pulses::GATE_OUTPUTS + 4));
  75. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 72.605)), module, Pulses::GATE_OUTPUTS + 5));
  76. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 82.732)), module, Pulses::GATE_OUTPUTS + 6));
  77. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 92.86)), module, Pulses::GATE_OUTPUTS + 7));
  78. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 102.987)), module, Pulses::GATE_OUTPUTS + 8));
  79. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(33.321, 113.115)), module, Pulses::GATE_OUTPUTS + 9));
  80. }
  81. };
  82. Model* modelPulses = createModel<Pulses, PulsesWidget>("Pulses");