PROC piano:
	GLOBAL freq,n%
		print:
		draw:
	loop::
		key:
		beep: 
	GOTO loop::
ENDP

PROC beep:
	freq=440*2**(n%/12.0)
	BEEP 10,512000/freq-1.0
	RETURN
ENDP

PROC key:
	LOCAL k%
	again::
	k%=GET
		IF k%=%z : n%=3 : gAT 0,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF k%=%Z : n%=15: gAT 112,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=%s : n%=4: gAT 11,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
			ELSEIF K%=%S : n%=16: gAT 123,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
		ELSEIF k%=%x : n%=5: gAT 16,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=%X : n%=17: gAT 128,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=%d : n%=6: gAT 27,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
			ELSEIF K%=%D : n%=18: gAT 139,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
		ELSEIF k%=99 : n%=7: gAT 32,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=67 : n%=19: gAT 144,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=118 : n%=8: gAT 48,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=86 : n%=20: gAT 160,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=103 : n%=9: gAT 59,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
			ELSEIF K%=71 : n%=21: gAT 171,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
		ELSEIF k%=98 : n%=10: gAT 64,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=66 : n%=22: gAT 176,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=104 : n%=11: gAT 75,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
			ELSEIF K%=72 : n%=23: gAT 187,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
		ELSEIF k%=110 : n%=12: gAT 80,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=78 : n%=24: gAT 192,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=106 : n%=13: gAT 91,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
			ELSEIF K%=74 : n%=25: gAT 203,20 : gFILL 11,37,2 : pause 2:gFILL 11,37,2
		ELSEIF k%=109 : n%=14: gAT 96,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=77 : n%=26: gAT 208,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
		ELSEIF k%=44 : n%=15: gAT 112,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=59 : n%=27: gAT 224,20 : gFILL 17,60,2 : pause 2:gFILL 17,60,2
			ELSEIF K%=27: esc:
			ELSEIF K%=291 : help: :goto again::
			ELSE GOTO again:: REM If no keypress has been matched, tries again.
		ENDIF
	RETURN
ENDP

PROC help:
	REM Shows what keys to play with
	gSTYLE 16:gTMODE 2
	REM White keys ********************
	gAT 6,72:gPRINT"z"
	gAT 22,72:gPRINT"x"
	gAT 38,72:gPRINT"c"
	gAT 54,72:gPRINT"v"
	gAT 70,72:gPRINT"b"
	gAT 86,72:gPRINT"n"
	gAT 102,72:gPRINT"m"
	gAT 118,75:gPRINT",":gAT 118,70:gPRINT"Z"
	gAT 134,72:gPRINT"X"
	gAT 150,72:gPRINT"C"
	gAT 166,72:gPRINT"V"
	gAT 182,72:gPRINT"B"
	gAT 198,72:gPRINT"N"
	gAT 214,72:gPRINT"M"
	gAT 230,72:gPRINT";"
	REM Black keys ********************
	gAT 14,54:gPRINT"s"
	gAT 30,54:gPRINT"d"
	gAT 62,54:gPRINT"g"
	gAT 78,54:gPRINT"h"
	gAT 94,54:gPRINT"j"
	gAT 126,54:gPRINT"S"
	gAT 142,54:gPRINT"D"
	gAT 174,54:gPRINT"G"
	gAT 190,54:gPRINT"H"
	gAT 206,54:gPRINT"J"
	RETURN
ENDP

PROC esc:
	REM Quits the program
	CLS
	PRINT "Mini-piano by Frederic Sebton 1993":GET
	STOP
	RETURN
ENDP

PROC draw:
	REM *** draws keys to screen
	LOCAL x%,y%,w%,h%
	REM *** white keys
	x%=0:y%=20:w%=17:h%=60
	WHILE x%<224
		gAT x%,y% : gBOX w%,h%
		x%=x%+16
		IF x%=224
			gAT x%,y%
			gBOX w%-1,h%
		ENDIF
	ENDWH
	REM *** black keys
x%=11:y%=20:w%=11:h%=37
	WHILE x%<204
		gAT x%,y% : gFILL w%,h%,0
		x%=x%+16
		IF x%=43 OR x%=107 OR x%=155
			x%=x%+16
		ENDIF
	ENDWH
	RETURN
ENDP

PROC print:
	gSTYLE 8
	gAT 0,15
	gPRINTB "* MINI-PIANO *",240,3
	RETURN
ENDP
              