|
- #include "XF.hpp"
-
- int XF_Correlator::correlate(float a, float b) {
- //Remove old samples
- if (n == frameSize) {
- covariance -= (samples_a[sp] * samples_b[sp]);
- sigma_a -= samples_a[sp];
- sigma_b -= samples_b[sp];
- sigma_a2 -= (samples_a[sp] * samples_a[sp]);
- sigma_b2 -= (samples_b[sp] * samples_b[sp]);
- }
- else {
- n++;
- }
-
- //Add new samples
- covariance += (a * b);
- sigma_a += samples_a[sp] = a;
- sigma_b += samples_b[sp] = b;
- sigma_a2 += (a * a);
- sigma_b2 += (b * b);
- sp++;
- if (sp > frameSize - 1) {
- sp -= frameSize;
- }
- float stdev_a = powf(sigma_a2 - (sigma_a * sigma_a / n), 0.5f);
- float stdev_b = powf(sigma_b2 - (sigma_b * sigma_b / n), 0.5f);
- if (stdev_a * stdev_b == 0.0f)
- correlation = (stdev_a == stdev_b);
- else
- correlation = covariance / (stdev_a * stdev_b);
- if (schmitt) {
- if (fabs(correlation) < 0.4)
- schmitt = 0;
- }
- else {
- if (fabs(correlation) > 0.6)
- schmitt = 1;
- }
- return schmitt;
- }
-
- void XF::crossFade(XF_Controls *controls) {
- 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);
- int mode = 0;
- if (params[controls->mode].value > 1.5f) {
- mode = controls->correlator->correlate(inputs[controls->a].value, inputs[controls->b].value);
- if (controls->correlator->correlation < -0.1f) {
- lights[controls->light3].value = 0.0f;
- lights[controls->light3 + 1].value = 1.0f;
- }
- else {
- lights[controls->light3].value = 1.0f;
- lights[controls->light3 + 1].value = 0.0f;
- }
- }
- else if (params[controls->mode].value > 0.5f) {
- mode = 0;
- lights[controls->light3].value = 0.0f;
- lights[controls->light3 + 1].value = 0.0f;
- }
- else {
- mode = 1;
- lights[controls->light3].value = 0.0f;
- lights[controls->light3 + 1].value = 0.0f;
- }
- if (mode == 0) {
- outputs[controls->out].value = inputs[controls->a].value * powf(1.0f - fade, 0.5f) + inputs[controls->b].value * powf(fade, 0.5f);
- if (controls->outr)
- outputs[controls->outr].value = inputs[controls->ar].value * powf(1.0f - fade, 0.5f) + inputs[controls->br].value * powf(fade, 0.5f);
- lights[controls->light1].value = 0.0f;
- lights[controls->light2].value = 1.0f;
- }
- else {
- outputs[controls->out].value = inputs[controls->a].value * (1.0f - fade) + inputs[controls->b].value * fade;
- if (controls->outr)
- outputs[controls->outr].value = inputs[controls->ar].value * (1.0f - fade) + inputs[controls->br].value * fade;
- lights[controls->light1].value = 1.0f;
- lights[controls->light2].value = 0.0f;
- }
- }
-
- void XF_LightKnob::step() {
- if (link) {
- setEnabled(!module->inputs[cv].active && (module->params[link].value < 0.5f));
- }
- else {
- setEnabled(!module->inputs[cv].active);
- }
- Knob::step();
- }
|