home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib41b.dsk
/
EAR.TRAINING.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
8KB
|
181 lines
10 REM *************************
20 REM * INTERVAL EAR TRAINING *
30 REM * by Douglas Florzak *
40 REM * *
50 REM * Copyright (C) 1991 *
60 REM * MindCraft Publ. Corp. *
70 REM * Lincoln, MA 01773 *
80 REM *************************
90 REM Modified by Stavros Karatsoridis, December 1991
100 ONERR GOTO 1760
110 SL% = 13:MI% = 5: PRINT CHR$(21)
120 DIM T1(12),T3$(12),X$(1),SL(SL%),MITEMS(MI%)
130 HOME : VTAB 7: HTAB 10: INVERSE : PRINT "INTERVAL EAR TRAINING": NORMAL : VTAB 9: HTAB 11: PRINT "by: Douglas Florzak": VTAB 15: HTAB 10: PRINT "Copyright (C) 1991 by": HTAB 8: PRINT "MindCraft Publishing Corp."
140 PRINT CHR$(4);"BLOAD NOTEPLAY": GOSUB 910
150 X$(0) = " ":X$(1) = "-->"
160 GOSUB 1190
170 REM
180 REM ** MAIN MENU IS HANDLED HERE **
190 REM
200 TL = 1:DD = 2: GOSUB 1260
210 PX = 38:SX = 4:SL(TL) = SL(TL) +(SL(TL) = 0):MX = MITEMS(TL): GOSUB 1530: IF Z = 20 THEN PRINT CHR$(7);: GOTO 210
220 ON SL(TL) GOSUB 470,320,270
230 GOTO 200
240 REM
250 REM ** QUIT SCREEN **
260 REM
270 HOME : VTAB 8: INPUT "Are you sure you want to quit? (Y/N): ";YN$: ON YN$ = "Y" OR YN$ = CHR$(121) GOTO 280: RETURN
280 END
290 REM
300 REM ** TEST MENU IS HANDLED HERE **
310 REM
320 EV = 10:R = 0:W = 0
330 FOR K = 1 TO EV
340 TL = 2:HM = 1:DD = 1: GOSUB 1260: GOSUB 920
350 IF Z$ = CHR$(27) THEN RETURN
360 A1 = INT( RND(1) *12 +1)
370 GOSUB 970:PI = T1(A1): GOSUB 1010: VTAB 24: HTAB 1: CALL -868: GOSUB 1320
380 PX = 38:SX = 4:SL(TL) = SL(TL) +(SL(TL) = 0):MX = MITEMS(TL): GOSUB 1360: IF Z = 20 THEN RETURN
390 IF SL(TL) = 13 THEN GOTO 370
400 GOSUB 600
410 NEXT K
420 GOSUB 1080
430 RETURN
440 REM
450 REM ** PRACTICE MENU IS HANDLED HERE **
460 REM
470 TL = 3:HM = 1:DD = 2: GOSUB 1260
480 FOR K = 1 TO 12
490 GOSUB 1320:PX = 38:SX = 4:SL(TL) = SL(TL) +(SL(TL) = 0):MX = MITEMS(TL): GOSUB 1530: IF Z = 20 THEN RETURN
500 VTAB 24: HTAB 1: CALL -868
510 IF SL(TL) = 2 AND K = 1 THEN GOSUB 810: GOTO 490
520 IF SL(TL) = 2 THEN K = K -1: GOSUB 810:K = K +1: GOTO 490
530 GOSUB 810
540 NEXT K
550 GOSUB 910
560 RETURN
570 REM
580 REM ** FEEDBACK SCREEN **
590 REM
600 HOME
610 IF A1 = SL(TL) THEN R = R +1: GOTO 720
620 W = W +1
630 VTAB 2: HTAB 15: INVERSE : PRINT "INCORRECT!": NORMAL : GOSUB 970
640 PRINT : PRINT : HTAB 11: PRINT "The correct answer was:": GOSUB 970
650 PI = T1(A1): GOSUB 1010
660 PRINT : HTAB 11: PRINT "<";A1;">"; SPC( 2);MENU$(TL,A1)
670 GOSUB 970
680 PRINT : PRINT : HTAB 16: PRINT "You chose:": GOSUB 970
690 PI = T1(SL(TL)): GOSUB 1010
700 PRINT : HTAB 11: PRINT "<";SL(TL);">"; SPC( 2);MENU$(TL,SL(TL))
710 GOTO 760
720 VTAB 2: HTAB 15: INVERSE : PRINT "CORRECT!": NORMAL : GOSUB 970
730 PRINT : PRINT : HTAB 11: PRINT "The answer was:": GOSUB 970
740 PI = T1(SL(TL)): GOSUB 1010
750 PRINT : HTAB 11: PRINT "<";A1;">"; SPC( 2);MENU$(TL,A1)
760 GOSUB 910
770 RETURN
780 REM
790 REM ** PRACTICE ROUTINE **
800 REM
810 VM = 11: VTAB VM: HTAB 1: PRINT "---------------------------------------"
820 VTAB VM +2: CALL -868: PRINT "Interval #";K;": ";
830 CALL -868: PRINT MENU$(2,K)
840 VTAB VM +6: PRINT "Sounds": PRINT "Like: ";
850 PI = T1(K): GOSUB 1010
860 CALL -868: PRINT T3$(K)
870 RETURN
880 REM
890 REM ** 'PRESS RETURN' MESSAGE **
900 REM
910 VTAB 24: HTAB 8: PRINT "Press <Return> to Continue ";: GET Z$: RETURN
920 VTAB 24: HTAB 1: PRINT "Press <Return> to Play Random Interval ";: GET Z$: RETURN
930 VTAB 24: HTAB 1: PRINT " Enter 2nd digit or press <Return>: ";: RETURN
940 REM
950 REM ** TIME DELAY ROUTINE **
960 REM
970 FOR I = 1 TO 1500: NEXT : RETURN
980 REM
990 REM ** CALL NOTEPLAY ROUTINE **
1000 REM
1010 POKE 817,195: CALL 768: REM PLAY 1ST NOTE
1020 POKE 817,00: CALL 768: REM PLAY REST
1030 POKE 817,PI: CALL 768: REM PLAY INTERVAL NOTE
1040 RETURN
1050 REM
1060 REM ** STATISTICS SCREEN **
1070 REM
1080 HOME :RP = (R/EV) *100:WP = (W/EV) *100
1090 LM = 10
1100 VTAB 2: HTAB 10: PRINT "Interval Ear Training"
1110 VTAB 4: HTAB 15: PRINT "Test Score"
1120 VTAB 7: HTAB LM: PRINT "Correct: ";R; SPC( 5); INT(RP);"%"
1130 VTAB 9: HTAB LM: PRINT "Wrong: ";W; SPC( 5); INT(WP);"%"
1140 GOSUB 910
1150 RETURN
1160 REM
1170 REM ** LOAD TONE VALUES, SONG NAMES AND MENU TABLES **
1180 REM
1190 RESTORE : FOR I = 1 TO 12: READ T1(I): NEXT
1200 FOR I = 1 TO 12: READ T3$(I): NEXT
1210 READ NMENUS: DIM MENU$(NMENUS,SL%): FOR I = 1 TO NMENUS: READ MITEMS(I): FOR J = 0 TO MITEMS(I): READ MENU$(I,J): NEXT J,I
1220 RETURN
1230 REM
1240 REM ** DISPLAY MENU ROUTINE **
1250 REM
1260 HOME : IF TL < >1 THEN PRINT "<";: INVERSE : PRINT "ESC";: NORMAL : PRINT "> - "MENU$(HM,0)
1270 TL$ = MENU$(TL,0): VTAB 3: HTAB INT((40 - LEN(TL$))/2)
1280 INVERSE : PRINT TL$: NORMAL
1290 FOR I = 1 TO MITEMS(TL): VTAB 4 +DD *I: HTAB 8: PRINT I". ";
1300 IF I <10 THEN PRINT " ";
1310 PRINT MENU$(TL,I): NEXT
1320 VTAB 24: HTAB 1: PRINT "Use number/arrows & press <Return>: ";: RETURN
1330 REM
1340 REM ** MENU HANDLING ROUTINE FOR MENUS WITH > 9 ITEMS **
1350 REM
1360 SL = SL(TL)
1370 N = SL:OS = SL: GOSUB 1580:Z = 0:ZZ = 0:ST = 1: VTAB 24: HTAB PX: CALL -868: POKE -16368,0
1380 VTAB 24: HTAB PX: PRINT SL;: WAIT -16384,128:Z = PEEK( -16384) -128
1390 IF Z <49 OR Z >MX +48 THEN GOTO 1480
1400 ST = SL:SL = Z -48:N = OS: GOSUB 930
1410 VTAB 24: HTAB PX: PRINT SL;: CALL -868: POKE -16368,0: WAIT -16384,128:ZZ = PEEK( -16384) -128
1420 IF Z = 49 AND SL = 1 THEN SL = 0:N = OS: GOSUB 1580:SL = 1: GOTO 1440
1430 GOSUB 1580
1440 GOSUB 1320
1450 IF ZZ <48 OR ZZ >MX +48 THEN GOTO 1370
1460 IF (ZZ -48) +((Z -48) *10) >MX THEN SL = ST: GOTO 1370
1470 SL = (ZZ -48) +((Z -48) *10): GOTO 1370
1480 Z = (Z = 21 OR Z = 10) -(Z = 8 OR Z = 11) +10 *(Z = 13) +20 *(Z = 27)
1490 ON NOT Z GOTO 1380:SL = SL +Z *(Z <10):SL = SL -MX *(SL >MX) +MX *(SL <1):N = OS: GOSUB 1580: ON Z <10 GOTO 1370:SL(TL) = SL: POKE -16368,0: RETURN
1500 REM
1510 REM ** MENU HANDLING ROUTINE FOR MENUS WITH < 10 ITEMS **
1520 REM
1530 SL = SL(TL)
1540 N = SL:OS = SL: GOSUB 1580:Z = 0: VTAB 24: HTAB PX: CALL -868: POKE -16368,0
1550 VTAB 24: HTAB PX: PRINT SL;: WAIT -16384,128:Z = PEEK( -16384) -128: IF Z > = 49 AND Z < = MX +48 THEN SL = Z -48:N = OS: GOSUB 1580: GOTO 1540
1560 Z = (Z = 21 OR Z = 10) -(Z = 8 OR Z = 11) +10 *(Z = 13) +20 *(Z = 27)
1570 ON NOT Z GOTO 1540:SL = SL +Z *(Z <10):SL = SL -MX *(SL >MX) +MX *(SL <1):N = OS: GOSUB 1580: ON Z <10 GOTO 1540:SL(TL) = SL: POKE -16368,0: RETURN
1580 VTAB 4 +DD *N: HTAB SX: PRINT X$(SL = OS);: RETURN
1590 REM
1600 REM ** DATA STATEMENTS **
1610 REM
1620 DATA 184,174,164,155,146,138,130,123,116,110,103,98
1630 DATA <unknown>,"Do, Re, Me, Fa",Greensleeves,Michael Row the Boat
1640 DATA Here Comes the Bride,Maria
1650 DATA "Twinkle, Twinkle Little Star",Love Story,My Bonnie Lies Over the Ocean
1660 DATA There's a Place for Us,<unknown>,Somewhere Over the Rainbow
1670 DATA 3,3,"INTERVAL EAR TRAINING: MAIN MENU",Practice,Test,Quit
1680 DATA 13,"INTERVAL EAR TRAINING: TEST"
1690 DATA Minor 2nd, Major 2nd, Minor 3rd, Major 3rd
1700 DATA Perfect 4th,"Dim. 5th, Aug. 4th, Tritone", Perfect 5th, Minor 6th
1710 DATA Major 6th, Minor 7th, Major 7th, Octave, Repeat
1720 DATA 2,INTERVAL PRACTICE,Continue,Repeat
1730 REM
1740 REM ** ERROR HANDLING **
1750 REM
1760 ER = PEEK(222):LI = PEEK(218) + PEEK(219) *256
1770 IF ER >10 THEN GOTO 1800
1780 ON ER GOTO 1800,1800,1800,1800,1800,1790,1800,1800,1800,1800
1790 HOME : VTAB 12: HTAB 3: INVERSE : PRINT "BINARY FILE NOTEPLAY NOT FOUND ON DISK": NORMAL : GOSUB 910: VTAB 24: HTAB 1: CALL -868: GOTO 1810
1800 VTAB 23: HTAB 05: PRINT "ERROR <";ER;"> OCCURED AT LINE <";LI;">"
1810 END