home *** CD-ROM | disk | FTP | other *** search
- 1000 '
- 1010 ' THE VIRTUAL PIANO
- 1020 '
- 1030 ' COPYRIGHT (C) 1983 BY MICROSOFT CORPORATION
- 1040 ' WRITTEN BY CHRIS PETERS
- 1050 '
- 1060 '-----------------------------------------------
- 1070 '
- 1080 ' I N I T I A L I Z E
- 1090 '
- 1100 DEFINT A-Z
- 1110 DIM CURSOR(15,1),FREQ(27,2),MICROSOFT(839)
- 1120 KEY OFF
- 1130 PLAY"MF"
- 1140 SCREEN 1
- 1150 COLOR 1,1
- 1160 CLS
- 1170 '
- 1180 ' Read in the flat, normal, and sharp note frequencies
- 1190 '
- 1200 FOR J=0 TO 2
- 1210 FOR I=0 TO 6
- 1220 READ K
- 1230 FREQ(I,J)=K : FREQ(I+7,J)=K*2 : FREQ(I+14,J)=K*4 : FREQ(I+21,J)=K*8
- 1240 NEXT
- 1250 NEXT
- 1260 '
- 1270 ' Determine mouse driver location; if not found, quit
- 1280 '
- 1290 DEF SEG=0
- 1300 MSEG=256*PEEK(51*4+3)+PEEK(51*4+2) ' Get mouse segment
- 1310 MOUSE=256*PEEK(51*4+1)+PEEK(51*4) ' Get mouse offset
- 1320 IF MSEG OR (MOUSE-2) THEN 1370
- 1330 PRINT"Mouse driver not found" ' Not found, so print error
- 1340 PRINT
- 1350 PRINT"Press any key to return to system"
- 1360 I$=INKEY$ : IF I$="" THEN 1360 ELSE SYSTEM
- 1370 DEF SEG=MSEG : MOUSE=MOUSE+2 ' Set mouse segment
- 1373 IF PEEK(MOUSE-2) = 207 THEN 1330 ' 207 is iret
- 1376 ' Mouse driver is there
- 1380 M1 = 0 : CALL MOUSE(M1,M2,M3,M4) ' Initialize the mouse
- 1382 IF M1 = 0 THEN PRINT "Mouse not found":END
- 1390 '
- 1400 ' Set mouse sensitivity
- 1410 '
- 1420 M1 = 15 : M3=4 : M4=8
- 1430 CALL MOUSE(M1,M2,M3,M4)
- 1440 '
- 1450 ' Define the "logical and" cursor mask
- 1460 '
- 1470 CURSOR( 0,0)=&HFFFF ' Binary 1111111111111111
- 1480 CURSOR( 1,0)=&HFFFF ' Binary 1111111111111111
- 1490 CURSOR( 2,0)=&HFFFF ' Binary 1111111111111111
- 1500 CURSOR( 3,0)=&HFFFF ' Binary 1111111111111111
- 1510 CURSOR( 4,0)=&HFFFF ' Binary 1111111111111111
- 1520 CURSOR( 5,0)=&HFFFF ' Binary 1111111111111111
- 1530 CURSOR( 6,0)=&HFFFF ' Binary 1111111111111111
- 1540 CURSOR( 7,0)=&HFFFF ' Binary 1111111111111111
- 1550 CURSOR( 8,0)=&HFFFF ' Binary 1111111111111111
- 1560 CURSOR( 9,0)=&HFFFF ' Binary 1111111111111111
- 1570 CURSOR(10,0)=&HFFFF ' Binary 1111111111111111
- 1580 CURSOR(11,0)=&HFFFF ' Binary 1111111111111111
- 1590 CURSOR(12,0)=&HFFFF ' Binary 1111111111111111
- 1600 CURSOR(13,0)=&HFFFF ' Binary 1111111111111111
- 1610 CURSOR(14,0)=&HFFFF ' Binary 1111111111111111
- 1620 CURSOR(15,0)=&HFFFF ' Binary 1111111111111111
- 1630 '
- 1640 ' Define the "exclusive or" cursor mask
- 1650 '
- 1660 CURSOR( 0,1)=&H300 ' Binary 0000001100000000
- 1670 CURSOR( 1,1)=&H300 ' Binary 0000001100000000
- 1680 CURSOR( 2,1)=&HFC0 ' Binary 0000111111000000
- 1690 CURSOR( 3,1)=&HFC0 ' Binary 0000111111000000
- 1700 CURSOR( 4,1)=&H3FF0 ' Binary 0011111111110000
- 1710 CURSOR( 5,1)=&H3FF0 ' Binary 0011111111110000
- 1720 CURSOR( 6,1)=&HFCFC ' Binary 1111110011111100
- 1730 CURSOR( 7,1)=&HC00C ' Binary 1100000000001100
- 1740 CURSOR( 8,1)=&H0 ' Binary 0000000000000000
- 1750 CURSOR( 9,1)=&H0 ' Binary 0000000000000000
- 1760 CURSOR(10,1)=&H0 ' Binary 0000000000000000
- 1770 CURSOR(11,1)=&H0 ' Binary 0000000000000000
- 1780 CURSOR(12,1)=&H0 ' Binary 0000000000000000
- 1790 CURSOR(13,1)=&H0 ' Binary 0000000000000000
- 1800 CURSOR(14,1)=&H0 ' Binary 0000000000000000
- 1810 CURSOR(15,1)=&H0 ' Binary 0000000000000000
- 1820 '
- 1830 ' Set the mouse cursor shape
- 1840 '
- 1850 M1 = 9 : M2 = 6 : M3 = 0
- 1860 CALL MOUSE(M1,M2,M3,CURSOR(0,0)) ' Mouse driver < 6.25
- 1862 'M4 = VARPTR(CURSOR(0,0)): CALL MOUSE(M1,M2,M3,M4) ' Mouse driver 6.25+
- 1870 '
- 1880 ' Draw the MICROSOFT logo from precalculated data
- 1890 '
- 1900 FOR I=0 TO 779
- 1910 READ MICROSOFT(I)
- 1920 NEXT
- 1930 PUT(62,0),MICROSOFT,PSET
- 1940 '
- 1950 ' Initialize keyboard size parameters
- 1960 '
- 1970 YL = 60 : WKL = 80 : BKL = 45 : KW = 15 : WKN = 21
- 1980 XL = 320-KW*WKN : YH = YL + WKL : XH = 319 : BKW2=KW\3
- 1990 QX = 272 : QY = 176
- 2000 '
- 2010 ' Draw the white keys
- 2020 '
- 2030 LINE (XL,YL)-(XH,YH),3,BF
- 2040 FOR I=XL TO XH STEP KW
- 2050 LINE (I,YL)-(I,YH),0
- 2060 NEXT
- 2070 '
- 2080 ' Draw the black keys
- 2090 '
- 2100 C=6
- 2110 FOR X=XL TO XH STEP KW
- 2120 C=C+1 : IF C=7 THEN C=0
- 2130 IF C=0 OR C=3 THEN 2150
- 2140 LINE(X-BKW2,YL)-(X+BKW2,YL+BKL),2,BF
- 2150 NEXT
- 2160 '
- 2170 ' Draw the quit box
- 2180 '
- 2190 LINE(QX,QY)-(319,199),3,B
- 2200 LOCATE 24,36 : PRINT"Quit";
- 2210 '
- 2220 ' Set mouse cursor location, then turn on cursor
- 2230 '
- 2240 M1 = 4 : M3 = 320 : M4 = 160 : CALL MOUSE(M1,M2,M3,M4)
- 2250 M1 = 1 : CALL MOUSE(M1,M2,M3,M4)
- 2260 '
- 2270 ' M A I N L O O P
- 2280 '
- 2290 M1=3 : CALL MOUSE(M1,BT,MX,MY) ' Get mouse location and button status
- 2300 IF (BT AND 2) THEN OTV=7 : GOTO 2340 ' If right button down, set high octave
- 2310 IF (BT AND 1) THEN OTV=0 : GOTO 2340 ' If left button down, set lower octave
- 2320 SOUND 442,0 ' If both buttons up, turn off sound
- 2330 GOTO 2290 ' Keep looping...
- 2340 MX = MX\2 ' Correct for medium resolution screen
- 2350 IF MX <= XL OR MY < YL THEN 2320 ' If above keyboard, turn off sound
- 2360 IF MY <= YH THEN 2470 ' If on keyboard, play sound
- 2370 IF MY < QY OR MX < QX THEN 2320 ' If above quit box, turn off sound
- 2380 '
- 2390 ' Button down inside the quit box
- 2400 '
- 2410 M1=2 : CALL MOUSE(M1,M2,M3,M4) ' Turn off mouse cursor
- 2420 CLS ' Clear screen
- 2430 END ' quit
- 2440 '
- 2450 ' Button down over keyboard, determine which key
- 2460 '
- 2470 WKY = (MX-XL)\KW+OTV : R = 1 ' Get which white key cursor is over
- 2480 IF MY > YL+BKL THEN 2560 ' Is it lower than the black keys?
- 2490 MK=(MX-XL) MOD KW ' No, get which side of key
- 2500 IF MK <= BKW2 THEN R=0 : GOTO 2560 ' Is it the left black key?
- 2510 IF MK >= KW-BKW2 THEN R=2 ' Is it the right black key?
- 2520 '
- 2530 ' Play the note. For BASIC interpreter duration = 2
- 2540 ' For BASIC compiler duration = 1
- 2550 '
- 2560 SOUND FREQ(WKY,R),2
- 2570 GOTO 2290 ' Continue looping
- 2580 '
- 2590 ' Musical note frequencies
- 2600 '
- 2610 DATA 131,139,156,175,185,208,233
- 2620 DATA 131,147,165,175,196,220,247
- 2630 DATA 139,156,165,185,208,233,247
- 2640 '
- 2650 ' Data to draw the MICROSOFT logo
- 2660 '
- 2670 DATA 462,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 2680 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 2690 DATA 0,0,0,-193,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 2700 DATA 0,0,0,0,0,768,-1,0,0,0,0,3840,-1,-16129,0,-253,0,0,-193,240
- 2710 DATA 0,0,0,0,0,0,0,0,0,-193,0,16128,4095,252,16128,-1,240,-256,-769,0
- 2720 DATA 0,0,0,0,-193,240,768,-1,255,768,-1,1023,-1,-1,240,0,0,0,-193,192
- 2730 DATA -256,4095,252,-253,-1,255,-256,-1,240,-253,-1,-1,768,-1,255,16128,-1,-3841,768,-1
- 2740 DATA 1023,-1,-1,240,0,0,0,-193,192,-256,4095,252,-193,-1,-3841,-256,-1,252,-1009,0
- 2750 DATA -256,4032,-1,-16129,-253,-1,-1,768,-1,1023,-1,-1,240,0,0,0,-193,240,-253,4095
- 2760 DATA 252,-3841,0,-961,-256,-1,255,0,0,0,3840,-1,-16129,-241,0,-253,960,-1,1023,-1
- 2770 DATA -1,240,0,0,0,-193,240,-253,4095,1020,255,0,-253,-256,4032,-16129,-1,-1,-1,4092
- 2780 DATA 4095,-16129,-4033,0,16128,1008,-1,1023,-1,-1,240,0,0,0,-193,252,-241,4095,1020,252
- 2790 DATA 0,-256,-256,960,-15361,252,0,0,4095,1023,-16129,-16321,0,3840,1008,255,0,3840,252,0
- 2800 DATA 0,0,0,-193,252,-241,4095,4092,240,0,16128,-64,192,-16129,0,0,0,3840,255,0
- 2810 DATA 255,0,768,1020,255,0,3840,252,0,0,0,0,-193,255,-193,4095,4092,240,0,16128
- 2820 DATA -64,192,-12289,-1,192,-241,-12289,-3841,0,255,0,768,1020,255,0,3840,252,0,0,0
- 2830 DATA 0,-193,255,-193,4095,16380,192,0,3840,-16,960,-12289,240,0,0,-15553,-1,768,252,0
- 2840 DATA 0,1023,255,0,3840,252,0,0,0,0,-193,-16129,-1,4095,16380,192,0,0,-256,4032
- 2850 DATA -16129,0,0,0,768,-1,1008,252,0,0,1023,-1,255,3840,252,0,0,0,0,-3265
- 2860 DATA -16129,-3073,4095,16380,192,0,0,-256,-1,4095,-1,0,-253,-16129,-1,1020,252,0,0,1023
- 2870 DATA -1,255,3840,252,0,0,0,0,-3265,-3073,-3073,4095,16380,192,0,0,-256,-1,4095,240
- 2880 DATA 0,0,-16321,-241,1023,252,0,0,1023,-1,255,3840,252,0,0,0,0,-4033,-3073,-15361
- 2890 DATA 4095,16380,192,0,0,-256,-1,252,0,0,0,0,16128,-15361,252,0,0,1023,-1,255
- 2900 DATA 3840,252,0,0,0,0,-4033,-1,-15361,4095,16380,192,0,0,-256,-1,4092,240,0,0
- 2910 DATA -16321,768,-3073,252,0,0,1023,255,0,3840,252,0,0,0,0,-4033,-193,1023,4095,4092
- 2920 DATA 240,0,0,-256,-64,4092,-1,192,-241,-16129,0,-3841,255,0,768,1020,255,0,3840,252
- 2930 DATA 0,0,0,0,-4033,-193,1023,4095,4092,240,0,16128,-64,4032,255,0,0,0,16128,252
- 2940 DATA -3841,255,0,768,1020,255,0,3840,252,0,0,0,0,-4033,-241,1020,4095,1020,252,0
- 2950 DATA -256,-256,960,1023,252,0,0,16383,1023,-3841,-16321,0,3840,1008,255,0,3840,252,0,0
- 2960 DATA 0,0,-4033,-241,1020,4095,1020,255,0,-253,-256,960,-16129,-1,-1,-1,16380,-1,-3841,-4033
- 2970 DATA 0,16128,1008,255,0,3840,252,0,0,0,0,-4033,-253,1008,4095,252,-3841,0,-961,-256
- 2980 DATA 192,-16129,0,0,0,3840,-1,-16129,-241,0,-253,960,255,0,3840,252,0,0,0,0
- 2990 DATA -4033,-253,1008,4095,252,-193,768,-3841,-256,192,-16129,-1009,0,-256,4032,-1,255,-253,240,-193
- 3000 DATA 768,255,0,3840,252,0,0,0,0,-4033,-256,960,4095,252,-253,-1,255,-256,192,-16129
- 3010 DATA -253,-1,-1,768,-1,252,16128,-1,-3841,768,255,0,3840,252,0,0,0,0,-4033,-256
- 3020 DATA 960,4095,252,16128,-1,240,-256,192,-16129,0,0,0,0,-193,192,768,-1,255,768,255
- 3030 DATA 0,3840,252,0,0,0,0,0,0,0,0,0,768,-1,0,0,0,0,3840,-1
- 3040 DATA -16129,0,0,0,0,-193,240,0,0,0,0,0,0,0,0,0,0,0,0,0
- 3050 DATA 0,0,0,0,0,0,0,0,-193,240,0,0,0,0,0,0,0,0,0,0