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.

163 lines
5.4KB

  1. #include <math.h>
  2. #include <algorithm>
  3. #include "Test2.hpp"
  4. #include "pitch.hpp"
  5. void Test2::onReset() {
  6. }
  7. void Test2::step() {
  8. if (!outputs[OUT_OUTPUT].active) {
  9. return;
  10. }
  11. #ifdef COMPLEX_BIQUAD
  12. _complexBiquad.setComplexParams(
  13. params[PARAM1B_PARAM].value,
  14. params[PARAM2A_PARAM].value,
  15. params[PARAM2B_PARAM].value * M_PI,
  16. std::min(params[PARAM3A_PARAM].value, 0.9f),
  17. params[PARAM3B_PARAM].value * M_PI
  18. );
  19. float in = 0.0f;
  20. if (inputs[IN_INPUT].active) {
  21. in = inputs[IN_INPUT].value;
  22. }
  23. outputs[OUT_OUTPUT].value = _complexBiquad.next(in);
  24. #elif MULTIPOLE
  25. ++_steps;
  26. if (_steps >= maxSteps) {
  27. _steps = 0;
  28. _filter.setParams(
  29. params[PARAM2A_PARAM].value <= 0.5f ? MultipoleFilter::LP_TYPE : MultipoleFilter::HP_TYPE,
  30. 2 * clamp((int)(params[PARAM1B_PARAM].value * (MultipoleFilter::maxPoles / 2)), 1, MultipoleFilter::maxPoles / 2),
  31. engineGetSampleRate(),
  32. params[PARAM1A_PARAM].value * engineGetSampleRate() / 2.0f,
  33. params[PARAM2B_PARAM].value * MultipoleFilter::maxRipple
  34. );
  35. // _filter.setParams(
  36. // MultipoleFilter::HP_TYPE,
  37. // 4,
  38. // engineGetSampleRate(),
  39. // 0.1f * engineGetSampleRate(),
  40. // 0.1f
  41. // );
  42. }
  43. float in = 0.0f;
  44. if (inputs[IN_INPUT].active) {
  45. in = inputs[IN_INPUT].value;
  46. }
  47. outputs[OUT_OUTPUT].value = _filter.next(in);
  48. #elif ADSR_ENVELOPE
  49. if (outputs[OUT_OUTPUT].active) {
  50. _adsr.setSampleRate(engineGetSampleRate());
  51. if (inputs[IN_INPUT].active) {
  52. _trigger.process(inputs[IN_INPUT].value);
  53. }
  54. _adsr.setGate(_trigger.isHigh());
  55. _adsr.setAttack(powf(params[PARAM1A_PARAM].value, 2.0f) * 10.0f);
  56. _adsr.setDecay(powf(params[PARAM1B_PARAM].value, 2.0f) * 10.0f);
  57. _adsr.setSustain(params[PARAM2A_PARAM].value);
  58. _adsr.setRelease(powf(params[PARAM2B_PARAM].value, 2.0f) * 10.0f);
  59. float attackShape = params[PARAM3A_PARAM].value;
  60. if (attackShape < 0.5f) {
  61. attackShape += 0.5f;
  62. }
  63. else {
  64. attackShape -= 0.5;
  65. attackShape *= 2.0f;
  66. attackShape += 1.0f;
  67. }
  68. float decayShape = params[PARAM3B_PARAM].value;
  69. if (decayShape < 0.5f) {
  70. decayShape += 0.5f;
  71. }
  72. else {
  73. decayShape -= 0.5;
  74. decayShape *= 2.0f;
  75. decayShape += 1.0f;
  76. }
  77. _adsr.setShapes(attackShape, decayShape, decayShape);
  78. outputs[OUT_OUTPUT].value = _adsr.next() * 10.0f;
  79. }
  80. #elif LIMITER
  81. float shape = params[PARAM1A_PARAM].value * 5.0f;
  82. float knee = params[PARAM2A_PARAM].value * 10.0f;
  83. float limit = params[PARAM2B_PARAM].value * 15.0f;
  84. float scale = params[PARAM1B_PARAM].value * 2.0f + 1.0f;
  85. _limiter.setParams(shape, knee, limit, scale);
  86. outputs[OUT_OUTPUT].value = _limiter.next(inputs[IN_INPUT].value);
  87. #endif
  88. }
  89. // float Test2::oscillatorPitch1A() {
  90. // if (inputs[CV1A_INPUT].active) {
  91. // return cvToFrequency(inputs[CV1A_INPUT].value);
  92. // }
  93. // return 10000.0 * powf(params[PARAM1_PARAM].value, 2.0);
  94. // }
  95. struct Test2Widget : ModuleWidget {
  96. Test2Widget(Test2* module) : ModuleWidget(module) {
  97. box.size = Vec(RACK_GRID_WIDTH * 6, RACK_GRID_HEIGHT);
  98. {
  99. SVGPanel *panel = new SVGPanel();
  100. panel->box.size = box.size;
  101. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Test2.svg")));
  102. addChild(panel);
  103. }
  104. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  105. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  106. // generated by svg_widgets.rb
  107. auto param1aParamPosition = Vec(9.5, 38.5);
  108. auto param2aParamPosition = Vec(9.5, 138.5);
  109. auto param3aParamPosition = Vec(9.5, 238.5);
  110. auto param1bParamPosition = Vec(54.5, 38.5);
  111. auto param2bParamPosition = Vec(54.5, 138.5);
  112. auto param3bParamPosition = Vec(54.5, 238.5);
  113. auto cv1aInputPosition = Vec(10.5, 78.0);
  114. auto cv2aInputPosition = Vec(10.5, 178.0);
  115. auto cv3aInputPosition = Vec(10.5, 278.0);
  116. auto cv1bInputPosition = Vec(55.5, 78.0);
  117. auto cv2bInputPosition = Vec(55.5, 178.0);
  118. auto cv3bInputPosition = Vec(55.5, 278.0);
  119. auto inInputPosition = Vec(10.5, 323.0);
  120. auto outOutputPosition = Vec(55.5, 323.0);
  121. // end generated by svg_widgets.rb
  122. addParam(ParamWidget::create<Knob26>(param1aParamPosition, module, Test2::PARAM1A_PARAM, 0.0, 1.0, 0.0));
  123. addParam(ParamWidget::create<Knob26>(param2aParamPosition, module, Test2::PARAM2A_PARAM, 0.0, 1.0, 0.0));
  124. addParam(ParamWidget::create<Knob26>(param3aParamPosition, module, Test2::PARAM3A_PARAM, 0.0, 1.0, 0.0));
  125. addParam(ParamWidget::create<Knob26>(param1bParamPosition, module, Test2::PARAM1B_PARAM, 0.0, 1.0, 0.0));
  126. addParam(ParamWidget::create<Knob26>(param2bParamPosition, module, Test2::PARAM2B_PARAM, 0.0, 1.0, 0.0));
  127. addParam(ParamWidget::create<Knob26>(param3bParamPosition, module, Test2::PARAM3B_PARAM, 0.0, 1.0, 0.0));
  128. addInput(Port::create<Port24>(cv1aInputPosition, Port::INPUT, module, Test2::CV1A_INPUT));
  129. addInput(Port::create<Port24>(cv2aInputPosition, Port::INPUT, module, Test2::CV2A_INPUT));
  130. addInput(Port::create<Port24>(cv3aInputPosition, Port::INPUT, module, Test2::CV3A_INPUT));
  131. addInput(Port::create<Port24>(cv1bInputPosition, Port::INPUT, module, Test2::CV1B_INPUT));
  132. addInput(Port::create<Port24>(cv2bInputPosition, Port::INPUT, module, Test2::CV2B_INPUT));
  133. addInput(Port::create<Port24>(cv3bInputPosition, Port::INPUT, module, Test2::CV3B_INPUT));
  134. addInput(Port::create<Port24>(inInputPosition, Port::INPUT, module, Test2::IN_INPUT));
  135. addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, Test2::OUT_OUTPUT));
  136. }
  137. };
  138. RACK_PLUGIN_MODEL_INIT(Bogaudio, Test2) {
  139. Model *modelTest2 = Model::create<Test2, Test2Widget>("Bogaudio", "Bogaudio-Test2", "Test2");
  140. return modelTest2;
  141. }