wavetable load fn

load 16bit pwm wavetable raw (no header) of single cycle waves. use with wave/wavetable play note: you can just load 1 wave and use as wave oscillator filename is supplied as inlet, trig to load , check outlet to see if loaded successfully
Author: Mark Harris
License: GPL
Github: tb/wave/wavetable load fn.axo

Inlets

charptr32 wavetable filename

bool32.rising trig to load

Outlets

bool32 wavetable loaded successfully

Attributes

combo number of waves

combo size of each wave

Declaration
static const uint32_t WAVESPOW = (attr_waves);
static const uint32_t SIZEPOW = (attr_size);
static const uint32_t LENGTHPOW = (attr_waves + attr_size);
static const uint32_t LENGTH = (1 << LENGTHPOW);
static const uint32_t LENGTHMASK = ((1 << LENGTHPOW) - 1);
static const uint32_t BITS = 16;
static const uint32_t GAIN = 12;
int16_t *array;
int ntrig;
int loaded = 0;
Init
static int16_t _array[attr_poly][LENGTH] __attribute__((section(".sdram")));
loaded = 0;
ntrig = 0;
array = &_array[parent->polyIndex][0];
Control Rate
if ((inlet_trig > 0) && !ntrig) {
  ntrig = 1;
  int i;
  for (i = 0; i < LENGTH; i++)
    array[i] = 0;

  FIL FileObject;
  FRESULT err;
  UINT bytes_read;
  err = f_open(&FileObject, inlet_filename, FA_READ | FA_OPEN_EXISTING);
  if (err != FR_OK) {
    report_fatfs_error(err, inlet_filename);
    return;
  }
  int rem_sz = sizeof(array) * LENGTH;
  int offset = 0;
  while (rem_sz > 0) {
    if (rem_sz > sizeof(fbuff)) {
      err = f_read(&FileObject, fbuff, sizeof(fbuff), &bytes_read);
      if (bytes_read == 0)
        break;
      memcpy((char *)(&array[0]) + offset, (char *)fbuff, bytes_read);
      rem_sz -= bytes_read;
      offset += bytes_read;
    } else {
      err = f_read(&FileObject, fbuff, rem_sz, &bytes_read);
      memcpy((char *)(&array[0]) + offset, (char *)fbuff, bytes_read);
      rem_sz = 0;
    }
  }
  loaded = (err == FR_OK);
  if (err != FR_OK) {
    LogTextMessage("Read failed\n");
    return;
  }
  err = f_close(&FileObject);
  if (err != FR_OK) {
    LogTextMessage("Close failed\n");
    return;
  }
} else if (!(inlet_trig > 0))
  ntrig = 0;

outlet_loaded = loaded;

Privacy

© 2024 Zrna Research