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.

115 lines
4.1KB

  1. #include "plugin.hpp"
  2. struct Kinks : Module {
  3. enum ParamIds {
  4. NUM_PARAMS
  5. };
  6. enum InputIds {
  7. SIGN_INPUT,
  8. LOGIC_A_INPUT,
  9. LOGIC_B_INPUT,
  10. SH_INPUT,
  11. TRIG_INPUT,
  12. NUM_INPUTS
  13. };
  14. enum OutputIds {
  15. INVERT_OUTPUT,
  16. HALF_RECTIFY_OUTPUT,
  17. FULL_RECTIFY_OUTPUT,
  18. MAX_OUTPUT,
  19. MIN_OUTPUT,
  20. NOISE_OUTPUT,
  21. SH_OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. enum LightIds {
  25. SIGN_POS_LIGHT, SIGN_NEG_LIGHT,
  26. LOGIC_POS_LIGHT, LOGIC_NEG_LIGHT,
  27. SH_POS_LIGHT, SH_NEG_LIGHT,
  28. NUM_LIGHTS
  29. };
  30. dsp::SchmittTrigger trigger;
  31. float sample = 0.0;
  32. Kinks() {
  33. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
  34. configInput(SIGN_INPUT, "Sign");
  35. configInput(LOGIC_A_INPUT, "Logic A");
  36. configInput(LOGIC_B_INPUT, "Logic B");
  37. configInput(SH_INPUT, "Sample & hold");
  38. configInput(TRIG_INPUT, "S&H trigger");
  39. configOutput(INVERT_OUTPUT, "Invert");
  40. configOutput(HALF_RECTIFY_OUTPUT, "Half rectified");
  41. configOutput(FULL_RECTIFY_OUTPUT, "Full rectified");
  42. configOutput(MAX_OUTPUT, "Maximum");
  43. configOutput(MIN_OUTPUT, "Minimum");
  44. configOutput(NOISE_OUTPUT, "Noise");
  45. configOutput(SH_OUTPUT, "Sample & hold");
  46. }
  47. void process(const ProcessArgs& args) override {
  48. // Gaussian noise generator
  49. float noise = 2.0 * random::normal();
  50. // S&H
  51. if (trigger.process(inputs[TRIG_INPUT].getVoltage() / 0.7)) {
  52. sample = inputs[SH_INPUT].getNormalVoltage(noise);
  53. }
  54. // lights
  55. lights[SIGN_POS_LIGHT].setSmoothBrightness(fmaxf(0.0, inputs[SIGN_INPUT].getVoltage() / 5.0), args.sampleTime);
  56. lights[SIGN_NEG_LIGHT].setSmoothBrightness(fmaxf(0.0, -inputs[SIGN_INPUT].getVoltage() / 5.0), args.sampleTime);
  57. float logicSum = inputs[LOGIC_A_INPUT].getVoltage() + inputs[LOGIC_B_INPUT].getVoltage();
  58. lights[LOGIC_POS_LIGHT].setSmoothBrightness(fmaxf(0.0, logicSum / 5.0), args.sampleTime);
  59. lights[LOGIC_NEG_LIGHT].setSmoothBrightness(fmaxf(0.0, -logicSum / 5.0), args.sampleTime);
  60. lights[SH_POS_LIGHT].setBrightness(fmaxf(0.0, sample / 5.0));
  61. lights[SH_NEG_LIGHT].setBrightness(fmaxf(0.0, -sample / 5.0));
  62. // outputs
  63. outputs[INVERT_OUTPUT].setVoltage(-inputs[SIGN_INPUT].getVoltage());
  64. outputs[HALF_RECTIFY_OUTPUT].setVoltage(fmaxf(0.0, inputs[SIGN_INPUT].getVoltage()));
  65. outputs[FULL_RECTIFY_OUTPUT].setVoltage(fabsf(inputs[SIGN_INPUT].getVoltage()));
  66. outputs[MAX_OUTPUT].setVoltage(fmaxf(inputs[LOGIC_A_INPUT].getVoltage(), inputs[LOGIC_B_INPUT].getVoltage()));
  67. outputs[MIN_OUTPUT].setVoltage(fminf(inputs[LOGIC_A_INPUT].getVoltage(), inputs[LOGIC_B_INPUT].getVoltage()));
  68. outputs[NOISE_OUTPUT].setVoltage(noise);
  69. outputs[SH_OUTPUT].setVoltage(sample);
  70. }
  71. };
  72. struct KinksWidget : ModuleWidget {
  73. KinksWidget(Kinks* module) {
  74. setModule(module);
  75. setPanel(Svg::load(asset::plugin(pluginInstance, "res/Kinks.svg")));
  76. addChild(createWidget<ScrewSilver>(Vec(15, 0)));
  77. addChild(createWidget<ScrewSilver>(Vec(15, 365)));
  78. addInput(createInput<PJ301MPort>(Vec(4, 75), module, Kinks::SIGN_INPUT));
  79. addOutput(createOutput<PJ301MPort>(Vec(31, 75), module, Kinks::INVERT_OUTPUT));
  80. addOutput(createOutput<PJ301MPort>(Vec(4, 113), module, Kinks::HALF_RECTIFY_OUTPUT));
  81. addOutput(createOutput<PJ301MPort>(Vec(31, 113), module, Kinks::FULL_RECTIFY_OUTPUT));
  82. addInput(createInput<PJ301MPort>(Vec(4, 177), module, Kinks::LOGIC_A_INPUT));
  83. addInput(createInput<PJ301MPort>(Vec(31, 177), module, Kinks::LOGIC_B_INPUT));
  84. addOutput(createOutput<PJ301MPort>(Vec(4, 214), module, Kinks::MAX_OUTPUT));
  85. addOutput(createOutput<PJ301MPort>(Vec(31, 214), module, Kinks::MIN_OUTPUT));
  86. addInput(createInput<PJ301MPort>(Vec(4, 278), module, Kinks::SH_INPUT));
  87. addInput(createInput<PJ301MPort>(Vec(31, 278), module, Kinks::TRIG_INPUT));
  88. addOutput(createOutput<PJ301MPort>(Vec(4, 316), module, Kinks::NOISE_OUTPUT));
  89. addOutput(createOutput<PJ301MPort>(Vec(31, 316), module, Kinks::SH_OUTPUT));
  90. addChild(createLight<SmallLight<GreenRedLight>>(Vec(11, 59), module, Kinks::SIGN_POS_LIGHT));
  91. addChild(createLight<SmallLight<GreenRedLight>>(Vec(11, 161), module, Kinks::LOGIC_POS_LIGHT));
  92. addChild(createLight<SmallLight<GreenRedLight>>(Vec(11, 262), module, Kinks::SH_POS_LIGHT));
  93. }
  94. };
  95. Model* modelKinks = createModel<Kinks, KinksWidget>("Kinks");