frac32.positive offset inside the table
frac32.positive length of the area to index,or loop end
frac32.positive start position inside 'range' on 'reset'
frac32.positive start of the loop
frac32.bipolar sample increment,+ 64 normal speed forward, - 64 backward
bool32.rising reset to 'startpoint'
frac32buffer.positive phase
int32 loop count since reset
int32 lenght of the loop in samples
objref table
float32_t index;
uint32_t r;
uint32_t pos;
int shift;
int range;
int reset;
int loopstart;
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);
reset = ((___SMMUL(inlet_range, inlet_startpoint) << 5) >> shift);
loopstart = ((___SMMUL(inlet_range, inlet_loopstart) << 5) >> shift);
{
if (inlet_reset && r) {
index = reset;
r = 0;
count = 0;
} else {
if (!inlet_reset)
r = 1;
index += (inlet_speed * (float)(1.0f / (1 << 27)));
pos = (index + loopstart);
add = range;
// set a range
if (inlet_speed > 0) {
if (pos >= (range)) {
index = 0;
count += add;
}
} else {
if (pos <= loopstart) {
index = (range - loopstart);
count += add;
}
}
}
outlet_pos = ((pos << shift) + inlet_offset);
outlet_count = count;
outlet_smps = (range - loopstart);
}