frac32.positive defphase
frac32.positive defpos
frac32.positive start
frac32.positive len
frac32 speed
bool32 reverse
int32 sel
bool32.rising trig
int32 sel
bool32.pulse trig
frac32.positive phase
frac32.positive pos
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) - inlet_start << 3, inlet_len << 3),
sample_len << 4) +
1)) *
16;
freq += ___SMMUL(freq, inlet_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 (!inlet_reverse)
pos = inlet_start +
___SMMUL(phase >> 1,
___SMMUL((1 << 27) - inlet_start << 3,
inlet_len << 3)); // calcoliamo la nuova posizione
else
pos = inlet_start +
___SMMUL((1 << 27) - inlet_start << 3, inlet_len << 2) -
___SMMUL(phase >> 1,
___SMMUL((1 << 27) - inlet_start << 3, inlet_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;