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.

92 lines
2.7KB

  1. #include "XF.hpp"
  2. int XF_Correlator::correlate(float a, float b) {
  3. //Remove old samples
  4. if (n == frameSize) {
  5. covariance -= (samples_a[sp] * samples_b[sp]);
  6. sigma_a -= samples_a[sp];
  7. sigma_b -= samples_b[sp];
  8. sigma_a2 -= (samples_a[sp] * samples_a[sp]);
  9. sigma_b2 -= (samples_b[sp] * samples_b[sp]);
  10. }
  11. else {
  12. n++;
  13. }
  14. //Add new samples
  15. covariance += (a * b);
  16. sigma_a += samples_a[sp] = a;
  17. sigma_b += samples_b[sp] = b;
  18. sigma_a2 += (a * a);
  19. sigma_b2 += (b * b);
  20. sp++;
  21. if (sp > frameSize - 1) {
  22. sp -= frameSize;
  23. }
  24. float stdev_a = powf(sigma_a2 - (sigma_a * sigma_a / n), 0.5f);
  25. float stdev_b = powf(sigma_b2 - (sigma_b * sigma_b / n), 0.5f);
  26. if (stdev_a * stdev_b == 0.0f)
  27. correlation = (stdev_a == stdev_b);
  28. else
  29. correlation = covariance / (stdev_a * stdev_b);
  30. if (schmitt) {
  31. if (fabs(correlation) < 0.4)
  32. schmitt = 0;
  33. }
  34. else {
  35. if (fabs(correlation) > 0.6)
  36. schmitt = 1;
  37. }
  38. return schmitt;
  39. }
  40. void XF::crossFade(XF_Controls *controls) {
  41. float fade = clamp((inputs[controls->cv].active?params[controls->polar].value * 5.0f + inputs[controls->cv].value:params[controls->fader].value)/10.0f, 0.0f, 1.0f);
  42. int mode = 0;
  43. if (params[controls->mode].value > 1.5f) {
  44. mode = controls->correlator->correlate(inputs[controls->a].value, inputs[controls->b].value);
  45. if (controls->correlator->correlation < -0.1f) {
  46. lights[controls->light3].value = 0.0f;
  47. lights[controls->light3 + 1].value = 1.0f;
  48. }
  49. else {
  50. lights[controls->light3].value = 1.0f;
  51. lights[controls->light3 + 1].value = 0.0f;
  52. }
  53. }
  54. else if (params[controls->mode].value > 0.5f) {
  55. mode = 0;
  56. lights[controls->light3].value = 0.0f;
  57. lights[controls->light3 + 1].value = 0.0f;
  58. }
  59. else {
  60. mode = 1;
  61. lights[controls->light3].value = 0.0f;
  62. lights[controls->light3 + 1].value = 0.0f;
  63. }
  64. if (mode == 0) {
  65. outputs[controls->out].value = inputs[controls->a].value * powf(1.0f - fade, 0.5f) + inputs[controls->b].value * powf(fade, 0.5f);
  66. if (controls->outr)
  67. outputs[controls->outr].value = inputs[controls->ar].value * powf(1.0f - fade, 0.5f) + inputs[controls->br].value * powf(fade, 0.5f);
  68. lights[controls->light1].value = 0.0f;
  69. lights[controls->light2].value = 1.0f;
  70. }
  71. else {
  72. outputs[controls->out].value = inputs[controls->a].value * (1.0f - fade) + inputs[controls->b].value * fade;
  73. if (controls->outr)
  74. outputs[controls->outr].value = inputs[controls->ar].value * (1.0f - fade) + inputs[controls->br].value * fade;
  75. lights[controls->light1].value = 1.0f;
  76. lights[controls->light2].value = 0.0f;
  77. }
  78. }
  79. void XF_LightKnob::step() {
  80. if (link) {
  81. setEnabled(!module->inputs[cv].active && (module->params[link].value < 0.5f));
  82. }
  83. else {
  84. setEnabled(!module->inputs[cv].active);
  85. }
  86. Knob::step();
  87. }