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.

120 lines
4.0KB

  1. #include "AS.hpp"
  2. struct AtNuVrTr : Module {
  3. enum ParamIds {
  4. ATEN1_PARAM,
  5. OFFSET1_PARAM,
  6. ATEN2_PARAM,
  7. OFFSET2_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. CV_ATEN_1,
  12. CV_ATEN_2,
  13. CV_OFFSET_1,
  14. CV_OFFSET_2,
  15. IN1_INPUT,
  16. IN2_INPUT,
  17. NUM_INPUTS
  18. };
  19. enum OutputIds {
  20. OUT1_OUTPUT,
  21. OUT2_OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. enum LightIds {
  25. OUT1_POS_LIGHT,
  26. OUT1_NEG_LIGHT,
  27. OUT2_POS_LIGHT,
  28. OUT2_NEG_LIGHT,
  29. NUM_LIGHTS
  30. };
  31. AtNuVrTr() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  32. void step() override;
  33. };
  34. void AtNuVrTr::step() {
  35. float cv_at1 = 0.0f;
  36. if(inputs[CV_ATEN_1].active){
  37. cv_at1 = rescale(inputs[CV_ATEN_1].value, -10.0f,10.0f, -1.0f, 1.0f);
  38. }
  39. float cv_off1 = 0.0f;
  40. if(inputs[CV_OFFSET_1].active){
  41. cv_off1 = rescale(inputs[CV_OFFSET_1].value, -10.0f,10.0f, -10.0f, 10.0f);
  42. }
  43. float atten1 = params[ATEN1_PARAM].value + cv_at1;
  44. float offset1 = params[OFFSET1_PARAM].value + cv_off1;
  45. float out1 = inputs[IN1_INPUT].value * atten1 + offset1;
  46. float cv_at2 = 0.0f;
  47. if(inputs[CV_ATEN_2].active){
  48. cv_at2 = rescale(inputs[CV_ATEN_2].value, -10.0f,10.0f, -1.0f, 1.0f);
  49. }
  50. float cv_off2 = 0.0f;
  51. if(inputs[CV_OFFSET_2].active){
  52. cv_off2 = rescale(inputs[CV_OFFSET_2].value, -10.0f,10.0f, -10.0f, 10.0f);
  53. }
  54. float atten2 = params[ATEN2_PARAM].value + cv_at2;
  55. float offset2 = params[OFFSET2_PARAM].value + cv_off2;
  56. float out2 = inputs[IN2_INPUT].value * atten2 + offset2;
  57. out1 = clamp(out1, -10.0f, 10.0f);
  58. out2 = clamp(out2, -10.0f, 10.0f);
  59. outputs[OUT1_OUTPUT].value = out1;
  60. outputs[OUT2_OUTPUT].value = out2;
  61. lights[OUT1_POS_LIGHT].value = fmaxf(0.0f, out1 / 5.0f);
  62. lights[OUT1_NEG_LIGHT].value = fmaxf(0.0f, -out1 / 5.0f);
  63. lights[OUT2_POS_LIGHT].value = fmaxf(0.0f, out2 / 5.0f);
  64. lights[OUT2_NEG_LIGHT].value = fmaxf(0.0f, -out2 / 5.0f);
  65. }
  66. struct AtNuVrTrWidget : ModuleWidget {
  67. AtNuVrTrWidget(AtNuVrTr *module) : ModuleWidget(module) {
  68. setPanel(SVG::load(assetPlugin(plugin, "res/AtNuVrTr.svg")));
  69. //SCREWS
  70. addChild(Widget::create<as_HexScrew>(Vec(RACK_GRID_WIDTH, 0)));
  71. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  72. addChild(Widget::create<as_HexScrew>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  73. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  74. const int group_offset = 160;
  75. //ATTN 1
  76. addParam(ParamWidget::create<as_KnobBlack>(Vec(34, 45), module, AtNuVrTr::ATEN1_PARAM, -1.0f, 1.0f, 0.0f));
  77. addParam(ParamWidget::create<as_Knob>(Vec(34, 100), module, AtNuVrTr::OFFSET1_PARAM, -10.0f, 10.0f, 0.0f));
  78. addChild(ModuleLightWidget::create<SmallLight<GreenRedLight>>(Vec(65, 95), module, AtNuVrTr::OUT1_POS_LIGHT));
  79. addInput(Port::create<as_PJ301MPort>(Vec(4, 51), Port::INPUT, module, AtNuVrTr::CV_ATEN_1));
  80. addInput(Port::create<as_PJ301MPort>(Vec(4, 106), Port::INPUT, module, AtNuVrTr::CV_OFFSET_1));
  81. addInput(Port::create<as_PJ301MPort>(Vec(8, 165), Port::INPUT, module, AtNuVrTr::IN1_INPUT));
  82. addOutput(Port::create<as_PJ301MPort>(Vec(43, 165), Port::OUTPUT, module, AtNuVrTr::OUT1_OUTPUT));
  83. //ATTN 2
  84. addParam(ParamWidget::create<as_KnobBlack>(Vec(34, 45+group_offset), module, AtNuVrTr::ATEN2_PARAM, -1.0f, 1.0f, 0.0f));
  85. addParam(ParamWidget::create<as_Knob>(Vec(34, 100+group_offset), module, AtNuVrTr::OFFSET2_PARAM, -10.0f, 10.0f, 0.0f));
  86. addChild(ModuleLightWidget::create<SmallLight<GreenRedLight>>(Vec(65, 95+group_offset), module, AtNuVrTr::OUT2_POS_LIGHT));
  87. addInput(Port::create<as_PJ301MPort>(Vec(4, 51+group_offset), Port::INPUT, module, AtNuVrTr::CV_ATEN_2));
  88. addInput(Port::create<as_PJ301MPort>(Vec(4, 106+group_offset), Port::INPUT, module, AtNuVrTr::CV_OFFSET_2));
  89. addInput(Port::create<as_PJ301MPort>(Vec(8, 165+group_offset), Port::INPUT, module, AtNuVrTr::IN2_INPUT));
  90. addOutput(Port::create<as_PJ301MPort>(Vec(43, 165+group_offset), Port::OUTPUT, module, AtNuVrTr::OUT2_OUTPUT));
  91. }
  92. };
  93. RACK_PLUGIN_MODEL_INIT(AS, AtNuVrTr) {
  94. Model *modelAtNuVrTr = Model::create<AtNuVrTr, AtNuVrTrWidget>("AS", "AtNuVrTr", "AtNuVrTr Attenuverter", ATTENUATOR_TAG, DUAL_TAG);
  95. return modelAtNuVrTr;
  96. }