Import the piano program again, except this time in the right location.
Submitted by: Toshihiro Kanda <candy@kgc.co.jp>
This commit is contained in:
parent
611d721e70
commit
943bfde5f9
8
games/piano/Makefile
Normal file
8
games/piano/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# @(#)Makefile 8.1 (Berkeley) 5/31/93
|
||||
|
||||
PROG= piano
|
||||
MAN6= piano.6
|
||||
DPADD= ${LIBCURSES} ${LIBTERMCAP}
|
||||
LDADD= -lcurses -ltermcap
|
||||
|
||||
.include <bsd.prog.mk>
|
12
games/piano/README
Normal file
12
games/piano/README
Normal file
@ -0,0 +1,12 @@
|
||||
Hello. I've been using FreeBSD from version 1.0 1993 and very happy.
|
||||
One of my favorite is /dev/speaker. Here is my /dev/speaker
|
||||
application named `piano' which is a piano/organ emulator. I'd like
|
||||
to contribute this program to FreeBSD if you like it.
|
||||
|
||||
This directory contains sources, Makefile and man page.
|
||||
|
||||
Make sure to config /dev/speaker and make it writable. Please select
|
||||
appropriate owner/group/mode for /dev/speaker and piano.
|
||||
|
||||
._. . ._ _.. _ .... . .._. .. _. . __ ._ _. .._ ._ ._..
|
||||
candy@kgc.co.jp (Toshihiro Kanda) or zw6t-knd@asahi-net.or.jp
|
57
games/piano/piano.6
Normal file
57
games/piano/piano.6
Normal file
@ -0,0 +1,57 @@
|
||||
.Dd Feb 3, 1995
|
||||
.Dt "PIANO" 6
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm piano
|
||||
.Nd "a piano emulator"
|
||||
.Sh SYNOPSIS
|
||||
.Nm piano
|
||||
.Op Fl vV
|
||||
.Op Fl i Ar string
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm piano
|
||||
plays note by typing
|
||||
.Em "QWERTYUIOP[]"
|
||||
or
|
||||
.Em "12 45 789 -=" .
|
||||
Type
|
||||
.Em ESC
|
||||
key to quit
|
||||
.Nm piano .
|
||||
.Nm Piano
|
||||
uses
|
||||
.Em /dev/speaker .
|
||||
.Pp
|
||||
Available option:
|
||||
.Bl -tag -width flag
|
||||
.It Fl v
|
||||
The
|
||||
.Fl v
|
||||
option causes
|
||||
.Nm piano
|
||||
to generate
|
||||
.Em "play-string language" .
|
||||
.It Fl V
|
||||
The
|
||||
.Fl V
|
||||
option is for
|
||||
.Nm piano
|
||||
usage.
|
||||
.It Fl i Ar string
|
||||
The
|
||||
.Fl i
|
||||
option initializes
|
||||
.Em /dev/speaker
|
||||
by
|
||||
.Ar string .
|
||||
The default value is 't160 o1 l16 ml'.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width /dev/speakerxx
|
||||
.It Pa /dev/speaker
|
||||
speaker device file
|
||||
.Sh SEE ALSO
|
||||
.Xr spkr 4
|
||||
.Sh AUTHOR
|
||||
Toshihiro Kanda <candy@kgc.co.jp> Nov. 1993
|
166
games/piano/piano.c
Normal file
166
games/piano/piano.c
Normal file
@ -0,0 +1,166 @@
|
||||
/*
|
||||
* piano.c - a piano emulator
|
||||
*/
|
||||
static char rcsid[] = "$Id$";
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <curses.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/file.h>
|
||||
|
||||
char *myname;
|
||||
int verbose;
|
||||
static char *initcmd = "t160 o1 l16 ml";
|
||||
|
||||
static char usage_msg[] =
|
||||
"simple keyboard player V0.8086\n"
|
||||
"usage: %s [-v][-i str]\n"
|
||||
"\t-i str defaults 't160 o1 l16 ml'\n"
|
||||
"function: play by console keyboard\n"
|
||||
"\tESC to exit. Note keys are ...\n"
|
||||
"\t1 2 4 5 7 8 9 - = \\\n"
|
||||
"\t Q W E R T Y U I O P [ ]\n"
|
||||
;
|
||||
|
||||
struct kdef_t {
|
||||
int ch;
|
||||
char *str;
|
||||
};
|
||||
|
||||
static char *kstr[256];
|
||||
|
||||
static struct kdef_t kdef[] = {
|
||||
/* white key */
|
||||
{ '\t', "<g>" },
|
||||
{ 'q', "<a>" },
|
||||
{ 'w', "<b>" },
|
||||
{ 'e', "c" },
|
||||
{ 'r', "d" },
|
||||
{ 't', "e" },
|
||||
{ 'y', "f" },
|
||||
{ 'u', "g" },
|
||||
{ 'i', "a" },
|
||||
{ 'o', "b" },
|
||||
{ 'p', ">c<" },
|
||||
{ '[', ">d<" },
|
||||
{ ']', ">e<" },
|
||||
{ '\n', ">f<" },
|
||||
{ '\r', ">f<" },
|
||||
/* black key */
|
||||
{ '`', "<f#>" },
|
||||
{ '1', "<g#>" },
|
||||
{ '2', "<a#>" },
|
||||
/*{ '3', "<b#>" },*/
|
||||
{ '4', "c#" },
|
||||
{ '5', "d#" },
|
||||
/*{ '6', "e#" },*/
|
||||
{ '7', "f#" },
|
||||
{ '8', "g#" },
|
||||
{ '9', "a#" },
|
||||
/*{ '0', "b#" },*/
|
||||
{ '-', ">c#<" },
|
||||
{ '=', ">d#<" },
|
||||
/*{ '\', ">e#<" },*/
|
||||
{ '\177', ">f#<" },
|
||||
{ '\0', NULL }
|
||||
};
|
||||
|
||||
static int
|
||||
init_kstr(void)
|
||||
{
|
||||
struct kdef_t *mv = kdef;
|
||||
while (mv->str != NULL) {
|
||||
kstr[mv->ch] = mv->str;
|
||||
mv++;
|
||||
}/* while */
|
||||
return 0;
|
||||
}/* init_kstr */
|
||||
|
||||
static int
|
||||
fdputs(const char *s, int fd, int echo)
|
||||
{
|
||||
int err, len = strlen(s);
|
||||
write(fd, s, len);
|
||||
err = write(fd, "\n", 1);
|
||||
if (echo) {
|
||||
fputs(s, stdout);
|
||||
}
|
||||
return err;
|
||||
}/* fdputs */
|
||||
|
||||
static int
|
||||
outspkr(const char *s)
|
||||
{
|
||||
int err = -1, fd = open("/dev/speaker", O_WRONLY);
|
||||
if (fd >= 0) {
|
||||
fdputs(initcmd, fd, 0);
|
||||
err = fdputs(s, fd, verbose);
|
||||
close(fd);
|
||||
}
|
||||
return err;
|
||||
}/* outspkr */
|
||||
|
||||
static int
|
||||
nain(void)
|
||||
{
|
||||
int ch;
|
||||
initscr();
|
||||
noecho();
|
||||
nonl();
|
||||
raw();
|
||||
init_kstr();
|
||||
while ((ch = getch()) != '\033') {
|
||||
if (kstr[ch] != NULL) {
|
||||
outspkr(kstr[ch]);
|
||||
}
|
||||
else {
|
||||
if (verbose) {
|
||||
switch (ch) {
|
||||
case ' ':
|
||||
fputs(" ", stdout);
|
||||
break;
|
||||
case '\b':
|
||||
fputs("\b", stdout);
|
||||
break;
|
||||
}/* switch */
|
||||
}
|
||||
}
|
||||
}/* while */
|
||||
endwin();
|
||||
return 0;
|
||||
}/* nain */
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
extern char *optarg;
|
||||
extern int optind, opterr;
|
||||
int ch, ex, show_usage = 0;
|
||||
myname = argv[0];
|
||||
while ((ch = getopt(argc, argv, "-vi:")) != EOF) {
|
||||
switch (ch) {
|
||||
default:
|
||||
case 'V':
|
||||
show_usage++;
|
||||
break;
|
||||
case 'v':
|
||||
verbose++;
|
||||
break;
|
||||
case 'i':
|
||||
initcmd = optarg;
|
||||
break;
|
||||
}/* switch */
|
||||
}/* while */
|
||||
ex = 1;
|
||||
if (show_usage) {
|
||||
fprintf(stderr, usage_msg, myname);
|
||||
}
|
||||
else {
|
||||
printf("Type ESC to exit.\n");
|
||||
ex = 0;
|
||||
nain();
|
||||
}
|
||||
return ex;
|
||||
}/* main */
|
Loading…
Reference in New Issue
Block a user