frac32 e
bool32.risingfalling gate
frac32.bipolar attack time modulation
frac32.bipolar decay time modulation
frac32.bipolar sustail level modulation
frac32.bipolar release time modulation
frac32buffer i
frac32buffer o
frac32.positive envelope output
frac32.s.map a
frac32.s.map d
frac32.s.map r
frac32.u.map s
bool32.tgl on
int32_t prev;
int32_t step;
int8_t stage;
int ntrig;
int32_t val;
stage = 0;
ntrig = 0;
val = 0;
// vca
step = (inlet_e - prev) >> 4;
int32_t i = prev;
prev = inlet_e;
// env
if ((inlet_g > 0) && !ntrig) {
stage = 1;
ntrig = 1;
}
if (!(inlet_g > 0) && ntrig) {
stage = 0;
ntrig = 0;
}
if (stage == 0) {
int32_t r1;
int32_t r2;
MTOF(-param_r - inlet_r, r1);
r1 = 0x7FFFFFFF - (r1 >> 2);
val = ___SMMUL(val, r1) << 1;
} else if (stage == 1) {
int32_t a;
MTOF(-param_a - inlet_a, a);
a = a >> 2;
val = val + a;
if (val < 0) {
val = 0x7FFFFFFF;
stage = 2;
}
} else if (stage == 2) {
int32_t s = __USAT(param_s + inlet_s, 27);
int32_t d;
MTOF(-param_d - inlet_d, d);
d = 0x7FFFFFFF - (d >> 2);
val = (s << 4) + (___SMMUL(val - (s << 4), d) << 1);
}
outlet_e = val >> 4;
// Env off
outlet_o = inlet_i;
// Env on
if (param_on) {
outlet_o = ___SMMUL(inlet_i, i) << 5;
i += step;
}