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.

98 lines
3.0KB

  1. #include "AudibleInstruments.hpp"
  2. #include "dsp/digital.hpp"
  3. struct Kinks : Module {
  4. enum ParamIds {
  5. NUM_PARAMS
  6. };
  7. enum InputIds {
  8. SIGN_INPUT,
  9. LOGIC_A_INPUT,
  10. LOGIC_B_INPUT,
  11. SH_INPUT,
  12. TRIG_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. INVERT_OUTPUT,
  17. HALF_RECTIFY_OUTPUT,
  18. FULL_RECTIFY_OUTPUT,
  19. MAX_OUTPUT,
  20. MIN_OUTPUT,
  21. NOISE_OUTPUT,
  22. SH_OUTPUT,
  23. NUM_OUTPUTS
  24. };
  25. SchmittTrigger trigger;
  26. float sample = 0.0;
  27. float lights[3] = {};
  28. Kinks() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {
  29. trigger.setThresholds(0.0, 0.7);
  30. }
  31. void step() override;
  32. };
  33. void Kinks::step() {
  34. // Gaussian noise generator
  35. float noise = 2.0 * randomNormal();
  36. // S&H
  37. if (trigger.process(inputs[TRIG_INPUT].value)) {
  38. sample = inputs[SH_INPUT].normalize(noise);
  39. }
  40. // lights
  41. lights[0] = inputs[SIGN_INPUT].value;
  42. lights[1] = inputs[LOGIC_A_INPUT].value + inputs[LOGIC_B_INPUT].value;
  43. lights[2] = sample;
  44. // outputs
  45. outputs[INVERT_OUTPUT].value = -inputs[SIGN_INPUT].value;
  46. outputs[HALF_RECTIFY_OUTPUT].value = fmaxf(0.0, inputs[SIGN_INPUT].value);
  47. outputs[FULL_RECTIFY_OUTPUT].value = fabsf(inputs[SIGN_INPUT].value);
  48. outputs[MAX_OUTPUT].value = fmaxf(inputs[LOGIC_A_INPUT].value, inputs[LOGIC_B_INPUT].value);
  49. outputs[MIN_OUTPUT].value = fminf(inputs[LOGIC_A_INPUT].value, inputs[LOGIC_B_INPUT].value);
  50. outputs[NOISE_OUTPUT].value = noise;
  51. outputs[SH_OUTPUT].value = sample;
  52. }
  53. KinksWidget::KinksWidget() {
  54. Kinks *module = new Kinks();
  55. setModule(module);
  56. box.size = Vec(15*4, 380);
  57. {
  58. Panel *panel = new LightPanel();
  59. panel->backgroundImage = Image::load(assetPlugin(plugin, "res/Kinks.png"));
  60. panel->box.size = box.size;
  61. addChild(panel);
  62. }
  63. addChild(createScrew<ScrewSilver>(Vec(15, 0)));
  64. addChild(createScrew<ScrewSilver>(Vec(15, 365)));
  65. addInput(createInput<PJ301MPort>(Vec(4, 75), module, Kinks::SIGN_INPUT));
  66. addOutput(createOutput<PJ301MPort>(Vec(31, 75), module, Kinks::INVERT_OUTPUT));
  67. addOutput(createOutput<PJ301MPort>(Vec(4, 113), module, Kinks::HALF_RECTIFY_OUTPUT));
  68. addOutput(createOutput<PJ301MPort>(Vec(31, 113), module, Kinks::FULL_RECTIFY_OUTPUT));
  69. addInput(createInput<PJ301MPort>(Vec(4, 177), module, Kinks::LOGIC_A_INPUT));
  70. addInput(createInput<PJ301MPort>(Vec(31, 177), module, Kinks::LOGIC_B_INPUT));
  71. addOutput(createOutput<PJ301MPort>(Vec(4, 214), module, Kinks::MAX_OUTPUT));
  72. addOutput(createOutput<PJ301MPort>(Vec(31, 214), module, Kinks::MIN_OUTPUT));
  73. addInput(createInput<PJ301MPort>(Vec(4, 278), module, Kinks::SH_INPUT));
  74. addInput(createInput<PJ301MPort>(Vec(31, 278), module, Kinks::TRIG_INPUT));
  75. addOutput(createOutput<PJ301MPort>(Vec(4, 316), module, Kinks::NOISE_OUTPUT));
  76. addOutput(createOutput<PJ301MPort>(Vec(31, 316), module, Kinks::SH_OUTPUT));
  77. addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(11, 59), &module->lights[0]));
  78. addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(11, 161), &module->lights[1]));
  79. addChild(createValueLight<SmallLight<GreenRedPolarityLight>>(Vec(11, 262), &module->lights[2]));
  80. }