home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib40b.dsk / PIANO.bas < prev    next >
BASIC Source File  |  2023-02-26  |  7KB  |  145 lines

  1. 10  REM  ***********************
  2. 20  REM  *      Piano          *
  3. 30  REM  * for Ampersound.GS   *
  4. 40  REM  *  by Eric Shepherd   *
  5. 50  REM  *   (C) 1991 by       *
  6. 60  REM  * MindCraft Publ.Corp.*
  7. 70  REM  * Lincoln, MA  01742  *
  8. 80  REM  ***********************
  9. 90  DIM N(6,12): REM  Array for note frequencies
  10. 100  PRINT  CHR$(4)"BRUN AMPERSOUND.GS": HIMEM: 32768: PRINT  CHR$(21): TEXT : HOME 
  11. 110 P = 128/3.1415926
  12. 120  PRINT  TAB( 12)"Apple IIgs Piano"
  13. 130  VTAB 24: FLASH : PRINT "PLEASE WAIT...";: NORMAL 
  14. 140  VTAB 6
  15. 150  HTAB 1
  16. 160  FOR I = 1 TO 4
  17. 170  INVERSE : PRINT "  ";: NORMAL : PRINT "  ";: INVERSE : PRINT " ";: NORMAL : PRINT "  ";: REM  2 spaces each
  18. 180  INVERSE : PRINT " ! ";: NORMAL : PRINT "  ";: INVERSE : PRINT "  ";: NORMAL : PRINT "  ";: INVERSE : PRINT "  ";: NORMAL : PRINT "  ";: INVERSE : PRINT "  "
  19. 190  NEXT 
  20. 200  FOR I = 1 TO 3
  21. 210  PRINT "  !   ! ! !    !   !  ": REM  2,3,1,1,4,3,2 spaces
  22. 220  NEXT : NORMAL 
  23. 230  VTAB 5: PRINT "  C# D#   F#  G#  A#": VTAB 13: PRINT "C   D  E F  G   A   B": REM  2,1,3,2,2 : 3,2,1,2,3,3 spaces
  24. 240  VTAB 6
  25. 250  FOR I = 1 TO 7: HTAB 26: INVERSE : PRINT " ": NEXT 
  26. 260  VTAB 6
  27. 270  FOR I = 1 TO 7: HTAB 30: INVERSE : PRINT " ": NEXT 
  28. 280  NORMAL 
  29. 290 A$ = "Volume":L =  LEN(A$): FOR I = 1 TO L: VTAB 13 +I: HTAB 26: PRINT  MID$ (A$,I,1): NEXT 
  30. 300 A$ = "Octave":L =  LEN(A$): FOR I = 1 TO L: VTAB 13 +I: HTAB 30: PRINT  MID$ (A$,I,1): NEXT 
  31. 310  INVERSE 
  32. 320  VTAB 18: FOR I = 1 TO 2: PRINT "          ": NEXT : PRINT "   QUIT   ": FOR I = 1 TO 2: PRINT "          ": NEXT : REM  10,3,3,10 spaces
  33. 330  VTAB 18: FOR I = 1 TO 2: HTAB 12: PRINT "          ": NEXT : HTAB 12: PRINT "   HELP   ": FOR I = 1 TO 2: HTAB 12: PRINT "          ": NEXT : REM  10,3,3,10 spaces
  34. 340  VTAB 6: HTAB 33: PRINT "      ": HTAB 33: PRINT " LOAD ": HTAB 33: PRINT " WAVE ": HTAB 33: PRINT "      ": REM  6,1,1,1,1,6 spaces
  35. 350  NORMAL 
  36. 360  REM  Set up variables
  37. 370 V = 108: VTAB 8: HTAB 26: INVERSE : PRINT "-": NORMAL 
  38. 380 O = 3: VTAB 9: HTAB 30: INVERSE : PRINT "3": NORMAL 
  39. 390  GOSUB 1410: REM  Load sound wave
  40. 400  GOSUB 1430: REM  Create note array
  41. 410  VTAB 24: PRINT "                ";: REM  16 spcs
  42. 420  REM   Set up mouse  
  43. 430  VTAB 16: PRINT  CHR$(4)"PR#4": PRINT  CHR$(1): PRINT  CHR$(4)"PR#0"
  44. 440 OL = 160:OD = 2039
  45. 450  PRINT  CHR$(4)"IN#4"
  46. 460  VTAB 2: HTAB 40: INPUT "";MX,MY,MB
  47. 470  PRINT  CHR$(4)"IN#0"
  48. 480 MY =  INT(MY/6) +1
  49. 490 MX =  INT(MX/4) +1
  50. 500  IF MY >24  THEN MY = 24
  51. 510  IF MX >40  THEN MX = 40
  52. 520  IF MB = 2  OR MB = 1  THEN  GOSUB 630
  53. 530  IF MB = 3  THEN  &  STOP 0
  54. 540  IF  PEEK( -16384) >128  THEN 1190
  55. 550  POKE OD,OL
  56. 560 PK = 128 *MY +MX -(984 * INT((MY -1)/8)) +895
  57. 570 OL =  PEEK(PK)
  58. 580 OD = PK
  59. 590 CR = 170
  60. 600  IF OL <128  THEN CR = 170 -128
  61. 610  POKE PK,CR
  62. 620  GOTO 450
  63. 630  REM  Start a noise
  64. 640  IF (MY >5  AND MY <9)  AND (MX >32  AND MX <40)  THEN 1250
  65. 650  IF (MY >17  AND MY <21)  AND (MX >11  AND MX <23)  THEN 1280
  66. 660  IF (MY >17  AND MY <23)  AND (MX >0  AND MX <11)  THEN 940
  67. 670  IF (MY <13  AND MY >5)  AND MX = 26  THEN 1040
  68. 680  IF (MY <14  AND MY >5)  AND MX = 30  THEN 1100
  69. 690  IF MY >12  OR MY <6  THEN  &  STOP 0: RETURN 
  70. 700  IF MX >22  OR MX <1  THEN  &  STOP 0: RETURN 
  71. 710  IF MX = 1  OR MX = 2  THEN  &  ON 0,N(O,1),V
  72. 720  IF MY <10  THEN 800
  73. 730  IF MX = 4  OR MX = 5  OR MX = 6  THEN  &  ON 0,N(O,3),V
  74. 740  IF MX = 8  THEN  &  ON 0,N(O,5),V
  75. 750  IF MX = 10  THEN  &  ON 0,N(O,6),V
  76. 760  IF MX = 12  OR MX = 13  OR MX = 14  OR MX = 15  THEN  &  ON 0,N(O,8),V
  77. 770  IF MX = 17  OR MX = 18  OR MX = 19  THEN  &  ON 0,N(O,10),V
  78. 780  IF MX = 21  OR MX = 22  THEN  &  ON 0,N(O,12),V
  79. 790  RETURN 
  80. 800  REM  Sharps
  81. 810  IF MX = 3  OR MX = 4  THEN  &  ON 0,N(O,2),V
  82. 820  IF MX = 6  OR MX = 7  THEN  &  ON 0,N(O,4),V
  83. 830  IF MX = 11  OR MX = 12  THEN  &  ON 0,N(O,7),V
  84. 840  IF MX = 15  OR MX = 16  THEN  &  ON 0,N(O,9),V
  85. 850  IF MX = 19  OR MX = 20  THEN  &  ON 0,N(O,11),V
  86. 860  REM  and Upper key parts
  87. 870  IF MX = 5  THEN  &  ON 0,N(O,3),V
  88. 880  IF MX = 8  THEN  &  ON 0,N(O,5),V
  89. 890  IF MX = 10  THEN  &  ON 0,N(O,6),V
  90. 900  IF MX = 13  OR MX = 14  THEN  &  ON 0,N(O,8),V
  91. 910  IF MX = 17  OR MX = 18  THEN  &  ON 0,N(O,10),V
  92. 920  IF MX = 21  OR MX = 22  THEN  &  ON 0,N(O,12),V
  93. 930  RETURN 
  94. 940  REM  Quit is pressed
  95. 950  VTAB 24: PRINT  CHR$(7);
  96. 960  PRINT "Quit? (Y/N):";
  97. 970  GET A$
  98. 980  IF A$ = "Y"  OR A$ = "y"  THEN  HOME : END 
  99. 990  IF A$ < >"N"  AND A$ < >"n"  THEN 970
  100. 1000  HTAB 1
  101. 1010  VTAB 24: PRINT "              ";
  102. 1020  POKE  -16368,0
  103. 1030  RETURN 
  104. 1040 V =  INT((MY -5) *36)
  105. 1050  VTAB 6
  106. 1060  INVERSE 
  107. 1070  FOR I = 1 TO 7: HTAB 26: PRINT " ": NEXT : VTAB MY: HTAB MX: PRINT "-": NORMAL 
  108. 1080  VTAB 6: FOR I = 1 TO 7: HTAB 25: PRINT " ": NEXT : VTAB 6: FOR I = 1 TO 7: HTAB 27: PRINT " ": NEXT 
  109. 1090 PK = 128 *MY +MX -(984 * INT((MY -1)/8)) +895:OL =  PEEK(PK): RETURN 
  110. 1100  REM  Set octave
  111. 1110 O =  INT(MY -6)
  112. 1120  IF O <1  THEN O = 1: IF O >6  THEN O = 6
  113. 1130  VTAB 6
  114. 1140  INVERSE 
  115. 1150  FOR I = 1 TO 7: HTAB 30: PRINT " ": NEXT : VTAB MY: HTAB MX: PRINT O: NORMAL 
  116. 1160  VTAB 6: FOR I = 1 TO 7: HTAB 31: PRINT " ": NEXT 
  117. 1170  VTAB 6: FOR I = 1 TO 7: HTAB 29: PRINT " ": NEXT 
  118. 1180  GOTO 1090
  119. 1190  REM  Keyboard command
  120. 1200 P =  PEEK( -16384): POKE  -16368,0
  121. 1210 P = P -128:P$ =  CHR$(P)
  122. 1220  IF P$ >"6"  OR P$ <"1"  THEN 550
  123. 1230 P =  VAL(P$): VTAB 6: INVERSE : FOR I = 1 TO 7: HTAB 30: PRINT " ": NEXT : VTAB 6 +P: HTAB 30: PRINT P$: NORMAL :O = P: GOTO 550
  124. 1240  GOTO 550
  125. 1250  REM  Load sound wave
  126. 1260  VTAB 23: INPUT "Load what wave: ";F$
  127. 1270  PRINT  CHR$(4)"BLOAD "F$",A16384": &  LOAD 16384: VTAB 23: PRINT "                                 ";: RETURN : REM  33 spc
  128. 1280  REM  Help
  129. 1290  POKE 33,25: POKE 34,14: HOME : TEXT 
  130. 1300  VTAB 15: HTAB 1: PRINT "Click the keys with the": PRINT "mouse to play. Slide": PRINT "the pointer on the": PRINT "sliding control to": PRINT "change volume. Use the ": PRINT "sliding control for the"
  131. 1310  PRINT "octave. Keys 1-6 also": PRINT "change the octave.": PRINT "Click QUIT to quit.";
  132. 1320  WAIT  -16384,128: POKE  -16368,0
  133. 1330  POKE 33,25: POKE 34,14: HOME : TEXT 
  134. 1340  VTAB 18: HTAB 1
  135. 1350  INVERSE : FOR I = 1 TO 2: PRINT "          ": NEXT : PRINT "   QUIT   ": FOR I = 1 TO 2: PRINT "          ": REM  10,3,3,10 spc
  136. 1360  NEXT 
  137. 1370  VTAB 18: FOR I = 1 TO 2: HTAB 12: PRINT "          ": NEXT : HTAB 12: PRINT "   HELP   ": FOR I = 1 TO 2: HTAB 12: PRINT "          ": NEXT : REM  10,3,3,10 spc
  138. 1380  NORMAL 
  139. 1390  RETURN 
  140. 1400  END 
  141. 1410  REM  Load sound wave
  142. 1420  FOR I = 0 TO 255:Y = 128 +127 * SIN(I/P): POKE 16384 +I,Y: NEXT : &  LOAD 16384: RETURN 
  143. 1430  REM  Create frequency array
  144. 1440  DATA   20856,22080,23400,24800,26280,27840,29500,31240,33120,35080,37160,39380
  145. 1450  FOR I = 1 TO 12: READ N(6,I): FOR J = 5 TO 1  STEP  -1:N(J,I) = N(J +1,I)/2: NEXT J,I: RETURN