ref: b00b726e8f50ce92a60909bced989177bc028c73
dir: /demo/keyboard/main.c/
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
#include <prismriver.h>
void
usage(void)
{
print("Usage: %s [-o <output>] [-b <bufsize>]\n", argv0);
exits("usage");
}
//const char map[] = "zsxdcvgbhnjm";
const char map[] = "qazwsxedcrfvtgbyhnujmik,ol.p;/[']";
int indexof(char *str, char c)
{
for(int i = 0; str[i] != '\0'; i++)
if(str[i] == c)
return i;
return -1;
}
void
main(int argc, char** argv)
{
int out = -2, cont = 1, bufsize = 4096;
Wavegen *w;
ulong clock = 0;
Rune e;
ARGBEGIN {
case 'o':
out = create(EARGF(usage()), OWRITE, 0644);
break;
case 'b':
bufsize = atoi(EARGF(usage()));
break;
default:
usage();
} ARGEND;
if(out == -2)
out = open("/dev/audio", OWRITE);
if(out == -1)
sysfatal("open: %r");
initdraw(nil, nil, "Prismsynth");
einit(Ekeyboard);
w = waveform(sine, 1.0, 0);
while(cont)
switch(e = ekbd())
{
case 0x1B: /* Esc */
cont = 0;
break;
default:
{
Buffer *buf;
int i = indexof(map, (char)e);
if(i < 0)
continue;
buf = buffermap(nil, w, pitch(i, 4), &clock, 0, 0, bufsize);
play(buf, out);
destroybuffer(buf);
}
}
close(out);
exits(0);
}
void
eresized(int new)
{
if(new)
getwindow(display, Refnone);
}