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.

122 lines
5.3KB

  1. #include "plugin.hpp"
  2. struct SHASR : Module {
  3. enum ParamId {
  4. RND_PARAM,
  5. PUSH_PARAM,
  6. CLEAR_PARAM,
  7. PARAMS_LEN
  8. };
  9. enum InputId {
  10. ENUMS(IN_INPUTS, 8),
  11. ENUMS(TRIG_INPUTS, 8),
  12. INPUTS_LEN
  13. };
  14. enum OutputId {
  15. ENUMS(SH_OUTPUTS, 8),
  16. OUTPUTS_LEN
  17. };
  18. enum LightId {
  19. LIGHTS_LEN
  20. };
  21. dsp::BooleanTrigger randomizeTrigger;
  22. dsp::BooleanTrigger pushTrigger;
  23. dsp::BooleanTrigger clearTrigger;
  24. dsp::SchmittTrigger triggers[8];
  25. float values[8] = {};
  26. SHASR() {
  27. config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN);
  28. configButton(RND_PARAM, "Randomize");
  29. configButton(PUSH_PARAM, "Push");
  30. configButton(CLEAR_PARAM, "Clear");
  31. for (int i = 0; i < 8; i++) {
  32. configInput(IN_INPUTS + i, string::f("Sample %d", i + 1));
  33. configInput(TRIG_INPUTS + i, string::f("Trigger %d", i + 1));
  34. configOutput(SH_OUTPUTS + i, string::f("Sample %d", i + 1));
  35. }
  36. }
  37. void onReset(const ResetEvent& e) override {
  38. for (int i = 0; i < 8; i++) {
  39. values[i] = 0.f;
  40. }
  41. Module::onReset(e);
  42. }
  43. void process(const ProcessArgs& args) override {
  44. bool randomize = randomizeTrigger.process(params[RND_PARAM].getValue());
  45. bool push = pushTrigger.process(params[PUSH_PARAM].getValue());
  46. bool clear = clearTrigger.process(params[CLEAR_PARAM].getValue());
  47. bool lastTrig = push;
  48. for (int i = 0; i < 8; i++) {
  49. if (inputs[TRIG_INPUTS + i].isConnected()) {
  50. lastTrig = triggers[i].process(inputs[TRIG_INPUTS + i].getVoltage(), 0.1f, 1.f);
  51. }
  52. if (lastTrig) {
  53. float lastValue = (i >= 1) ? outputs[SH_OUTPUTS + i - 1].getVoltage() : 0.f;
  54. values[i] = inputs[IN_INPUTS + i].getNormalVoltage(lastValue);
  55. }
  56. if (randomize) {
  57. values[i] = random::uniform() * 10.f;
  58. }
  59. if (clear) {
  60. values[i] = 0.f;
  61. }
  62. }
  63. // Set outputs
  64. for (int i = 0; i < 8; i++) {
  65. outputs[SH_OUTPUTS + i].setVoltage(values[i]);
  66. }
  67. }
  68. };
  69. struct SHASRWidget : ModuleWidget {
  70. SHASRWidget(SHASR* module) {
  71. setModule(module);
  72. setPanel(createPanel(asset::plugin(pluginInstance, "res/SHASR.svg"), asset::plugin(pluginInstance, "res/SHASR-dark.svg")));
  73. addChild(createWidget<ThemedScrew>(Vec(RACK_GRID_WIDTH, 0)));
  74. addChild(createWidget<ThemedScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  75. addChild(createWidget<ThemedScrew>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  76. addChild(createWidget<ThemedScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  77. addParam(createParamCentered<VCVButton>(mm2px(Vec(6.96, 21.852)), module, SHASR::RND_PARAM));
  78. addParam(createParamCentered<VCVButton>(mm2px(Vec(17.788, 21.852)), module, SHASR::PUSH_PARAM));
  79. addParam(createParamCentered<VCVButton>(mm2px(Vec(28.6, 21.852)), module, SHASR::CLEAR_PARAM));
  80. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 42.113)), module, SHASR::IN_INPUTS + 0));
  81. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 42.055)), module, SHASR::TRIG_INPUTS + 0));
  82. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 52.241)), module, SHASR::IN_INPUTS + 1));
  83. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 52.241)), module, SHASR::TRIG_INPUTS + 1));
  84. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 62.368)), module, SHASR::IN_INPUTS + 2));
  85. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 62.368)), module, SHASR::TRIG_INPUTS + 2));
  86. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 72.496)), module, SHASR::IN_INPUTS + 3));
  87. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 72.496)), module, SHASR::TRIG_INPUTS + 3));
  88. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 82.623)), module, SHASR::IN_INPUTS + 4));
  89. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 82.623)), module, SHASR::TRIG_INPUTS + 4));
  90. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 92.75)), module, SHASR::IN_INPUTS + 5));
  91. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 92.75)), module, SHASR::TRIG_INPUTS + 5));
  92. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 102.878)), module, SHASR::IN_INPUTS + 6));
  93. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 102.878)), module, SHASR::TRIG_INPUTS + 6));
  94. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(6.96, 113.005)), module, SHASR::IN_INPUTS + 7));
  95. addInput(createInputCentered<ThemedPJ301MPort>(mm2px(Vec(17.788, 113.005)), module, SHASR::TRIG_INPUTS + 7));
  96. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 42.113)), module, SHASR::SH_OUTPUTS + 0));
  97. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 52.241)), module, SHASR::SH_OUTPUTS + 1));
  98. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 62.368)), module, SHASR::SH_OUTPUTS + 2));
  99. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 72.496)), module, SHASR::SH_OUTPUTS + 3));
  100. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 82.623)), module, SHASR::SH_OUTPUTS + 4));
  101. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 92.75)), module, SHASR::SH_OUTPUTS + 5));
  102. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 102.878)), module, SHASR::SH_OUTPUTS + 6));
  103. addOutput(createOutputCentered<ThemedPJ301MPort>(mm2px(Vec(28.6, 113.005)), module, SHASR::SH_OUTPUTS + 7));
  104. }
  105. };
  106. Model* modelSHASR = createModel<SHASR, SHASRWidget>("SHASR");