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.

93 lines
2.8KB

  1. #include "XFade.hpp"
  2. void XFade::onSampleRateChange() {
  3. _mixSL.setParams(engineGetSampleRate(), 10.0f, 2.0f);
  4. }
  5. void XFade::step() {
  6. bool linear = params[LINEAR_PARAM].value > 0.5f;
  7. lights[LINEAR_LIGHT].value = linear;
  8. if (!outputs[OUT_OUTPUT].active) {
  9. return;
  10. }
  11. float mix = params[MIX_PARAM].value;
  12. if (inputs[MIX_INPUT].active) {
  13. mix *= clamp(inputs[MIX_INPUT].value / 5.0f, -1.0f, 1.0f);
  14. }
  15. mix = _mixSL.next(mix);
  16. float curveIn = params[CURVE_PARAM].value;
  17. if (_linear != linear || _mix != mix || _curveIn != curveIn) {
  18. _linear = linear;
  19. _mix = mix;
  20. _curveIn = curveIn;
  21. if (!linear) {
  22. curveIn = powf(params[CURVE_PARAM].value, 0.082f);
  23. }
  24. curveIn *= 2.0f;
  25. curveIn -= 1.0f;
  26. _mixer.setParams(mix, curveIn, linear);
  27. }
  28. outputs[OUT_OUTPUT].value = _mixer.next(inputs[A_INPUT].value, inputs[B_INPUT].value);
  29. }
  30. struct XFadeWidget : ModuleWidget {
  31. static constexpr int hp = 3;
  32. XFadeWidget(XFade* module) : ModuleWidget(module) {
  33. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  34. {
  35. SVGPanel *panel = new SVGPanel();
  36. panel->box.size = box.size;
  37. panel->setBackground(SVG::load(assetPlugin(plugin, "res/XFade.svg")));
  38. addChild(panel);
  39. }
  40. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  41. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  42. // generated by svg_widgets.rb
  43. auto mixParamPosition = Vec(8.0, 36.0);
  44. auto curveParamPosition = Vec(14.5, 148.5);
  45. auto linearParamPosition = Vec(29.4, 175.9);
  46. auto mixInputPosition = Vec(10.5, 77.0);
  47. auto aInputPosition = Vec(10.5, 213.0);
  48. auto bInputPosition = Vec(10.5, 248.0);
  49. auto outOutputPosition = Vec(10.5, 286.0);
  50. auto linearLightPosition = Vec(6.5, 177.5);
  51. // end generated by svg_widgets.rb
  52. addParam(ParamWidget::create<Knob29>(mixParamPosition, module, XFade::MIX_PARAM, -1.0, 1.0, 0.0));
  53. {
  54. auto w = ParamWidget::create<Knob16>(curveParamPosition, module, XFade::CURVE_PARAM, 0.0, 1.0, 0.5);
  55. auto k = dynamic_cast<SVGKnob*>(w);
  56. k->minAngle = -0.5 * M_PI;
  57. k->maxAngle = 0.5 * M_PI;
  58. addParam(w);
  59. }
  60. addParam(ParamWidget::create<StatefulButton9>(linearParamPosition, module, XFade::LINEAR_PARAM, 0.0, 1.0, 0.0));
  61. addInput(Port::create<Port24>(mixInputPosition, Port::INPUT, module, XFade::MIX_INPUT));
  62. addInput(Port::create<Port24>(aInputPosition, Port::INPUT, module, XFade::A_INPUT));
  63. addInput(Port::create<Port24>(bInputPosition, Port::INPUT, module, XFade::B_INPUT));
  64. addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, XFade::OUT_OUTPUT));
  65. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(linearLightPosition, module, XFade::LINEAR_LIGHT));
  66. }
  67. };
  68. RACK_PLUGIN_MODEL_INIT(Bogaudio, XFade) {
  69. Model *modelXFade = createModel<XFade, XFadeWidget>("Bogaudio-XFade", "XFade", "crossfader", MIXER_TAG);
  70. return modelXFade;
  71. }