frac32buffer i1
frac32buffer i2
frac32buffer i3
frac32buffer i4
bool32 rnd
frac32buffer o1
frac32buffer o2
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
combo size
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;
}
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;
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]);
}
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);