flex

drives a phasor (saw-wave) for reading/writing data
Author: robert schirmer
License: BSD
Github: rbrt/sdrive/flex.axo

Inlets

bool32.risingfalling toggle playback

bool32.rising trigger 1-shot playback

bool32.rising reset or stop 1-shot playback

frac32.positive offset inside the table

frac32.positive length of the area to index,or loop end

frac32.positive loopstart inside 'range'

frac32.positive tansposition in semi-notes

frac32.bipolar speed modulation

Outlets

frac32buffer.positive position inside table

bool32 playback-state (useful for 1-shot)

Attributes

objref table to index

spinner forward or reverse

Declaration
uint8_t shift;
uint8_t scale;

uint32_t lrange;
uint32_t lstart;

int32_t t_speed;
uint32_t inc;
int32_t index;

bool play;
bool rro;
bool mode;
bool trig;
Init
shift = (27 - attr_wave.LENGTHPOW);
scale = (attr_wave.LENGTHPOW < 6) ? 0 : 4;
Control Rate
MTOFEXTENDED(inlet_transpose + (1 << 22) + 512000, inc);
t_speed = ((___SMMUL(inc, inlet_direction + (attr_direction << 21))) << 5) >>
          (attr_wave.LENGTHPOW - (scale + 2));
lstart = ((___SMMUL(inlet_range, inlet_loopstart) << 5) << scale);
lstart = (t_speed > 0) ? lstart : lstart - t_speed;
lrange = inlet_range << scale;

if (inlet_resetORstop && (!rro)) {
  rro = 1;
  if (!mode)
    index = (t_speed > 0) ? 0 : lrange;
  else
    play = 0;
}
if (!inlet_resetORstop)
  rro = 0;

if (inlet_trigger && !trig) {
  mode = 1;
  play = 1;
  index = (t_speed > 0) ? 0 : lrange;
  trig = 1;
}
if (!inlet_trigger)
  trig = 0;

if (!mode) {
  if (inlet_play && !play) {
    play = 1;
    index = 0;
  }
  if (!inlet_play)
    play = 0;
}

if (!lrange)
  play = 0;
if (!play)
  mode = 0;
outlet_play = play;
Audio Rate
if (t_speed > 0) {
  if (index >= lrange) {
    index = lstart;
    if (mode)
      play = 0;
  }
} else if (index <= lstart) {
  index = lrange;
  if (mode)
    play = 0;
}

outlet_phase = __USAT(((index >> scale) + inlet_offset), 27) * play;
index += t_speed;

Privacy

© 2024 Zrna Research