bool32.rising reset
frac32.bipolar rate
frac32.positive start
frac32.positive out
// inlet_reset <- gate
// inlet rate 32 -> fixe, 64 -> en avant toute, 0 -> en arrière toute
// inlet_start est positif si inlet_start au max, freeRun
bool areset = false;
int32_t p = 0, dp;
// calc dp peut être négatif
dp = inlet_rate;
dp = ___SMMLA(dp, ___SMMUL(dp, dp), dp >> 15) >> 1;
if (inlet_reset && !areset && !(inlet_start >= 0x07800000))
p = 0;
areset = inlet_reset;
p += dp;
if (p >= (1 << 27))
p -= 1 << 27;
if (p < 0)
p += 1 << 27;
outlet_out = (p + inlet_start) & 0x07FFFFFF;