bool32.rising reset to 'offset'
frac32.positive offset inside the table
frac32.positive length of the area to index,or loop end
frac32.positive loopstart inside 'range'
frac32.positive tansposition in semi-notes
frac32.bipolar speed modulation
bool32.risingfalling toggle playback
frac32buffer.positive position inside table
objref table to index
spinner forward or reverse
uint8_t shift;
uint8_t scale;
uint32_t lrange;
uint32_t lstart;
int32_t t_speed;
uint32_t inc;
int32_t index;
bool play;
bool rro;
shift = (27 - attr_wave.LENGTHPOW);
scale = (attr_wave.LENGTHPOW < 6) ? 0 : 4;
MTOFEXTENDED(inlet_transpose + (1 << 22) + 512000, inc);
t_speed = ((___SMMUL(inc, inlet_direction + (attr_direction << 21))) << 5) >>
(attr_wave.LENGTHPOW - (scale + 2));
lstart = (___SMMUL(inlet_range, inlet_loopstart) << 5) << scale;
lstart = (t_speed > 0) ? lstart : lstart - t_speed;
lrange = inlet_range << scale;
if (inlet_play && !play) {
play = 1;
index = 0;
}
if (!inlet_play)
play = 0;
if (inlet_reset && (!rro)) {
index = 0;
rro = 1;
}
if (!inlet_reset)
rro = 0;
if (!lrange)
play = 0;
if (t_speed > 0) {
if (index >= lrange)
index = lstart;
} else if (index <= lstart)
index = lrange;
outlet_phase = __USAT(((index >> scale) + inlet_offset), 27) * play;
index += t_speed;