go 2012-02-17T15:04:45+0000
[maximus:clive.git] / src / go.c
1 #include <stdlib.h>
2 #define SR 48000.0
3
4 #include <math.h>
5 #define PI 3.1415926
6
7 typedef struct {
8   float like_a_butterfly;
9   double radioactivity;
10   double rx, ry;
11   double leak;
12   double clock;
13   float delayline[48000];
14   int delayw;
15   double delayr[8];
16   double t;
17
18   double qx, qy;
19   int j;
20 } S;
21
22 float go(S *s, float x) {
23 //  s->radioactivity = 0;
24   s->t = fmod(s->t + 4/SR, 1);
25 //  if (0 > s->t || s->t < 60) { s->t += 640/SR; } else { s->t -= 256/SR; }
26   double old_clock = s->clock;
27   s->clock = fmod(s->clock + 4/SR, 1);
28   if (s->clock < old_clock) {
29     s->j = (s->j + 1) % 11;
30   }
31   double tick = s->clock < old_clock;
32   s->radioactivity += 1/(SR * 1e5);
33   double decay = rand() / (double) RAND_MAX < s->radioactivity;
34   double fr = 0.7;
35   double fa = 2 * PI * 50 / SR;
36   double fx = fr * cos(fa);
37   double fy = fr * sin(fa);
38   double px = fx * s->rx - fy * s->ry + tick;
39   double py = fy * s->rx + fx * s->ry;
40   s->rx = px;
41   s->ry = py;
42   double o = px;
43   for (int i = 0; i < 8; ++i) {
44     s->delayr[i] = fmod(s->delayr[i] + (1 + (2*(i&1)-1)*i/(s->t + 10.0))/48000, 1);
45     double r = -s->delayr[i] * 48000;
46     int ri = floor(r);
47     double rf = r - ri;
48     o += s->delayline[ri] * (1 - rf) + rf * s->delayline[(ri + 1) % 48000];
49   }
50   s->leak = 0.99 * s->leak + 0.01 * o;
51   o -= s->leak;
52   s->delayline[s->delayw] = tanh(o);
53   s->delayw = (s->delayw + 1) % 48000;
54   double gr = -0.7;
55   double k = 60 * ("02084640183"[s->j]-'0' + 1);
56   double ga = k * pow(2, 0.1 * s->t) / SR;
57   double gx = gr * cos(ga);
58   double gy = gr * sin(ga);
59   double hx = gx * s->qx - gy * s->qy + 0.1 * tanh(o);
60   double hy = gy * s->qx + gx * s->qy;
61   s->qx = hx;
62   s->qy = hy;
63   o = tanh(hx);
64   return o;
65 }