#include #include #include enum{SHIFT = 16, MASK = 1023, NTAB}; uvlong t; double sine[NTAB]; double mf[] = {-10, -9, -7, -5, -4, -2, 0, 2, 3, 5, 7, 8, 10, 0, 0}; double tf[] = {-21, -17, -17, -12, -12, -12, -9, -9, -5, -5, 0, 0, 0, -12, -12}; void bleep(int n){ static uint φm, φt; static double a; uint Δφm, Δφt; int s, i; uchar buf[44100 * 4]; Δφm = (pow(2.0, mf[n] / 12.0) * 440.0 * (NTAB << SHIFT)) / 44100; Δφt = (pow(2.0, tf[n] / 12.0) * 440.0 * (NTAB << SHIFT)) / 44100; i = 0; if(n != 14) a = 0.01; while(i < sizeof buf){ if(i < 40000 && n < 14) a *= 1.00022; else if(i > 160000 && n < 13) a *= 0.9996; else if(n == 14) a *= 0.99998; s = (sine[φm >> SHIFT & MASK] + sine[φt >> SHIFT & MASK]) * a * 0x4000; buf[i++] = s; buf[i++] = s >> 8; buf[i++] = s; buf[i++] = s >> 8; φm += Δφm; φt += Δφt; } write(1, buf, sizeof buf); } void main(int, char**){ Biobuf txt; char *line, *word, *a, *b; int f, c, d = 1; Binit(&txt, 0, OREAD); for(c = 0; c < NTAB; c++) sine[c] = sin(c * 2.0 * PI / NTAB); f = 6; while(line = Brdstr(&txt, '\n', 1)){ word = strtok(line, "\t "); while(word != nil){ c = -1; for(a = word; *a; a++) if(strchr("aeiouAEIOU", *a)) c++; if(c < 1){ if(d < 0 && f == 0 || d > 0 && f == 12) d *= -1; fprint(2, "%s ", word); bleep(f += d); }else{ d *= -1; if(c > 6) c = 6; f = 6 - d * c; a = word; while(c--){ b = strpbrk(a, "aeiouAEIOU"); fprint(2, "%.*s - ", (int)(b - a) + 1, a); a = b + 1; bleep(f); f += d; } fprint(2, "%s ", a); bleep(f); f += d; } word = strtok(nil, "\t "); } free(line); } d = f < 6 ? 1 : -1; while(f != 6) bleep(f += d); bleep(13);bleep(14);bleep(14);bleep(14);bleep(14); exits(nil); }