10ON ERROR IFERR=17 GOTO30 ELSE MODE7:REPORT:PRINT:END 20PROCintropage: REM NotBeeb 30MODE 6:CLEAR: PROCWhatAmIOn: MODE M% 40VDU5:IF M%<>4 VDU19,1,6;0;19,2,5;0; 50VDU19,3,7;0;: REM NotBeeb - The Matrix Brandy and BBCSDL modes are 16 colour modes. 60PROCinitMain 70IF BBCSDL% THEN VDU19,1,16,0,255,255,19,2,16,255,0,255,19,3,16,255,255,255,23,23,2;0;0;0;: REM NotBeeb 80GCOL0,1 90MOVE 332,956:PROCplotFilledNoteHead:MOVE 332,940:DRAW 332,836 100PROCDoubleHeightProportionalPrint("The Note Quiz",420,916) 110MOVE 780,868:PROCplotFilledNoteHead:MOVE 830,848:DRAW 830,955 120GCOL0,3 130IF R% GOTO 170: REM NotBeeb - offloaded to Intro for 8-bit systems 140FOR Q%=1 TO 5: REM NotBeeb 150F%=OPENUP("nq"+STR$Q%+"trk"):IF F%=0 PROCwt ELSECLOSE#F%: REM NotBeeb 160NEXT: REM NotBeeb 170PROCProportionalPrint("This program aims to help the player learn the",0,800) 180PROCProportionalPrint("notes on the musical stave. Each quiz has 10",0,760) 190PROCProportionalPrint("levels, and 20 questions at each level. A level is",0,720) 200PROCProportionalPrint("locked out once the player has achieved 20/20",0,680) 210PROCProportionalPrint("three times at that level and quiz, progressing",0,640) 220PROCProportionalPrint("the player to a harder level.",0,600) 230IF NOT R% PROCProportionalPrint("A plaintext report is also created, timestamped",0,540) 240IF NOT R% PROCProportionalPrint("on a BBC Master or later machine.",0,500) 250IF R% AND BBCSDL% PROCProportionalPrint("Web browser detected - no state will be saved.",0,540): GOTO 270: REM NotBeeb 260IF R% PROCProportionalPrint("Tape/ROM - no state will be saved.",0,540) 270GCOL0,1 280PROCProportionalPrint("Please choose a quiz:",32,440) 290PROCProportionalPrint("Clefs: 1: Treble",32,360) 300PROCProportionalPrint("2: Alto",188,320) 310PROCProportionalPrint("3: Tenor",188,280) 320PROCProportionalPrint("4: Bass",188,240) 330PROCProportionalPrint("5: Note Lengths",32,200) 340PROCProportionalPrint("0: Exit",32,140) 350PROCgcol2 360PROCProportionalPrint("(C)2025 Eridani Star System. If you find this useful",0,60) 370PROCProportionalPrint("please consider a donation to soruk@eridani.co.uk",0,28) 380IF BBCSDL% THEN IF (@platform% AND 7)>2 THEN OSCLI"osk on": REM NotBeeb 390Q%=INKEY(100)-48 400IF BBCSDL% THEN IF (@platform% AND 7)>2 THEN OSCLI"osk on": REM NotBeeb 410IF Q% > 0 AND Q% < 5 GOTO 480 420IF Q% = 5 GOTO 710 430IF Q% = 0 CLS:QUIT: REM NotBeeb 440IF Q% = 0 MODE 7:END 450GOTO390 460REM =========================================================== 470REM This next section covers options 1-4 - identify the note name 480MODE M% 490PROCinitQuiz 500PROCaskLevel 510IF lvl% = 0 GOTO 30 520PRINT"Sound (Y/N)?";:REPEAT V%=(GET AND &DF):UNTIL V%=78 OR V%=89:V%=5*(V%=89) 530FOR E% = 1 TO 20 540PROCdrawPage 550IF Matrix64% OR BBCSDL64% THEN T%=(g%%?(N%+FNsndoffset))-48:GOTO 570:REM NotBeeb 560T%=(G%?(N%+FNsndoffset))-48 570IF BBCSDL% T%=T%+48: REM NotBeeb 580IF T%<0 T%=T%+48 590SOUND 1,V%,T%,5 600SOUND 1,0,T%,5: REM NotBeeb 610PRINT"What's this note? "; 620IF BBCSDL% THEN IF (@platform% AND 7)>2 THEN OSCLI"osk on": REM NotBeeb 630K%=FNk AND -33: IF K% > 0 AND (K%<65 OR K%>71) GOTO 630 640PROCcheckResult(FNnote=CHR$K%, FNnote) 650NEXT 660PROCshowAndSaveResults 670IF (GET AND &DF) = 81 GOTO 30 680GOTO 500 690REM =========================================================== 700REM This next section covers option 5 - what type of note is it 710MODE M%: REM Note Lengths Quiz target 720PROCinitQuiz 730PROCaskLevel 740IF lvl% = 0 GOTO 30 750FOR E% = 1 TO 20 760PROCdrawPage 770PRINT"What's this note/rest type? "'" 1=Quaver 2=Crotchet"'" 3=Minim 4=Semibreve" 780IF BBCSDL% THEN IF (@platform% AND 7)>2 THEN OSCLI"osk on": REM NotBeeb 790K%=FNk: IF K% > 0 AND (K%<49 OR K%>52) GOTO 790 800PRINT"You chose ";FNtype2(K%-49) 810PROCcheckResult((K%-49)=L%,FNtype) 820NEXT 830PROCshowAndSaveResults 840IF (GET AND &DF) = 81 GOTO 30 850GOTO 730 860REM =========================================================== 870REM Procedures follow, in a rather haphazard order 880DEFPROCcheckResult(test,answer$) 890IF test score%=score%+1: PROCcolour(2):PRINT answer$;" is correct!" :GOTO930 900PROCcolour(1): PRINT"Sorry, it was "; 910IF Q%=5 PRINT"a "; 920PRINT answer$: IFINKEY300 930PROCcolour(3):IFINKEY200 940ENDPROC 950REM =========================================================== 960DEFPROCdrawPage 970CLS: PRINT"Score: ";score%'"Question ";E%' 980IF Q%=5 P%=22 ELSE P%=19 990REPEAT N%=RND(P%)-1: UNTIL N% MOD 7 <> U% 1000U% = N% MOD 7: L%=RND(4)-1 1010PROCdrawStave 1020IF N%>18 PROCdrawRest ELSE PROCdrawNote 1030ENDPROC 1040REM =========================================================== 1050DEFPROCshowAndSaveResults 1060CLS: PRINT"You scored ";score%;" out of 20" 1070IF score% < 20 PROCcolour(1): PRINT'"You got ";20-score%;" wrong. Try again!" ELSE PROCcolour(2): PRINT'"Well done, are you sure that wasn't a fluke? Try again and prove it!": lvltally%(lvl%)=lvltally%(lvl%)+1 1080IF R% GOTO 1140 1090F%=OPENUP("nqscors"): IF F%=0 F%=OPENOUT("nqscors") 1100PTR#F%=EXT#F% 1110PROCbputs(FNtime+"Scored "+STR$(score%)+" out of 20 at "+FNclef+" level "+STR$(lvl%)+CHR$13+CHR$10) 1120CLOSE#F% 1130PROCwt 1140VDU23,1,0;0;0;0; 1150PROCcolour(3): PRINT'"Press Q to exit, or"'"any other key to play again" 1160ENDPROC 1170REM =========================================================== 1180DEFPROCaskLevel 1190score%=0: U%=9:PROCdrawStave 1200CLS: PRINT"Levels: ";: FOR E% = 1 TO 10: PROCprintlevel: NEXT 1210PROCcolour(3): PRINT'"Pick a "; 1220IF M%<>4 PRINT "green "; 1230INPUT"level >"lvl%: IF lvl% < 0 OR lvl% > 10 GOTO 1190 1240IF lvltally%(lvl%) > 2 GOTO 1190 1250ENDPROC 1260REM =========================================================== 1270DEFPROCnotedef: REM NotBeeb - Offloaded to Intro on 8-bit. 1280VDU23,224;15,&7F3F;-129;-1;23,225,&F080;&F8F8;&F8F8;&F0F0;23,-30;127,8;0;0;23,227,&80E0;0;0;0;23,228;&380F;&4060;&80C0;&80,23,229,&F080;&818;&1808;&3010;23,230,&7FC0;8;0;0;23,231,0;0;-1;-1;23,232,0;0;&F0F0;&F0F0;: REM NotBeeb 1290VDU23,254,&55AA;&55AA;&55AA;&55AA;: REM NotBeeb 1300ENDPROC: REM NotBeeb 1310REM =========================================================== 1320DEFPROCinitQuiz:IF Q%=1 Q%=2 ELSE IF Q%=2 Q%=3 ELSE IF Q%=3 Q%=1 1330IF M%<>4 VDU19,2,2;0; 1340VDU19,3,7;0;: REM NotBeeb 1350IF BBCSDL% THEN VDU19,1,16,255,0,0,19,2,16,0,255,0,19,3,16,255,255,255:COLOUR 3:GCOL0,3: REM NotBeeb 1360VDU5:IF Q%=5 s$="Note Lengths" ELSE s$=FNclef+" Clef" 1365PROCDoubleHeightProportionalPrint("The Note Quiz: "+s$, 280,956) 1370PROCwindowDefs 1380PROCnotedef: REM NotBeeb 1390GCOL0,131:GCOL0,0 1400PROCrt 1410ENDPROC 1420REM =========================================================== 1430DEFPROCdrawStave 1440CLG 1450FOR P% = 600 TO 760 STEP 40: MOVE 0,P%: DRAW 1279,P%: NEXT:P%=Q% 1460IF Q%=5 Q%=RND(4) 1470ON Q% GOSUB 1590, 1510, 1590, 1680: REM tenor, treble, alto and bass clefs - BASIC 2 doesn't support ON PROC. 1480Q%=P%:ENDPROC 1490REM =========================================================== 1500REM GOSUB to treble clef 1510MOVE94,642:DRAW94,658:DRAW103,673:DRAW124,683:DRAW145,682:DRAW163,671 1520DRAW174,653:DRAW174,631:DRAW162,613:DRAW141,601:DRAW116,600:DRAW91,606 1530DRAW74,617:DRAW66,633:DRAW64,657:DRAW76,683:DRAW145,752:DRAW153,771 1540DRAW154,791:DRAW150,813:DRAW140,828:DRAW131,832:DRAW123,829:DRAW117,809 1550DRAW117,733:DRAW123,665:DRAW140,565:DRAW136,543:DRAW117,528:DRAW96,530 1560DRAW84,541:DRAW84,558:DRAW91,567 1570RETURN 1580REM GOSUB to alto clef and tenor clef 1590IF Q%=1 VDU29,0;40; 1600MOVE88,600:DRAW88,760:MOVE92,600:DRAW92,760:MOVE104,600:DRAW104,760 1610MOVE104,680:DRAW120,712:DRAW128,696:DRAW132,692:DRAW140,692:DRAW160,708 1620DRAW160,732:DRAW140,756:DRAW128,756:DRAW120,748:DRAW124,744 1630MOVE104,680:DRAW120,648:DRAW128,664:DRAW132,668:DRAW140,668:DRAW160,652 1640DRAW160,628:DRAW140,604:DRAW128,604:DRAW120,612:DRAW124,616 1650VDU29,0;0; 1660RETURN 1670REM GOSUB to bass clef 1680MOVE100,708:DRAW88,720 1690DRAW96,740:DRAW114, 750:DRAW130,756:DRAW146,752:DRAW162,740:DRAW174,720 1700DRAW166,700:DRAW100,600 1710MOVE188,736:DRAW188,744:MOVE184,740:DRAW192,740 1720MOVE188,696:DRAW188,704:MOVE184,700:DRAW192,700 1730RETURN 1740REM =========================================================== 1750DEFPROCdrawNote:REM Note length in L% - Quaver is 0, Semibreve is 3 1760Z%=(20*N%)+500 1770MOVE 376,Z%+20: VDU5 1780IF L%<2 PROCplotFilledNoteHead ELSE PROCplotOpenNoteHead 1790IF L%=3 GOTO 1840: REM Semibreve - skip drawing the stem 1800IF N%>9 MOVE 374,Z%: DRAW 374,Z%-140 ELSE MOVE 426,Z%: DRAW 426,Z%+140 1810IF L%>0 GOTO 1840: REM Not a quaver, skip the tail 1820IF N%>9 MOVE 374,Z%-136: DRAW 414,Z%-100:DRAW 414,Z%-64:DRAW 394,Z%-36 ELSE MOVE 426,Z%+136: DRAW 458,Z%+100:DRAW 458,Z%+64:DRAW 446,Z%+32 1830REM Leger lines: 1840IF N% < 4 FOR P% = 560 TO Z% STEP -40: MOVE 360,P%: DRAW 440,P%: NEXT 1850IF N% > 14 FOR P% = 800 TO Z% STEP 40: MOVE 360,P%: DRAW 440,P%: NEXT 1860VDU4:ENDPROC 1870REM =========================================================== 1880DEFPROCdrawRest: REM Note length as per PROCdrawNote 1890VDU5 1900IF L%=0 PROCquaverRest 1910IF L%=1 PROCcrotchetRest 1920IF L%=2 MOVE 376,712:VDU&E8E7; 1930IF L%=3 MOVE 376,732:VDU&E8E7; 1940VDU4:ENDPROC 1950REM =========================================================== 1960DEFPROCplotFilledNoteHead:VDU&E1E0;10,8,8,&E3E2;:ENDPROC 1970REM =========================================================== 1980DEFPROCplotOpenNoteHead:VDU&E5E4;10,8,8,&E3E6;:ENDPROC 1990REM =========================================================== 2000DEFPROCquaverRest 2010MOVE 376,704:DRAW 384,696:DRAW 392,696:DRAW 400,704:DRAW 380,658 2020VDU4:ENDPROC 2030REM =========================================================== 2040DEFPROCcrotchetRest 2050MOVE 376,744:DRAW 408,720:DRAW 376,680:DRAW 408,648:DRAW 384,658:DRAW 376,658:DRAW 376,644:DRAW 384,624:DRAW 396,620 2060VDU4:ENDPROC 2070DEFPROCrt: IF R% ENDPROC 2080F%=OPENUP("nq"+STR$Q%+"trk"): IF F%=0 ENDPROC 2090FOR P% = 1 TO 9: INPUT#F%,lvltally%(P%):NEXT 2100CLOSE#F% 2110ENDPROC 2120REM =========================================================== 2130DEFPROCwt 2140F%=OPENOUT("nq"+STR$Q%+"trk"): FOR P% = 1 TO 9: PRINT#F%,lvltally%(P%): NEXT: CLOSE#F%: ENDPROC 2150REM =========================================================== 2160DEFPROCbputs(t$) 2170FOR P% = 1 TO LEN(t$):BPUT#F%,ASCMID$(t$,P%,1): NEXT 2180ENDPROC 2190REM =========================================================== 2200DEFPROCWhatAmIOn 2210MatrixBrandy%=FALSE: BBCSDL%=FALSE: BBCSDL64%=FALSE: Matrix64%=FALSE: RiscOS%=FALSE: REM NotBeeb 2220R%=FALSE: B%=TRUE: M%=1:IF (HIMEM < &8000 AND HIMEM-TOP<&31E8) OR INKEY(-256)=1 M%=4 2230IF INKEY-256=&4D MatrixBrandy%=TRUE: SYS"Brandy_Platform" TO ,,Matrix64%: M%=52: REM NotBeeb - Matrix Brandy 2240IF (INKEY-256 AND &F0)=&A0 RiscOS%=TRUE: REM NotBeeb - RISC OS 2250IF (INKEY-256 AND &DB)=&53 BBCSDL%=TRUE: M%=19: IF @platform% AND &40 THEN BBCSDL64%=TRUE: REM NotBeeb - BBCSDL 2260IF BBCSDL% THEN IF (@platform% AND &3F)=5 THEN R%=TRUE: REM NotBeeb - WASM so run readonly 2270IF Matrix64% OR BBCSDL64% THEN DIM h%% 256: g%%=h%%+128:FOR C%=32TO126:h%%?C%=4*FNleftside:g%%?C%=4*FNrightside:NEXT:FOR W%=0TO30:g%%?W%=48+FNsnd(W%):NEXT:GOTO2290: REM NotBeeb 2280DIM H% 256: G%=H%+128:FOR C%=32TO126:H%?C%=4*FNleftside:G%?C%=4*FNrightside:NEXT:FOR W%=0TO30:G%?W%=48+FNsnd(W%):NEXT: REM NotBeeb 2290IF MatrixBrandy% OR BBCSDL% OR RiscOS% THEN ENDPROC: REM NotBeeb - next code is Acorn 8-bit only 2300A%=0:Y%=0:IF (USR&FFDA AND &FF) < 4 R%=TRUE: REM Tape or ROMFS - Run in readonly mode 2310ENDPROC 2320REM =========================================================== 2330DEFPROCinitMain 2340G%=H%+128 2350IF Matrix64% B%=FALSE: DIM oswd%% 8: REM NotBeeb 2360IF BBCSDL64% B%=FALSE: WAIT 10: SYS @fn%(19) TO font%%: REM NotBeeb 2370DIM lvltally%(10) 2380PROCnotedef: REM NotBeeb 2400ENDPROC 2410REM =========================================================== 2420DEFFNrdoswd 2430IF Matrix64% OR BBCSDL64% THEN =oswd%%?W%: REM NotBeeb 2440=H%?W% 2450REM =========================================================== 2460DEFPROCProportionalPrint(t$,I%,J%) 2470Z%=0: IF LENt$>51 MOVE I%-4,J% ELSE MOVE I%+16,J% 2480IF Matrix64% OR BBCSDL64% THEN FOR P% = 1 TO LEN(t$): C%=ASCMID$(t$,P%,1): PLOT0,(h%%?C%)-28-Z%,0: VDUC%:Z%=g%%?C%: NEXT:GOTO2500:REM NotBeeb 2490FOR P% = 1 TO LEN(t$): C%=ASCMID$(t$,P%,1): PLOT0,(H%?C%)-28-Z%,0: VDUC%:Z%=G%?C%: NEXT 2500ENDPROC 2510REM =========================================================== 2520DEFPROCDoubleHeightProportionalPrint(t$,I%,J%) 2530MOVE I%-4,J%: Z%=0 2540FOR D% = 1 TO LEN(t$): C%=ASCMID$(t$,D%,1) 2550IF Matrix64% ?oswd%%=C%: REM NotBeeb 2560IF B% THEN ?H%=C% 2570IF RiscOS% SYS"OS_Word",10,H%: GOTO 2610: REM NotBeeb 2580IF Matrix64% SYS"OS_Word",10,oswd%%: GOTO 2610: REM NotBeeb 2590IF BBCSDL64% oswd%%=(font%% + (8 * C%) -1): GOTO 2610: REM NotBeeb 2600A%=10: X%=H%: Y%=H% DIV 256: CALL &FFF1 2610VDU23,240:FOR W%=1 TO 4:VDUFNrdoswd,FNrdoswd:NEXT 2620VDU23,241:FOR W%=5 TO 8:VDUFNrdoswd,FNrdoswd:NEXT 2630IF Matrix64% OR BBCSDL64% THEN PLOT0,(h%%?C%)-28-Z%,0:VDU&AF0;8,&BF1;:Z%=g%%?C%: GOTO 2650:REM NotBeeb 2640PLOT0,(H%?C%)-28-Z%,0:VDU&AF0;8,&BF1;:Z%=G%?C% 2650NEXT 2660ENDPROC 2670REM =========================================================== 2680DEFFNsnd(P%)=VALMID$("-48-44-36-28-24-16-08000004012020024032040048052060068072080088096100108116120128136144148156",1+3*P%,3):REM NotBeeb - Offloaded to Intro on 8-bit. 2690REM =========================================================== 2700DEFFNsndoffset=VALMID$("04120600",(2*Q%)-1,2) 2710REM =========================================================== 2720DEFFNclef=MID$("TenorTrebleAltoBassLengths",VALMID$("0106121620",Q%*2-1,2),VALMID$("56447",Q%,1)) 2730REM =========================================================== 2740DEFFNtype=FNtype2(L%) 2750DEFFNtype2(P%)=MID$("QuaverCrotchetMinimSemibreve",VALMID$("01071520",P%*2+1,2),VALMID$("6859",P%+1,1)) 2760REM =========================================================== 2770DEFFNnote=MID$("FGABCDEFGA",Q%+U%,1) 2780REM =========================================================== 2790DEFFNleftside=VALMID$("4577777666776757777777777756776"+STRING$(30,"7")+"6777777777776776"+STRING$(15,"7")+"567",C%-31,1):REM NotBeeb - Offloaded to Intro on 8-bit. 2800REM =========================================================== 2810DEFFNrightside=VALMID$("13200102221131311111111111332"+STRING$(30,"1")+"211101111112112312011101121101112310",C%-31,1):REM NotBeeb - Offloaded to Intro on 8-bit. 2820REM =========================================================== 2830DEFFNtime 2840IF MatrixBrandy% OR BBCSDL% THEN =TIME$+": ": REM NotBeeb 2850A%=14: X%=H%: Y%=H% DIV 256: !H%=0: CALL &FFF1: IF ?H% = 0 ="" ELSE =$H%+": " 2860REM =========================================================== 2870DEFPROCgcol2:P%=2 2880IF M%=4 P%=1 2890GCOL 0,P%:ENDPROC 2900REM =========================================================== 2910DEFPROCcolour(P%): IF M%<>4 COLOUR P%:ENDPROC 2920IF P%=1 COLOUR 0:COLOUR129 ELSE COLOUR1:COLOUR128 2930ENDPROC 2940REM =========================================================== 2950DEFPROCprintlevel 2960IF M%=4 AND lvltally%(E%) > 2 VDU254,32:ENDPROC 2970IF lvltally%(E%) > 2 PROCcolour(1) ELSE PROCcolour(2) 2980PRINTSTR$E%;" "; 2990ENDPROC 3000REM =========================================================== 3010DEFPROCwindowDefs 3020VDU4,28;31,39,20,24,0;448;1279;891; 3030IF MatrixBrandy% OR BBCSDL% VDU28;29,39,17: REM NotBeeb 3050ENDPROC 3060REM =========================================================== 3070DEFFNk=INKEY(1100-(100*lvl%)) 3080REM =========================================================== 3100DEFPROCintropage: REM NotBeeb 3110MODE 7: REM NotBeeb 3120IF INKEY-256=&4D OSCLI"Fullscreen 1": MOUSE OFF: REM NotBeeb 3130VDU 23;8202;0;0;0;:PRINT: REM NotBeeb 3140VDU 141,134:PRINT " ERIDANI STAR SYSTEM presents": REM NotBeeb 3150VDU 141,134:PRINT " ERIDANI STAR SYSTEM presents"': REM NotBeeb 3160VDU&97:PRINT " _p": REM NotBeeb 3170VDU&97:PRINT" h!*4": REM NotBeeb 3180VDU&97:PRINT" j 5": REM NotBeeb 3190VDU&97:PRINT" j z! j": REM NotBeeb 3200VDU&97:PRINT"````k'";STRING$(9,"`");"k";STRING$(22,"`"): REM NotBeeb 3210VDU&97:PRINT",,,|o";STRING$(10,",");"n";STRING$(22,","): REM NotBeeb 3220VDU&97:PRINT"pp~x{sy";STRING$(8,"p");"z";STRING$(22,"p"): REM NotBeeb 3230VDU&97:PRINT" j jj 5 (";CHR$ 255;"?": REM NotBeeb 3240VDU&97:PRINT"``osk`{";STRING$(31,"`"): REM NotBeeb 3250VDU&97:PRINT",,,.o/-";STRING$(31,","): REM NotBeeb 3260VDU&97:PRINT" j": REM NotBeeb 3270VDU&97:PRINT" +,!"': REM NotBeeb 3280VDU&8D,&83:PRINT SPC(12);"THE NOTE QUIZ": REM NotBeeb 3290VDU&8D,&83:PRINT SPC(12);"THE NOTE QUIZ"': REM NotBeeb 3300VDU&85:PRINT"for BBC B, Electron, Master, Compact,": REM NotBeeb 3310VDU&85:PRINT"Archimedes/RISC OS, and on modern kit": REM NotBeeb 3320VDU&85:PRINT"with Matrix Brandy and BBCSDL.": REM NotBeeb 3330IF INKEY(300): REM NotBeeb 3340IF INKEY(300): REM NotBeeb 3350ENDPROC: REM NotBeeb