lrec multi_new

records audio to a table. the table can be divided into 1,2,4 or 8 slots. when 'sync' is enabled,recording will be synced to phase of the signal connected to 'pos', and after 'rec' is zero,recording will continue until the starting point is reached. after recording is done,the length if the recording in samples is sent out, as well as the length of the recording (in fraction of the table's size).
Author: Robert Schirmer
License: BSD
Github: rbrt/testing/lrec multi_new.axo

Inlets

frac32.positive phase

bool32.risingfalling record,set tempo

int32 select slot to record to

bool32 sync on/off

frac32buffer audio in

Outlets

int32 length of recording in samples

bool32 record state

frac32.positive offset

frac32.positive length of recording in fraction of the slot

frac32 recording offset when recording in sync

Attributes

objref table to record to

combo number of slots in the table

Declaration
bool rec;
int recpos;
int offset;
int rec_offset;
int rec_max;
int shift;
int start;
int mode;
int syncshift;
Init
recpos = 0;
rec = 0;
start = 0;
rec_max = attr_table.LENGTH >> attr_slots;

syncshift = 1 << 14;

// 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;
}
Control Rate
if ((inlet_rec) && !rec) {
  rec = 1;
  recpos = 0;
  start = inlet_phase;
  outlet_range = 0;
  outlet_smps = 0;
  outlet_startpoint = 0;
  mode = inlet_sync;
  offset = (((inlet_slot) << 21) >> attr_slots) << 6;
  rec_offset = (__USAT(offset, 27) >> (27 - attr_table.LENGTHPOW));
}

// rec stopped-wait for rollover
else if (!(inlet_rec)) {
  if (mode) {
    if ((inlet_phase > (start - syncshift)) &&
        (inlet_phase < (start + syncshift)))
      rec = 0;
  } else
    rec = 0;
}

// rec done
if (!rec) {
  outlet_range = (recpos << shift);
  outlet_smps = recpos;
  if (mode)
    outlet_startpoint = start;
  else
    outlet_startpoint = 0;
}

outlet_rec = rec;
outlet_offset = offset;
Audio Rate
// record
if (rec) {
  recpos++;
  if (recpos >= rec_max)
    recpos = 0;
  attr_table.array[(recpos + rec_offset)] =
      __SSAT(inlet_wave, 28) >> attr_table.GAIN;
}

Privacy

© 2024 Zrna Research