frac32.positive offset inside the table
frac32.positive length of the area to index,or loop end
frac32.positive start position on 'reset'
frac32.positive loopstart relative to 'range'
frac32.bipolar speed modulation
bool32.risingfalling play or dont
bool32.rising reset to 'startpoint'
frac32buffer.positive phase
int32 loop count since reset
int32 lenght of the loop in samples
frac32.s.map speed ,+ 64 normal speed forward, - 64 backward
objref table
float32_t index;
uint32_t r;
uint32_t pos;
int shift;
int range;
int t_speed;
int loopstart;
int reset;
int count;
bool add;
index = 0;
r = 1;
// set 'shift factor' for storing the recording length/the sync output
if (attr_table.LENGTH == 2048) {
shift = 16;
}
if (attr_table.LENGTH == 4096) {
shift = 15;
}
if (attr_table.LENGTH == 8192) {
shift = 14;
}
if (attr_table.LENGTH == 16384) {
shift = 13;
}
if (attr_table.LENGTH == 32768) {
shift = 12;
}
if (attr_table.LENGTH == 65536) {
shift = 11;
}
if (attr_table.LENGTH == 131072) {
shift = 10;
}
if (attr_table.LENGTH == 262144) {
shift = 9;
}
if (attr_table.LENGTH == 524288) {
shift = 8;
}
if (attr_table.LENGTH == 1048576) {
shift = 7;
}
if (attr_table.LENGTH == 2097152) {
shift = 6;
}
if (attr_table.LENGTH == 4194304) {
shift = 5;
}
range = (inlet_range >> shift);
loopstart = ((___SMMUL(inlet_range, inlet_loopstart) << 5) >> shift);
t_speed = (inlet_speed + param_speed);
reset = (inlet_startpoint >> shift);
if (inlet_reset && r) {
index = (reset - loopstart);
r = 0;
count = 0;
} else {
if (!inlet_reset)
r = 1;
index += (t_speed * (float)(1.0f / (1 << 27)));
pos = (index + loopstart);
add = range;
// set a range
if (t_speed > 0) {
if (pos >= range) {
index = 0;
count += add;
}
} else {
if (pos <= loopstart) {
index = (range - loopstart);
count += add;
}
}
}
if (inlet_play)
outlet_pos = ((pos << shift) + inlet_offset);
else
outlet_pos = 0;
outlet_count = count;
outlet_smps = (range - loopstart);