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

  1. 10  REM **********************
  2. 20  REM * MUSIC.LESSON       *
  3. 30  REM * BY  TIMOTHY THOMAS *
  4. 40  REM * COPYRIGHT (C) 1989 *
  5. 50  REM * BY MICROSPARC, INC *
  6. 60  REM * CONCORD, MA  01742 *
  7. 70  REM **********************
  8. 80  REM 
  9. 90  LOMEM: 16682
  10. 100  TEXT : PRINT  CHR$(21): HOME : GOTO 540
  11. 110  REM  MAIN LOOP
  12. 120  HOME 
  13. 130  REM  XDRAW N(R) AT X(Z),Y(R)
  14. 140  POKE  -16368,0: VTAB 21: CALL  -958:Z = Z +1: ON Z = 27 GOTO 360:R = R(Z):R$ =  MID$ (N$,R,1): XDRAW N(R) AT X(Z),Y(R)
  15. 150  VTAB 21: PRINT "WHICH NOTE IS THIS? ": IF S = 4  THEN  VTAB 21: HTAB 21: GET Z$: PRINT Z$:K =  ASC(Z$) +128: GOTO 200
  16. 160  FOR J = 1 TO S *SP: IF J/8 =  INT(J/8)  THEN FL =   NOT FL
  17. 170 CURSUR = 160 +95 *FL: VTAB 21: HTAB 21: PRINT  CHR$(CURSUR);:K =  PEEK(KB): IF K >127  THEN 200
  18. 180  NEXT J: HTAB 21: PRINT  SPC( 5)"TOO LATE!"; SPC( 6): NORMAL :T = Z: IF REVIEW  THEN T = M(N)
  19. 190  GOTO 330
  20. 200  IF (K <193  OR K >199)  AND (K <225  OR K >231)  THEN  VTAB 21: HTAB 26: PRINT "ILLEGAL ENTRY"; SPC( 2): FOR I = 1 TO 5: POKE 8,160: POKE 6,5: CALL 768: FOR W = 1 TO 10: NEXT W: NEXT I: POKE KB +16,0: GOTO 150
  21. 210 V =  INT((((S *SP) -J)/S)/2 +(D/4)):V = 6 *(V >6) +V *(V < = 6):Z$ =  CHR$(K -128):Z1$ =  CHR$(K -160): IF S = 4  THEN V = 0
  22. 220  POKE KB +16,0: VTAB 21: HTAB 21: PRINT Z$;: IF Z$ < >R$  AND Z1$ < >R$  THEN 310
  23. 230  HTAB 26: PRINT "RIGHT!!"; SPC( 8)
  24. 240  IF S = 4  THEN 270
  25. 250 VV = VV +V: FOR I = 1 TO V: XDRAW 10 AT X,Y:X = X +5: IF X = 278  THEN X = 3:Y = Y +12
  26. 260  NEXT I
  27. 270 T = Z: IF REVIEW  THEN T = M(N):RI = RI +1
  28. 280  POKE 8,T(R(T)): POKE 6,30: CALL 768
  29. 290  GOSUB 910:C = C +1: IF   NOT REVIEW  THEN 120
  30. 300  XDRAW N(R) AT X(M(N)),Y(R):M(N) = 0: GOTO 430
  31. 310  HTAB 26: PRINT "WRONG!!"; SPC( 8):T = Z: IF REVIEW  THEN T = M(N)
  32. 320 T = Z: IF REVIEW  THEN T = M(N)
  33. 330  FOR I = 1 TO 8: POKE 8,T(R(T)): POKE 6,5: CALL 768: POKE 8,T(R(T)) +10: POKE 6,5: CALL 768: NEXT I:MISTAKE = 1: GOSUB 910: IF   NOT REVIEW  THEN M = M +1:M(M) = Z
  34. 340  VTAB 21: CALL  -958: PRINT "THE RIGHT ANSWER IS ";R$;".": PRINT "YOU NEED TO PRACTICE THAT ONE!!": GOSUB 910: IF   NOT REVIEW  THEN 120
  35. 350  XDRAW N(R) AT X(M(N)),Y(R): GOTO 430
  36. 360 PC =  INT(C/(Z -1) *10000/100): VTAB 21: HTAB 1: PRINT "YOU GOT ";C;" RIGHT OUT OF 26": PRINT "IN THE FIRST ROUND.": PRINT "THAT'S ";PC;" PERCENT.";: GOSUB 910: IF M = 0  THEN 440
  37. 370 REVIEW = 1: VTAB 21: HTAB 1: CALL  -958: PRINT "NOW LET'S REVIEW YOUR MISTAKES."
  38. 380  REM FLASH NOTES
  39. 390  FOR I = 1 TO 26: XDRAW N(R(I)) AT X(I),Y(R(I)): NEXT I: FOR J = 1 TO 16: FOR I = 1 TO M: XDRAW N(R(M(I))) AT X(M(I)),Y(R(M(I))): NEXT I: FOR W = 1 TO 27 -M: NEXT W: NEXT J
  40. 400  REM REVIEW
  41. 410  FOR N = 1 TO M: IF M(N) = 0  THEN  NEXT : ON (RI = M) +1 GOTO 410,440
  42. 420  POKE  -16368,0: VTAB 21: CALL  -958:Z = Z +1:R = R(M(N)):R$ =  MID$ (N$,R,1): XDRAW N(R) AT X(M(N)),Y(R): GOTO 150
  43. 430  NEXT N: GOTO 410
  44. 440 SC =  INT(PC *15 *(D/3 +1) +VV)
  45. 450  VTAB 21: HTAB 1: PRINT "YOU TOOK ";Z -1;" TRIES TO GET 26 NOTES RIGHT.": VTAB 22: HTAB 1: PRINT "THAT'S A SCORE OF "SC"."
  46. 460  FOR I = 1 TO 26: XDRAW N(R(I)) AT X(I),Y(R(I)): POKE 8,T(R(I)): POKE 6,20: CALL 768: NEXT I
  47. 470  IF S = 4  THEN SS =  INT(PC/15) +1: GOTO 490
  48. 480 SS =  INT((VV/1.65 +PC +(2600/(Z -1)))/43 +.5)
  49. 490  VTAB 23: HTAB 1: PRINT S$(SS);: CALL  -868
  50. 500  VTAB 24: HTAB 1: PRINT "WANT SOME MORE? (Y/N) ";: GET I$: IF I$ = "Y"  OR I$ =  CHR$(121)  THEN  CLEAR :GF = 1: GOTO 560
  51. 510  IF I$ < >"N"  AND I$ < > CHR$(110)  THEN 500
  52. 520  TEXT : HOME : END 
  53. 530  REM  INITIALIZE
  54. 540  ONERR  GOTO 930
  55. 550  IF  PEEK(16384) < >10  OR  PEEK(233) < >64  THEN  PRINT  CHR$(4)"BLOAD MUSIC.SHAPES": POKE 232,0: POKE 233,64
  56. 560  POKE 216,0: DIM T(26),R(26),F(26),X(26),Y(26),N(26),M(26),S$(7)
  57. 570  FOR I = 1 TO 26:X(I) = 30 +9 *I: READ T(I): NEXT I: FOR I = 1 TO 26: READ N(I): NEXT 
  58. 580 Y = 34: FOR I = 1 TO 26:Y(I) = Y:Y = Y +3 +6 *(I = 13): NEXT I: FOR I = 768 TO 796: READ A: POKE I,A: NEXT I
  59. 590  FOR I = 1 TO 7: READ S$(I): NEXT I
  60. 600  DATA 14,16,18,20,22,25,27,30,34,39,42,47,53,53,56,62,71,80,86,96,108,114,128,144,160,172
  61. 610  DATA 6,3,4,3,4,3,2,1,2,1,2,1,5,6,3,4,3,4,3,2,1,2,1,2,1,5
  62. 620  DATA 165,8,74,133,9,164,8,173,48,192,136,234,234,208,251,165,7,56,229,9,133,7,176,237,198,6,208,233,96
  63. 630  DATA  YOU NEED PRACTICE - BADLY!,JUST PASSED!,KEEP TRYING!,NOT TOO BAD!,VERY GOOD!,EXCELLENT!,BEETHOVEN JUNIOR!
  64. 640  IF GF  THEN 710
  65. 650 CL = 3: GOTO 800
  66. 660 GF = 1: FOR I = 26 TO 1  STEP  -1: DRAW N(I) AT X(27 -I),Y(I): POKE 8,T(I): POKE 6,10: CALL 768: FOR W = 1 TO 10: NEXT : NEXT I
  67. 670 X$ = "WELCOME TO MUSIC LESSON - BY TIM THOMAS COPYRIGHT (C) 1989 - BY MICROSPARC, INC"
  68. 680  VTAB 21: HTAB 1: CALL  -958: FOR I = 1 TO  LEN(X$): PRINT  MID$ (X$,I,1);: POKE 8, ASC( MID$ (X$,I,1)): POKE 6,5: CALL 768: NEXT 
  69. 690  GOSUB 910
  70. 700  REM  MENU
  71. 710  TEXT : HOME : POKE 32,12: POKE 33,28: VTAB 10: PRINT "SPEED": PRINT 
  72. 720  PRINT "1) FAST": PRINT "2) MEDIUM": PRINT "3) SLOW": PRINT "4) UNTIMED": PRINT : PRINT "  <-- CHOOSE": VTAB 17: GET I$:S =  VAL(I$): ON (S <1  OR S >4) GOTO 710
  73. 730  HOME : VTAB 10: PRINT "CLEF(S)": PRINT : PRINT "1) TREBLE CLEF": PRINT "2) BASS CLEF": PRINT "3) BOTH CLEFS": PRINT : PRINT "  <-- CHOOSE": VTAB 16: GET I$:CL =  VAL(I$): ON (CL <1  OR CL >3) GOTO 730:D = CL *3 -S +1
  74. 740  HOME : VTAB 10: PRINT "SOUND": PRINT : PRINT "1) SOUND ON": PRINT "2) SOUND OFF": PRINT : PRINT "  <-- CHOOSE": VTAB 15: GET I$:SO =  VAL(I$): ON (SO <1  OR SO >2) GOTO 740: POKE 768,96 +69 *(SO = 1)
  75. 750  REM DETERMINE ORDER OF NOTES
  76. 760  TEXT : HOME : VTAB 10: PRINT "ONE MOMENT PLEASE";
  77. 770  FOR I = 1 TO 26
  78. 780  PRINT ".";:R =  INT( RND(1) *(13 +(13 *(CL = 3))) +1) +13 *(CL = 2): ON (F(R) = (CL <3) +1) GOTO 780:R(I) = R: ON (R(I) = R(I -1)  AND I < >26) GOTO 780:F(R) = F(R) +1: NEXT I: PRINT 
  79. 790  REM DRAW STAVES AND CLEFS
  80. 800  POKE 230,32: CALL  -3086: SCALE= 1: ROT= 0: HCOLOR= 3
  81. 810  IF CL = 2  THEN 830
  82. 820  FOR Y = 40 TO 64  STEP 6: HPLOT 1,Y TO 279,Y: NEXT Y: HPLOT 1,40 TO 1,64: HPLOT 2,40 TO 2,64: IF CL = 1  THEN 840
  83. 830  FOR Y = 85 TO 109  STEP 6: HPLOT 1,Y TO 279,Y: NEXT Y: HPLOT 1,85 TO 1,109: HPLOT 2,85 TO 2,109
  84. 840  IF CL < >2  THEN  DRAW 7 AT 15,52
  85. 850  IF CL < >1  THEN  DRAW 8 AT 15,94
  86. 860 N$ = "AGFEDCBAGFEDCCBAGFEDCBAGFE":KB =  -16384:X = 3:Y = 130:SP = 30
  87. 870  HOME : POKE  -16304,0: POKE  -16301,0: POKE  -16297,0: POKE  -16300,0: IF GF = 1  THEN GF = 0: GOTO 890
  88. 880 CL = 0: GOTO 660
  89. 890  GOSUB 910
  90. 900  GOTO 120
  91. 910  VTAB 24: HTAB 1: PRINT "<RETURN> TO CONTINUE, <ESC> TO END ";: GET I$: HOME : IF I$ =  CHR$(27)  THEN  TEXT : HOME : VTAB 23: END 
  92. 920  RETURN 
  93. 930  PRINT "CAN'T FIND MUSIC.SHAPES": GOSUB 910: GOTO 550