bool32.rising trig
frac32.positive defphase
frac32.positive defpos
int32 sel
int32 sel
bool32.pulse trig
frac32.positive phase
frac32.positive pos
frac32.s.map speed
bool32.tgl reverse
frac32.u.map.ratio start
frac32.u.map.ratio len
combo size
bool ttrig;
bool env;
int32_t freq;
uint32_t phase;
uint32_t phase_old;
int32_t pos;
int32_t sample_len;
ttrig = 0;
env = 0;
freq = 0;
phase_old = 0;
phase = 0;
pos = 0;
sample_len = 1 << attr_size;
freq = (4294967296 /
(___SMMUL(___SMMUL((1 << 27) - param_start << 3, param_len << 3),
sample_len << 4) +
1)) *
16;
freq += ___SMMUL(freq, param_speed) << 5;
if (inlet_trig && !ttrig && !inlet_sel) // se viene premuto il tasto
{
ttrig = 1;
env = 1;
phase = 0;
} else if (inlet_trig && !ttrig && inlet_sel) // se viene premuto il tasto
{
ttrig = 1;
env = 0;
phase = 0;
} else if (!inlet_trig) // se viene rilasciato il tasto
ttrig = 0;
if (!env) // se non siamo in fase di inviluppo
{
outlet_phase = inlet_defphase;
outlet_pos = inlet_defpos;
} else {
phase += freq; // il contatore avanza di un tot
if (phase >= phase_old) // se il contatore non ha resettato
{
phase_old = phase; // ok, continuiamo a contare
if (!param_reverse)
pos = param_start +
___SMMUL(phase >> 1,
___SMMUL((1 << 27) - param_start << 3,
param_len << 3)); // calcoliamo la nuova posizione
else
pos = param_start +
___SMMUL((1 << 27) - param_start << 3, param_len << 2) -
___SMMUL(phase >> 1,
___SMMUL((1 << 27) - param_start << 3, param_len << 3));
} else // se invece il contatore ha resettato
{
ttrig = 0; // rendiamo di nuovo disponibile il campione
env = 0; // non siamo più in fase di inviluppo
phase = 0;
phase_old = 0;
}
outlet_pos = pos;
outlet_phase = phase >> 5;
}
outlet_trig = inlet_trig;
outlet_sel = inlet_sel - 1;