bool32.rising reset to zero
frac32.positive length of the area to index,or loop end
frac32.positive loopstart relative to 'range'
frac32.bipolar speed modulation
bool32.risingfalling play or dont
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 loopstart;
int count;
int reset;
int t_speed;
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);
if (inlet_reset && r) {
index = 0;
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);
else
outlet_pos = 0;
outlet_count = count;
outlet_smps = (range - loopstart);