matrix16x16

16x16 modulation matrix with preset load/save
Author: Remco van der Most
License: BSD
Github: sss/mix/matrix16x16.axo

Inlets

frac32 input 1

frac32 input 2

frac32 input 3

frac32 input 4

frac32 input 5

frac32 input 6

frac32 input 7

frac32 input 8

frac32 in9

frac32 in10

frac32 in11

frac32 in12

frac32 in13

frac32 in14

frac32 in15

frac32 in16

charptr32 filename

Outlets

frac32 o1

frac32 o2

frac32 o3

frac32 o4

frac32 o5

frac32 o6

frac32 o7

frac32 o8

frac32 o9

frac32 o10

frac32 o11

frac32 o12

frac32 o13

frac32 o14

frac32 o15

frac32 o16

Parameters

int32.hradio source

int32.hradio destiny

bool32.mom clear

bool32.mom load

bool32.mom save

frac32.s.map gain

Declaration
const int LENGTH = 256;
int32_t *array;

int prev;
int32_t mod[16];
int i;
int ctrig;
int ltrig;
int strig;
Init
static int32_t _array[attr_poly][256] __attribute__((section(".sdram")));
array = &_array[parent->polyIndex][0];

// int32_t array[256];
Control Rate
if ((param_save > 0) && !strig) {
  strig = 1;
  FIL FileObject;
  FRESULT err;
  UINT bytes_written;
  err = f_open(&FileObject, inlet_filename, FA_WRITE | FA_CREATE_ALWAYS);
  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)) {
      memcpy((char *)fbuff, (char *)(&array[0]) + offset, sizeof(fbuff));
      err = f_write(&FileObject, fbuff, sizeof(fbuff), &bytes_written);
      rem_sz -= sizeof(fbuff);
      offset += sizeof(fbuff);
    } else {
      memcpy((char *)fbuff, (char *)(&array[0]) + offset, rem_sz);
      err = f_write(&FileObject, fbuff, rem_sz, &bytes_written);
      rem_sz = 0;
    }
  }
  if (err != FR_OK)
    report_fatfs_error(err, "inlet_filename");
  err = f_close(&FileObject);
  if (err != FR_OK)
    report_fatfs_error(err, "inlet_filename");
} else if (!(param_save > 0))
  strig = 0;

if ((param_load > 0) && !ltrig) {
  ltrig = 1;
  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;
    }
  }
  if (err != FR_OK) {
    report_fatfs_error(err, inlet_filename);
    return;
  };
  err = f_close(&FileObject);
  if (err != FR_OK) {
    report_fatfs_error(err, inlet_filename);
    return;
  };
} else if (!(param_load > 0))
  ltrig = 0;

mod[0] = inlet_in1;
mod[1] = inlet_in2;
mod[2] = inlet_in3;
mod[3] = inlet_in4;
mod[4] = inlet_in5;
mod[5] = inlet_in6;
mod[6] = inlet_in7;
mod[7] = inlet_in8;
mod[8] = inlet_in9;
mod[9] = inlet_in10;
mod[10] = inlet_in11;
mod[11] = inlet_in12;
mod[12] = inlet_in13;
mod[13] = inlet_in14;
mod[14] = inlet_in15;
mod[15] = inlet_in16;
if ((param_clear > 0) && !ctrig) {
  ctrig = 1;
  for (i = 0; i < 256; i++) {
    array[i] = 0;
  }
} else if (param_clear == 0) {
  ctrig = 0;
}

// load setting
if (!(prev == (param_source + param_destiny + param_clear + param_load))) {
  PExParameterChange(&parent->PExch[PARAM_INDEX_attr_legal_name_gain],
                     array[param_source + param_destiny * 16], 0xFFFD);
}
prev = param_source + param_destiny + param_clear + param_load;

// save setting
array[param_source + param_destiny * 16] = param_gain;

outlet_o1 = 0;
for (i = 0; i < 16; i++) {
  outlet_o1 += ___SMMUL(array[i] << 3, mod[i] << 2);
}

outlet_o2 = 0;
for (i = 0; i < 16; i++) {
  outlet_o2 += ___SMMUL(array[i + 16] << 3, mod[i] << 2);
}

outlet_o3 = 0;
for (i = 0; i < 16; i++) {
  outlet_o3 += ___SMMUL(array[i + 32] << 3, mod[i] << 2);
}

outlet_o4 = 0;
for (i = 0; i < 16; i++) {
  outlet_o4 += ___SMMUL(array[i + 48] << 3, mod[i] << 2);
}

outlet_o5 = 0;
for (i = 0; i < 16; i++) {
  outlet_o5 += ___SMMUL(array[i + 64] << 3, mod[i] << 2);
}

outlet_o6 = 0;
for (i = 0; i < 16; i++) {
  outlet_o6 += ___SMMUL(array[i + 80] << 3, mod[i] << 2);
}

outlet_o7 = 0;
for (i = 0; i < 16; i++) {
  outlet_o7 += ___SMMUL(array[i + 96] << 3, mod[i] << 2);
}

outlet_o8 = 0;
for (i = 0; i < 16; i++) {
  outlet_o8 += ___SMMUL(array[i + 112] << 3, mod[i] << 2);
}

outlet_o9 = 0;
for (i = 0; i < 16; i++) {
  outlet_o9 += ___SMMUL(array[i + 128] << 3, mod[i] << 2);
}

outlet_o10 = 0;
for (i = 0; i < 16; i++) {
  outlet_o10 += ___SMMUL(array[i + 144] << 3, mod[i] << 2);
}

outlet_o11 = 0;
for (i = 0; i < 16; i++) {
  outlet_o11 += ___SMMUL(array[i + 160] << 3, mod[i] << 2);
}

outlet_o12 = 0;
for (i = 0; i < 16; i++) {
  outlet_o12 += ___SMMUL(array[i + 176] << 3, mod[i] << 2);
}

outlet_o13 = 0;
for (i = 0; i < 16; i++) {
  outlet_o13 += ___SMMUL(array[i + 192] << 3, mod[i] << 2);
}

outlet_o14 = 0;
for (i = 0; i < 16; i++) {
  outlet_o14 += ___SMMUL(array[i + 208] << 3, mod[i] << 2);
}

outlet_o15 = 0;
for (i = 0; i < 16; i++) {
  outlet_o15 += ___SMMUL(array[i + 224] << 3, mod[i] << 2);
}

outlet_o16 = 0;
for (i = 0; i < 16; i++) {
  outlet_o16 += ___SMMUL(array[i + 240] << 3, mod[i] << 2);
}

Privacy

© 2024 Zrna Research