1 KEY 15, CHR$(0) + CHR$(1): ON KEY(15) GOSUB 2000: KEY(15) ON DEFSNG A-Z COLOR 6, 1 CLS : PRINT SPACE$(70) PRINT " ============================================================ " PRINT " E L E C T R O N I C J .S . B A C H P R O G R A M " PRINT SPACE$(70) PRINT " This 'freeware' product was developed by The Copy Exchange" PRINT " 1133 Howell Iowa City, IA 52240, in 1988. This is v 4.080107-01/07/2008" PRINT SPACE$(70) PRINT " This program simulates different musicbox sounds in response " PRINT " to user input." PRINT " ============================================================ " 20 DIM N(12): DIM CRCL(13): DIM MACL(7): DIM MICL(7): DIM scales$(12): DIM notescs$(24): DIM KYCL(12) scales$(1) = " 1=A 2=B 3=C# 4=D 5=E 6=F# 7=G#" scales$(2) = " 1=B-flat 2=C 3=D 4=E-flat 5=F 6=G 7=A" scales$(3) = " 1=B 2=C# 3=D# 4=E 5=F# 6=G# 7=A#" scales$(4) = " 1=C 2=D 3=E 4=F 5=G 6=A 7=B" scales$(5) = " 1=C# 2=D# 3=E# 4=F# 5=G# 6=A# 7=B#" scales$(6) = " 1=D 2=E 3=F# 4=G 5=A 6=B 7=C#" scales$(7) = " 1=E-flat 2=F 3=G 4=A-flat 5=B-flat 6=C 7=D" scales$(8) = " 1=E 2=F# 3=G# 4=A 5=B 6=C# 7=D#" scales$(9) = " 1=F 2=G 3=A 4=B-flat 5=C 6=D 7=E" scales$(10) = " 1=F# 2=G# 3=A# 4=B 5=C# 6=D# 7=E#" scales$(11) = " 1=G 2=A 3=B 4=C 5=D 6=E 7=F#" scales$(12) = " 1=A-flat 2=B-flat 3=C 4=D-flat 5=E-flat 6=F 7=G" notescs$(1) = "A" notescs$(2) = "A#-Bb" notescs$(3) = "B" notescs$(4) = "C" notescs$(5) = "C#-Db" notescs$(6) = "D" notescs$(7) = "D#-Eb" notescs$(8) = "E" notescs$(9) = "F" notescs$(10) = "F#-Gb" notescs$(11) = "G" notescs$(12) = "G#-Ab" 57 R = 3: RANDOMIZE R 60 PIT = 440: Z = 16.819: CRCL(1) = PIT 61 FOR I = 2 TO 13: CRCL(I) = CRCL(I - 1) * (1 + (1 / Z)): NEXT I MACL(1) = CRCL(1) MACL(2) = CRCL(3) MACL(3) = CRCL(5) MACL(4) = CRCL(6) MACL(5) = CRCL(8) MACL(6) = CRCL(10) MACL(7) = CRCL(12) 78 N1% = 1: N2% = 3: N3% = 1: D = 2.3: MAXN% = 7: GOTO 450 80 SOUND N(1), 8 110 N = 0: LOCATE 12, 1 PRINT SPACE$(70): PRINT SPACE$(70) PRINT " Please choose key. " PRINT " 1=A 2=B-flat 3=B 4=C 5=C# 6=D 7=E-flat 8=E 9=F 10=F# 11=G 12=A-flat" PRINT SPACE$(70): PRINT SPACE$(70) INPUT " Key (1-12) =>", KY% IF KY% > 0 AND KY% < 13 THEN FOR I = 1 to KY%-1: PIT = PIT * (1 + (1 / Z)): NEXT I KYCL(1) = PIT FOR I = 2 TO 13: KYCL(I) = KYCL(I - 1) * (1 + (1 / Z)): NEXT I MACL(1) = KYCL(1) MACL(2) = KYCL(3) MACL(3) = KYCL(5) MACL(4) = KYCL(6) MACL(5) = KYCL(8) MACL(6) = KYCL(10) MACL(7) = KYCL(12) CLS FOR K = 1 TO 7 NOTE = CINT(MACL(K)) LOCATE 5, K*9: found = 0: LL = 1 WHILE (found = 0 AND LL < 3) L = 1 WHILE (found = 0 AND L < 13) IF (NOTE < CINT(CRCL(L) * LL) + 2) AND (NOTE > CINT(CRCL(L) * LL) - 2) THEN PRINT notescs$(L) found = 1 ENDIF L = L + 1 WEND LL = LL + 1 WEND IF found = 0 THEN PRINT NOTE SOUND NOTE, 4 NEXT K SOUND CINT(MACL(1)), 8: SOUND 32760, 10 MICL(1) = INT(KYCL(1)) MICL(2) = INT(KYCL(3)) MICL(3) = INT(KYCL(4)) MICL(4) = INT(KYCL(6)) MICL(5) = INT(KYCL(7)) MICL(6) = INT(KYCL(10)) MICL(7) = INT(KYCL(12)) ENDIF IF KY% > 0 AND KY% < 13 THEN GOTO 120 SOUND 110, 8: GOTO 110 120 LOCATE 12, 1 PRINT SPACE$(70): PRINT SPACE$(70) 130 PRINT " Please choose a speed between 1 and 5. " 140 PRINT " 2=fast ... 4=slow (decimals are permitted.) " 150 PRINT SPACE$(70): PRINT SPACE$(70): INPUT " length of notes .. (2-5) =>", D 160 CLS : IF D < 5.1 AND D > 1.99 THEN CLS : GOTO 200 170 SOUND 110, 8: GOTO 120 200 LOCATE 12, 1 210 PRINT SPACE$(70): PRINT SPACE$(70) 220 PRINT " Please choose the number of notes per phrase between 3 and 8. " 240 PRINT " 3=less random ... 8=more random (integers only.) " 250 PRINT SPACE$(70): PRINT SPACE$(70): INPUT " Notes to be used (3-8) =>", MAXN% 260 IF MAXN% < 9 AND MAXN% > 2 THEN GOTO 370 270 SOUND 110, 8: CLS : GOTO 200 370 CLS : LOCATE 12, 1: PRINT SPACE$(70): PRINT SPACE$(70) 374 PRINT " Now please 3 choose note values between 1 and 7 ... " PRINT scales$(KY%) 376 PRINT SPACE$(70): PRINT SPACE$(70): INPUT " First note ........ (1-7) =>", N1% 390 IF N1% <= 7 AND N1% >= 1 THEN GOTO 395 392 SOUND 110, 8: GOTO 376 395 SOUND MACL(N1%), 4: N(1) = MACL(N1%) 410 PRINT SPACE$(70): PRINT SPACE$(70): INPUT " Second note ....... (1-7) =>", N2% 412 IF N2% <= 7 AND N2% >= 1 THEN GOTO 420 414 SOUND 110, 8: GOTO 410 420 SOUND MACL(N2%), 4: N(2) = MACL(N2%) 421 PRINT SPACE$(70): PRINT SPACE$(70): INPUT " Third note ........ (1-7) =>", N3% 422 IF N3% <= 7 AND N3% >= 1 THEN GOTO 426 424 SOUND 110, 8: GOTO 420 426 SOUND MACL(N3%), 4: N(3) = MACL(N3%) 429 CLS : LOCATE 20, 28: PRINT " Hit space bar to end" 430 PRINT " ============================================================ " 431 PRINT SPACE$(70) 432 PRINT "       " 433 PRINT "          " 434 PRINT "       " 435 PRINT "           " 436 PRINT "       " 437 PRINT SPACE$(70) 438 PRINT " ============================================================ " 439 FOR K = 1 TO 10: PRINT SPACE$(70): NEXT K 449 FOR I = 1 TO 3: FOR K = 1 TO 8: N(K) = 0: NEXT K 450 FOR J = 1 TO 3: N(1) = MACL(N1%): N(2) = MACL(N2%): N(3) = MACL(N3%) LOCATE 18, 1: PRINT " " 460 FOR K = 1 TO MAXN%: RAN% = CINT(RND * 6) + 1 IF K < J OR K > J + 2 THEN NOTE = MACL(RAN%) ELSE NOTE = N(K) NOTE = CINT(NOTE) IF K > 1 THEN IF NOTE = N(K - 1) THEN NOTE = NOTE * 2 IF J = 2 AND K > 3 AND K < 7 THEN SOUND NOTE, MAXN% * D ELSE SOUND NOTE, D N(K) = NOTE LOCATE 18, K*8: found = 0: LL = 1 WHILE (found = 0 AND LL < 7) L = 1 WHILE (found = 0 AND L < 13) IF (NOTE < CINT(CRCL(L) * LL) + 2) AND (NOTE > CINT(CRCL(L) * LL) - 2) THEN PRINT notescs$(L) found = 1 ENDIF L = L + 1 WEND LL = LL + 1 WEND IF found = 0 THEN PRINT NOTE NEXT K 532 LOCATE 19, 25: PRINT " " 536 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 560 FOR K = 1 TO MAXN%: NOTE = N(K) * 2 580 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 581 NOTE = N(K) 589 NEXT K 600 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 620 FOR K = 1 TO MAXN%: NOTE = N(K) / 2 640 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 641 NOTE = N(K) 650 NEXT K 660 FOR M1 = 1 TO MAXN%: NOTE = N(MAXN% + 1 - M1) 690 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 700 NEXT M1 710 FOR M1 = 1 TO MAXN%: NOTE = N(M1) 730 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 740 NEXT M1 742 IF I > 3 THEN GOTO 80 745 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 750 FOR M1 = 1 TO MAXN%: NOTE = N(M1) * 2 770 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 780 NEXT M1 782 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 784 FOR M1 = 1 TO MAXN%: NOTE = N(MAXN% + 1 - M1) 820 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 830 NEXT M1 835 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 840 FOR M1 = 1 TO MAXN%: NOTE = N(MAXN% + 1 - M1) 870 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 880 NEXT M1 885 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 890 FOR M1 = 1 TO MAXN%: NOTE = N(M1) 910 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 920 NEXT M1 925 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 930 FOR M1 = 1 TO MAXN%: NOTE = N(MAXN% + 1 - M1) 960 IF NOTE < 15000 AND NOTE > 37 THEN SOUND NOTE, D 970 NEXT M1 972 LOCATE 18, 25: PRINT " " 975 TST$ = INKEY$: IF TST$ = " " THEN GOTO 1020 980 NEXT J: NEXT I 995 SOUND N(1), D * 8 1000 IF RPLY$ = "ns" OR RPLY$ = "NS" THEN GOTO 1120 1020 RPLY$ = "": CLS : SOUND N(1), D * 8 1060 LOCATE 18, 23: INPUT "Go again (Y/N or NS for non-stop) =>", RPLY$ 1072 LOCATE 18, 23: PRINT " " 1076 TIMES = 0 1080 IF RPLY$ = "y" OR RPLY$ = "Y" THEN GOTO 60 1090 IF RPLY$ = "ns" OR RPLY$ = "NS" THEN GOTO 422 1092 IF RPLY$ = "n" OR RPLY$ = "N" THEN GOTO 1100 1094 SOUND 110, 8: GOTO 1060 1100 CLS : PRINT "Thnx for using JSBOX" 1104 FOR K = 1 TO 7: SOUND MACL(K), 4: NEXT K 1109 SOUND MACL(7), 8: GOTO 2000 1120 TIMES = TIMES + 1: LOCATE 15, 35: PRINT TIME$: LOCATE 16, 28 1180 PRINT USING "######### times"; TIMES: GOTO 429 2000 COLOR 7, 0: CLS : SYSTEM