frac32buffer audio in
bool32.risingfalling record
int32 length in samples
bool32 state
frac32.positive length of recording in fraction of the table
bool32.tgl hard
frac32.s.map.kdecaytime.exp attack
frac32.s.map.kdecaytime.exp release
objref table
bool rec;
bool recstate;
uint32_t recpos;
uint8_t shift;
uint32_t shold;
uint32_t rhold;
int32_t env;
recpos = 0;
rec = 0;
// 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;
}
if (rec)
env = (param_hard)
? -(1 << 27)
: (1 << 27) - (___SMMUL((1 << 27) - env, param_attack) << 1);
else
env = ___SMMUL(env, param_release) << 1;
if (env == 0)
recstate = 0;
outlet_state = recstate;
outlet_range = rhold;
outlet_smps = shold;
if ((inlet_rec) && !rec) {
rec = 1;
recstate = 1;
recpos = 0;
}
if ((!inlet_rec) && rec) {
rhold = (recpos << shift);
shold = recpos;
rec = 0;
recpos = 0;
}
// record
if (recstate) {
recpos++;
if (recpos >= attr_table.LENGTH)
recpos = 0;
if (rec)
attr_table.array[recpos] =
__SSAT((___SMMUL((inlet_wave), env) << 5), 28) >> attr_table.GAIN;
else
attr_table.array[recpos] =
(__SSAT((___SMMUL((inlet_wave), env) << 5), 28) +
(attr_table.array[recpos] << attr_table.GAIN)) >>
attr_table.GAIN;
}