go 2012-02-18T20:01:44+0000
[maximus:clive.git] / src / go.c
1 #include <stdlib.h>
2 #define SR 48000.0
3 #include <math.h>
4 #define PI 3.1415926
5
6 typedef struct {
7   double radioactivity;
8   float delayline[1024];
9   int delaywrite;
10   double delayread[8];
11   double leak;
12   double px, py;
13   double e;
14   double clock;
15   double tempo;
16   double strong;
17   int t;
18   int k;
19 } S;
20
21 float go(S *s, float x) {
22 //  s->k = 1024;
23   s->t += 1;
24   s->tempo = 2;
25   double old_clock = s->clock;
26   s->clock = fmod(s->clock + s->tempo/SR, 1);
27   double tick = s->clock < old_clock;
28   if (tick) { s->k--; s->tempo *= 0.9999; }
29   if (! s->k) { s->k = 1024; }
30   s->radioactivity = 0;
31   double decay = rand() / (double) RAND_MAX < s->radioactivity;
32   double o = 0.00125 * (((s->t>>10) & 0xFF) - 0x80) / 0x80;
33   s->e *= 0.999;
34   s->e += tick;
35   for (int i = 0; i < 8; ++i) {
36     s->delayread[i] = fmod(s->delayread[i] + (49 + (16 * i / (double) (s->k + 1)))/SR, 0.5);
37     double r = s->delayread[i] * 1024;
38     int ri = floor(r);
39     double rf = r - ri;
40     o += s->delayline[ri] * (1 - rf) + rf * s->delayline[(ri + 1)%1024];
41   }
42   double pa = 2 * PI * (60 + 600 * s->e) / SR;
43   double pr = 0.7;
44   double qx = pr * cos(pa);
45   double qy = pr * sin(pa);
46   double px = s->px * qx - qy * s->py + o;
47   double py = s->px * qy + qx * s->py;
48   s->px = px;
49   s->py = py;
50   o += px;
51   s->leak = s->leak * 0.999 + 0.001 * o;
52   o -= s->leak;
53 //  s->strong = s->strong * 0.95 + 0.05 * o;
54 //  o = s->strong;
55   if (tick) {
56    s->delaywrite = 0;
57   }
58   s->delaywrite = s->delaywrite + 1;
59   if (s->delaywrite < 1024) {
60     s->delayline[s->delaywrite] = sin(PI * s->delaywrite / 1024.0) * tanh(o/6);
61   }
62   return o;
63 }