frac32buffer in
frac32.bipolar pitch_slave
frac32.bipolar pitch master
frac32buffer.bipolar out
frac32.s.map.pitch pitch slave
frac32.s.map.pitch pitch master
int32_t y[8], v, integ;
int32_t in, _in;
float p, dp, _64dp, pM, dpM, _dpM, _64dpM;
uint8_t i;
p = pM = 0;
y[0] = y[1] = y[2] = y[3] = y[4] = y[5] = y[6] = y[7] = v = integ = 0;
i = 0;
in = _in = 0;
int32_t idp;
MTOFEXTENDED(param_pitch_space_slave + inlet_pitch_space_slave, idp);
dp = (idp * (0.25f / (1 << 30)));
if (dp > 1)
dp = 1;
_64dp = 64.0f / dp;
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
MTOFEXTENDED(param_pitch_space_master + inlet_pitch_space_master, idp);
dpM = (idp * (0.25f / (1 << 30)));
if (dpM > 1)
dpM = 1;
_dpM = 1 / dpM;
_64dpM = 64.0f * _dpM;
in = inlet_in;
// phase increment
pM += dpM; // Master
p += dp; // Slave
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
// synchro ?
if (pM >= 1) { // phase above 1
pM -= 1; // reset Master phase
float aM = pM * _64dpM;
// The slave can reset itself in the same sample interval than a sync
// we take account of it if it happens before the sync
if (p >= 1) {
p -= 1;
float a = p * _64dp;
if (a > aM) { // slave before master
// select the band limited pulse according to subsample time since the
// transition
const int16_t *t = tiar_bli_8_64 + (((uint32_t)a) << 3);
int32_t x = (in + ((int32_t)a) * ((_in - in) / 64)) >> 9;
int32_t g =
x - v; // gain= the diff between the new step and the current value
// add the selected band limited pulse to the output 8 taps
for (int j = 0; j <= 7; j++) {
y[(i + j) & 7] += g * t[j];
}
v += g; // now we can say that the value corresponds to the current step
}
}
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
p = pM * _dpM * dp; // reset Slave phase taking account of subsample time
// select the band limited pulse according to subsample time since the
// transition
const int16_t *t = tiar_bli_8_64 + (((uint32_t)aM) << 3);
int32_t x = (in + ((int32_t)aM) * ((_in - in) / 64)) >> 9;
int32_t g =
x - v; // gain = the diff between the new step and the current value
// add the selected band limited pulse to the output 8 taps
for (int j = 0; j <= 7; j++) {
y[(i + j) & 7] += g * t[j];
}
v += g; // now we can say that the value corresponds to the current step //...
} else {
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
// transition ?
if (p >= 1.0f) { // phase above 1
p -= 1.0f; // reset phase
// select the band limited pulse according to subsample time since the
// transition
float a = p * _64dp;
const int16_t *t = tiar_bli_8_64 + (((uint32_t)a) << 3);
int32_t x = (in + ((int32_t)a) * ((_in - in) / 64)) >> 9;
int32_t g =
x - v; // gain= the diff between the new step and the current value
// add the selected band limited pulse to the output 8 taps
for (int j = 0; j <= 7; j++) {
y[(i + j) & 7] += g * t[j];
}
v += g; // now we can say that the value corresponds to the current step
}
}
outlet_out = integ += y[i]; // output integrator
y[i] = 0;
i = (i + 1) & 7;
_in = in;