#include #include #include #define samplespersec 8000.0 #define duration 0.1 * samplespersec #define pause 0.05 * samplespersec float col[] = { 1209.0, 1336.0, 1477.0, 1633.0 }; float row[] = { 697.0, 770.0, 852.0, 941.0 }; char positions[] = "123A456B789C*0#D"; /* presume 8000 samples/second, mono, 8 bits/sample */ main(int argc, char *argv[]) { int i; char *ap, *cp; float rf, cf, ri, ci, amp; if (argc != 2) exit(1); ap = argv[1]; while (*ap) { cp = strchr(positions, *ap); if (cp) { ci = col[(cp - positions) % 4]; ri = row[(cp - positions) / 4]; for (rf = 0.0, cf = 0.0, i=0; i < duration; i++, rf += 2*M_PI/samplespersec*ri, cf += 2*M_PI/samplespersec*ci) { if (i < 64) amp = i; if (i > duration - 64) amp = duration - i;; putchar((sin(rf)*amp) + (sin(cf)*amp) + 128); } for (i = 0; i < pause; i++) putchar(128); } ap++; } }