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.

99 lines
3.6KB

  1. #include "plugin.hpp"
  2. struct DualAtenuverter : Module {
  3. enum ParamIds {
  4. ATEN1_PARAM,
  5. OFFSET1_PARAM,
  6. ATEN2_PARAM,
  7. OFFSET2_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. IN1_INPUT,
  12. IN2_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. OUT1_OUTPUT,
  17. OUT2_OUTPUT,
  18. NUM_OUTPUTS
  19. };
  20. enum LightIds {
  21. OUT1_POS_LIGHT,
  22. OUT1_NEG_LIGHT,
  23. OUT2_POS_LIGHT,
  24. OUT2_NEG_LIGHT,
  25. NUM_LIGHTS
  26. };
  27. DualAtenuverter() {
  28. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
  29. configParam(ATEN1_PARAM, -1.0, 1.0, 0.0, "Ch 1 gain");
  30. configParam(OFFSET1_PARAM, -10.0, 10.0, 0.0, "Ch 1 offset", " V");
  31. configParam(ATEN2_PARAM, -1.0, 1.0, 0.0, "Ch 2 gain");
  32. configParam(OFFSET2_PARAM, -10.0, 10.0, 0.0, "Ch 2 offset", " V");
  33. }
  34. void process(const ProcessArgs &args) override {
  35. simd::float_4 out1[4];
  36. simd::float_4 out2[4];
  37. int channels1 = inputs[IN1_INPUT].getChannels(); channels1 = channels1>0?channels1:1;
  38. int channels2 = inputs[IN2_INPUT].getChannels(); channels2 = channels2>0?channels2:1;
  39. simd::float_4 att1 = simd::float_4(params[ATEN1_PARAM].getValue());
  40. simd::float_4 att2 = simd::float_4(params[ATEN2_PARAM].getValue());
  41. simd::float_4 offset1 = simd::float_4(params[OFFSET1_PARAM].getValue());
  42. simd::float_4 offset2 = simd::float_4(params[OFFSET2_PARAM].getValue());
  43. for (int c = 0; c < channels1; c += 4) out1[c / 4] = clamp(simd::float_4::load(inputs[IN1_INPUT].getVoltages(c)) * att1 + offset1, -10.f, 10.f);
  44. for (int c = 0; c < channels2; c += 4) out2[c / 4] = clamp(simd::float_4::load(inputs[IN2_INPUT].getVoltages(c)) * att2 + offset2, -10.f, 10.f);
  45. outputs[OUT1_OUTPUT].setChannels(channels1);
  46. outputs[OUT2_OUTPUT].setChannels(channels2);
  47. for (int c = 0; c < channels1; c += 4) out1[c / 4].store(outputs[OUT1_OUTPUT].getVoltages(c));
  48. for (int c = 0; c < channels2; c += 4) out2[c / 4].store(outputs[OUT2_OUTPUT].getVoltages(c));
  49. float light1 = outputs[OUT1_OUTPUT].getVoltageSum()/channels1;
  50. float light2 = outputs[OUT2_OUTPUT].getVoltageSum()/channels2;
  51. lights[OUT1_POS_LIGHT].setSmoothBrightness(light1 / 5.f, args.sampleTime);
  52. lights[OUT1_NEG_LIGHT].setSmoothBrightness(-light1 / 5.f, args.sampleTime);
  53. lights[OUT2_POS_LIGHT].setSmoothBrightness(light2 / 5.f, args.sampleTime);
  54. lights[OUT2_NEG_LIGHT].setSmoothBrightness(-light2 / 5.f, args.sampleTime);
  55. }
  56. };
  57. struct DualAtenuverterWidget : ModuleWidget {
  58. DualAtenuverterWidget(DualAtenuverter *module) {
  59. setModule(module);
  60. setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/DualAtenuverter.svg")));
  61. addChild(createWidget<Knurlie>(Vec(15, 0)));
  62. addChild(createWidget<Knurlie>(Vec(15, 365)));
  63. addParam(createParam<Davies1900hWhiteKnob>(Vec(20, 33), module, DualAtenuverter::ATEN1_PARAM));
  64. addParam(createParam<Davies1900hRedKnob>(Vec(20, 91), module, DualAtenuverter::OFFSET1_PARAM));
  65. addParam(createParam<Davies1900hWhiteKnob>(Vec(20, 201), module, DualAtenuverter::ATEN2_PARAM));
  66. addParam(createParam<Davies1900hRedKnob>(Vec(20, 260), module, DualAtenuverter::OFFSET2_PARAM));
  67. addInput(createInput<PJ301MPort>(Vec(7, 152), module, DualAtenuverter::IN1_INPUT));
  68. addOutput(createOutput<PJ301MPort>(Vec(43, 152), module, DualAtenuverter::OUT1_OUTPUT));
  69. addInput(createInput<PJ301MPort>(Vec(7, 319), module, DualAtenuverter::IN2_INPUT));
  70. addOutput(createOutput<PJ301MPort>(Vec(43, 319), module, DualAtenuverter::OUT2_OUTPUT));
  71. addChild(createLight<MediumLight<GreenRedLight>>(Vec(33, 143), module, DualAtenuverter::OUT1_POS_LIGHT));
  72. addChild(createLight<MediumLight<GreenRedLight>>(Vec(33, 311), module, DualAtenuverter::OUT2_POS_LIGHT));
  73. }
  74. };
  75. Model *modelDualAtenuverter = createModel<DualAtenuverter, DualAtenuverterWidget>("DualAtenuverter");