primeVerb

Reverb with times calculated depending on primes. Able to create long reverb tails
Author: Remco van der Most
License: BSD
Github: sss/reverb/primeVerb.axo

Inlets

frac32buffer i1

frac32buffer i2

frac32buffer i3

frac32buffer i4

bool32 rnd

Outlets

frac32buffer o1

frac32buffer o2

Parameters

frac32.u.map.gain dry

frac32.u.map.gain wet

frac32.u.map.gain brightness

frac32.u.map.gain darkness

frac32.s.map.klineartime.exp size

frac32.u.map decay

bool32.mom rnd

frac32.s.map rate

Attributes

combo size

Declaration
static const uint32_t LENGTHPOW = (attr_size);
static const uint32_t LENGTH = (1 << attr_size);
static const uint32_t LENGTHMASK = ((1 << attr_size) - 1);
int16_t *array;

uint32_t writepos;
int32_t tim[4];
int32_t Tim[4];
int32_t in[4];
int32_t out[4];
int32_t frq[4];
int i;
bool rnd;
bool DO;

int32_t All;
int32_t phs[4];
int32_t ofs[4];
int32_t drift[4];
int32_t Array[512] = {
    3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761,
    3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853,
    3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943,
    3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051,
    4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153,
    4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253,
    4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357,
    4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463,
    4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567,
    4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663,
    4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787,
    4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903,
    4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987,
    4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081,
    5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189,
    5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303,
    5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417,
    5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503,
    5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623,
    5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701,
    5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813,
    5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881,
    5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037,
    6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131,
    6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229,
    6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323,
    6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421,
    6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553,
    6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661,
    6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763,
    6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863,
    6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967,
    6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057,
    7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193,
    7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307,
    7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451,
    7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537,
    7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607,
    7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717,
    7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841,
    7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937,
    7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081,
    8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147};
int32_t lp[4];
int32_t hp[4];
int32_t bs[4][2];
int32_t MATRIX(int I) {
  int k = I << LENGTHPOW;
  array[writepos + k] = __SSAT(in[I] >> 14, 16);
  out[I] = array[((writepos - (tim[I] >> 4)) & LENGTHMASK) + k] << 14;
}

int32_t ALLPASS(int32_t in, int I) {
  bs[I][1] =
      ___SMMUL(-in << 1, frq[I]) + bs[I][0] + ___SMMUL(bs[I][1] << 1, frq[I]);
  All = bs[I][1];
  bs[I][0] = in;
}
Init
static int16_t _array[4 << attr_size] __attribute__((section(".sdram")));
array = &_array[0];
int i;
writepos = 0;
for (i = 0; i < (LENGTH << 2); i++)
  array[i] = 0;
DO = 1;
Control Rate
int32_t size;
MTOF(param_size + (8 << 21), size)
// size=size>>32-LENGTHPOW;
int32_t rate;
MTOF(param_rate, rate)
int32_t decay;
MTOF((15 << 23) + (param_decay >> 4) - 3837789, decay)
// decay=decay>>4;
if ((((param_rnd || inlet_rnd) > 0) || DO) && !rnd) {
  rnd = 1;
  // for(i=0;i<(LENGTH<<2);i++){ array[i] = 0;}
  for (i = 0; i < 4; i++) {
    Tim[i] = (int64_t)(LENGTH << 4) *
             (Array[((int32_t)(GenerateRandomNumber()) & 511)]) / 4523;
    ofs[i] = GenerateRandomNumber();
    drift[i] = GenerateRandomNumber() >> 7;
  }
  DO = 0;
} else if ((param_rnd || inlet_rnd) < 1) {
  rnd = 0;
}

for (i = 0; i < 4; i++) {
  phs[i] += ___SMMUL(rate, drift[i]) << 1;
  int32_t tmp = ___SMMUL(Tim[i] << 1, size);
  if (tim[i] < tmp) {
    tim[i] += 1;
  } else if (tim[i] > tmp) {
    tim[i] -= 1;
  }
  SINE2TINTERP(ofs[i] + phs[i], frq[i]);
}
Audio Rate
writepos = (writepos + 1) & LENGTHMASK;
in[0] += inlet_i1 >> 1;
in[1] += inlet_i2 >> 1;
in[2] += inlet_i3;
in[3] += inlet_i4;
for (i = 0; i < 4; i++) {
  MATRIX(i);
  ALLPASS(out[i], i);
  out[i] = All;
}
for (i = 0; i < 4; i++) {
  in[i] = (___SMMUL(out[i], decay) << 1);
  for (int j = 1; j < 4; j++) {
    in[i] -= (___SMMUL(out[(i + j) & 3], decay) << 1);
  }
  lp[i] += in[i] - lp[i] >> 1;
  hp[i] += in[i] - hp[i] >> 7;
  in[i] -= ___SMMUL(in[i] - lp[i], param_darkness) << 1;
  in[i] -= ___SMMUL(hp[i], param_brightness) << 1;
}

outlet_o1 = ___SMMUL(param_wet, in[1] - in[0]) +
            ___SMMUL(param_dry, inlet_i1 + inlet_i3 << 1);
outlet_o2 = ___SMMUL(param_wet, in[3] - in[2]) +
            ___SMMUL(param_dry, inlet_i2 + inlet_i4 << 1);

Privacy

© 2024 Zrna Research