frac32.bipolar sample increment,+ 64 normal speed forward, - 64 backward
bool32.rising reset to zero
frac32.positive length of the area to index,or loop end
frac32.positive start of the loop
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 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);
loopstart = ((___SMMUL(inlet_range, inlet_loopstart) << 5) >> shift);
{
if (inlet_reset && r) {
index = 0;
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);
outlet_count = count;
outlet_smps = (range - loopstart);
}