frac32.bipolar pitch
frac32buffer.bipolar wave
frac32.s.map.pitch pitch
frac32.u.map.ratio R0
frac32.u.map.ratio R1
frac32.u.map.ratio R2
frac32.s.map l0
frac32.s.map l1
frac32.s.map l2
frac32.s.map l3
frac32.s.map l4
frac32.s.map l5
const int N = 3;
int cpt;
// Saw
float p, dp;
float R[3], _R[3], _1_R[3];
float l[7];
        p = 0.0f;
cpt = 0;
        int32_t idp;
MTOFEXTENDED(param_pitch + inlet_pitch, idp);
dp = idp * ((3 * 0.25f) / (1 << 30));
if (N * dp > 0.5f) {
  R[0] = R[1] = R[2] = 0.5f;
  _1_R[0] = _1_R[1] = _1_R[2] = _R[0] = _R[1] = _R[2] = 2.0f;
} else {
  R[0] = (param_R0) * (1.0f / (1 << 27));
  R[1] = (param_R1) * (1.0f / (1 << 27));
  R[2] = (param_R2) * (1.0f / (1 << 27));
  for (int i = 0; i < 3; i++) {
    if (R[i] < N * dp)
      R[i] = N * dp;
    else if (R[i] > 1 - N * dp)
      R[i] = 1 - N * dp;
    _R[i] = 1.0f / R[i];
    _1_R[i] = 1.0f / (1 - R[i]);
  }
}
l[0] = (float)param_l0;
l[1] = (float)param_l1;
l[2] = (float)param_l2;
l[3] = (float)param_l3;
l[4] = (float)param_l4;
l[5] = (float)param_l5;
l[6] = (float)param_l0; // for modulo
        p += dp;
if (p >= 1) {
  p -= 1;
  cpt++;
  if (cpt >= 3)
    cpt = 0;
}
float pr;
int i;
if (p < R[cpt]) {
  pr = p * _R[cpt];
  i = cpt << 1;
} else {
  pr = (p - R[cpt]) * _1_R[cpt];
  i = (cpt << 1) + 1;
}
float a = pr * pr * (3 - 2 * pr);
outlet_wave = (int32_t)((l[i] + a * (l[i + 1] - l[i])));