#include #include #include #include "abuf.h" #include "guic.h" Abuf ain, aout; enum{ Cutoff, Reso, }; char *keywords[] = { "cutoff", "reso", 0 }; void threadmain(int argc, char *argv[]) { double r, c; double y2, y1, y0, x0; Event ev; if(argc < 2) sysfatal("usage: twopole gui"); guistart(argv[1]); ainit(&ain, 0); ainit(&aout, 1); c = 0.1; r = 0.98; y1 = y2 = 0; while(agetd(&ain, &x0) == 1){ while(nbrecv(guichan, &ev) == 1) switch(ev.k){ case Cutoff: c = ev.n / 127.0; break; case Reso: r = ev.n / 128.0; break; } y0 = c * x0 + (1 + r - c) * y1 - r * y2; if(y0 > 1) y0 = 1; if(y0 < -1) y0 = -1; aputd(&aout, y0); y2 = y1; y1 = y0; } }