frac32.bipolar sample increment,+ 64 normal speed forward, - 64 backward
frac32buffer.positive length of the loop inside range
frac32buffer.positive start of the loop inside range
bool32.rising reset to zero
frac32.positive offset inside the table
frac32.positive length of the area to index,or loop end
frac32buffer.positive phase
int32 loop count since reset
objref table
float32_t index;
uint32_t r;
uint32_t pos;
int shift;
int range;
int looplength;
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);
looplength = ((___SMMUL(inlet_range, inlet_looplength) << 5) >> 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)) || (pos >= (loopstart + looplength))) {
index = 0;
count += add;
}
} else {
if (pos <= loopstart) {
index = (looplength);
count += add;
}
// the next line is causing problems:'index' will start oscillating when
// 'inlet_loopstart' and 'inlet_looplength' are BOTH greater than 64
// (K-rate units)
if (pos >= (range)) {
index = (range - loopstart);
count += add;
}
}
}
outlet_pos = ((pos << shift) + inlet_offset);
outlet_count = count;
}