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.

102 lines
2.5KB

  1. #include "Bidoo.hpp"
  2. #include "BidooComponents.hpp"
  3. #include "dsp/digital.hpp"
  4. #include <ctime>
  5. using namespace std;
  6. namespace rack_plugin_Bidoo {
  7. struct LATE : Module {
  8. enum ParamIds {
  9. SWING_PARAM,
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. SWING_INPUT,
  14. CLOCK_INPUT,
  15. RESET_INPUT,
  16. NUM_INPUTS
  17. };
  18. enum OutputIds {
  19. CLOCK_OUTPUT,
  20. NUM_OUTPUTS
  21. };
  22. enum LightIds {
  23. NUM_LIGHTS
  24. };
  25. bool odd = true;
  26. bool armed = false;
  27. SchmittTrigger clockTrigger;
  28. SchmittTrigger resetTrigger;
  29. clock_t tCurrent = clock();
  30. clock_t tPrevious = clock();
  31. LATE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
  32. void step() override;
  33. };
  34. void LATE::step() {
  35. outputs[CLOCK_OUTPUT].value = 0;
  36. clock_t now = clock();
  37. if (resetTrigger.process(inputs[RESET_INPUT].value)) {
  38. odd=true;
  39. }
  40. if (clockTrigger.process(inputs[CLOCK_INPUT].value)) {
  41. tPrevious = tCurrent;
  42. tCurrent = now;
  43. if (odd) {
  44. outputs[CLOCK_OUTPUT].value = 10.0f;
  45. odd = false;
  46. armed = false;
  47. }
  48. else {
  49. armed = true;
  50. }
  51. }
  52. float lag = rescale(clamp(params[SWING_PARAM].value + inputs[SWING_INPUT].value,0.0f,9.0f),0.0f,10.0f,0.0f,(float)tCurrent-(float)tPrevious);
  53. if (armed && !odd && (((float)now - (float)tCurrent) >= lag)) {
  54. outputs[CLOCK_OUTPUT].value = 10.0f;
  55. armed = false;
  56. odd = true;
  57. }
  58. }
  59. struct LATEWidget : ModuleWidget {
  60. LATEWidget(LATE *module) : ModuleWidget(module) {
  61. setPanel(SVG::load(assetPlugin(plugin, "res/LATE.svg")));
  62. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  63. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  64. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  65. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  66. addParam(ParamWidget::create<BidooBlueKnob>(Vec(8, 70), module, LATE::SWING_PARAM, 0, 9, 0));
  67. addInput(Port::create<PJ301MPort>(Vec(10, 110), Port::INPUT, module, LATE::SWING_INPUT));
  68. addInput(Port::create<PJ301MPort>(Vec(10, 173), Port::INPUT, module, LATE::RESET_INPUT));
  69. addInput(Port::create<PJ301MPort>(Vec(10, 235), Port::INPUT, module, LATE::CLOCK_INPUT));
  70. addOutput(Port::create<PJ301MPort>(Vec(10, 299), Port::OUTPUT, module, LATE::CLOCK_OUTPUT));
  71. }
  72. };
  73. } // namespace rack_plugin_Bidoo
  74. using namespace rack_plugin_Bidoo;
  75. RACK_PLUGIN_MODEL_INIT(Bidoo, LATE) {
  76. Model *modelLATE = Model::create<LATE, LATEWidget>("Bidoo", "lATe", "lATe clock modulator", CLOCK_MODULATOR_TAG);
  77. return modelLATE;
  78. }