Music Educator I is an interactive music theory tutorial that teaches note reading on the treble (G) clef staff, note types (whole, half, quarter, and eighth notes), and beat values in 4/4 meter. The program uses block graphics characters extensively to render a five-line staff, bar lines, time signatures, and individual note shapes (noteheads, stems, flags, and beams) directly on screen. Three scored quizzes test the student on note names (using the mnemonics “Every Good Boy Does Fine” and “FACE”), note type identification, and beat counting, with a final letter grade computed from the average of the three scores. A separate subroutine at line 2000 handles note rendering, branching on the current note type variable T$ and vertical position variable K to draw the correct notehead style and stem.
Program Analysis
Program Structure
The program is organized as a linear instructional sequence controlled by a main thread and a set of subroutines. The major phases are:
- Title screen and staff introduction (lines 19–41)
- Lines-notes mnemonic (“Every Good Boy Does Fine”) display (lines 51–98)
- Space-notes mnemonic (“FACE”) display (lines 101–131)
- Note name quiz — 9 random notes over 3 rounds, scored out of 100 (lines 189–296)
- Note type demonstration — cycling through E/Q/H/W shapes (lines 299–472)
- Note type quiz — 12 questions, scored out of 100 (lines 501–581)
- Rhythm / beat-value instruction (lines 582–791)
- Beat-value quiz — 8 questions, scored out of 100 (lines 800–893)
- Score summary and letter grade (lines 894–999)
Key subroutines are collected at high line numbers:
| Line(s) | Purpose |
|---|---|
| 1000–1099 | Clear screen to staff background (five ledger lines as solid-block rows) |
| 2000–3999 | Draw a single note at row K, column M, type T$ |
| 5010–5099 | Map position K to note-name string A$ |
| 6000–6999 | Draw staff decoration: bar lines, time signature, instructional text |
| 8001–8099 | Draw the G-clef symbol using block graphics |
| 9000–9010 | SAVE and RUN (utility lines at the end) |
Staff Rendering Technique
The five staff lines are drawn at line 1000 as a single large PRINT AT 0,0 string containing rows of ▄ (lower-half block) characters at every fourth character row, separated by blank rows. Because the ZX81 display is character-mapped at 32 columns × 24 rows, the program treats each display row as a staff position; the vertical index K steps in increments of 4 (one staff space) or 2 (a ledger line). Staff lines fall at rows 2, 6, 10, 14, and 18 when K is mapped back to screen coordinates via PRINT AT K+3,....
Bar lines are added by subroutines 6100/6110 (left bar, using ▌/▙) and 6120/6130 (right bar, using ▐/▟). The G-clef at subroutine 8001 is built from multiple PRINT AT statements each placing a sequence of block-graphic characters that approximate the clef’s curved shape.
Note Drawing Subroutine (Lines 2000–3999)
The note-drawing code branches on two variables: K (odd values 1–17 represent the nine valid note positions on and between the five staff lines) and T$ (one of "E", "Q", "H", "W" for eighth, quarter, half, whole). The logic flow is:
- Whole notes (
T$="W") branch directly to line 2300, bypassing stem/flag drawing. - Notes with
K<=9(lower half of staff) jump to line 2300 for the lower-staff note shape, whileK>9uses the upper-staff path starting at line 2050. - Stem direction and flag (for eighth notes) are drawn with additional
PRINT ATstatements using▙,▌,▐,▛, and▞characters to suggest stems and flags. - Lines 3071–3130 handle the lower-staff note shapes including the flag tail for eighth notes.
Several GOTO targets within subroutine 2000 reference lines that do not exist in the listing (e.g., lines 2000, 2200, 2206, 2208, 2400, 2500), which means those branches fall through to the next present line or exit. This is an intentional technique for conditional execution without explicit RETURN at intermediate points, though it also means some note variants may be rendered incompletely.
Note-Name Mapping (Subroutine 5000)
Subroutine 5010–5099 maps the odd-valued position K to a letter name in A$. The mapping covers K=1,15→F; K=3,17→E; K=5→D; K=7→C; K=9→B; K=11→A; K=13→G. This places middle C and the surrounding notes of the treble clef across the nine positions. Note that K=17 (top ledger line) maps to E and K=1 (bottom ledger line) maps to F, consistent with the range of the treble staff shown.
Quiz Mechanics and Scoring
The note name quiz (lines 189–290) runs 3 rounds of 3 notes each, for 9 total questions. Each correct answer adds 11.12 points, giving a theoretical maximum of approximately 100. The DIM Y(17) array at line 10 is used as a “used” flag to prevent repeating note positions within a round; it is reset implicitly only at the start of each outer loop iteration since Y is never explicitly cleared between rounds, which could reduce variety in later rounds.
The note type quiz (lines 501–550) asks 12 questions worth 8.34 each (~100 total). The beat-value quiz (lines 800–880) asks 8 questions worth 12.5 each (exactly 100 total). All three scores are accumulated in S, S1, and S2 respectively, then averaged at line 902 and converted to a letter grade at lines 919–923 using a standard 60/70/80/90 scale.
Note Type Demonstration Loop (Lines 299–472)
After the note name quiz, the program demonstrates note shapes in a loop that cycles through E→Q→H→W using a chain of IF T$=... THEN GOTO tests at lines 470–472. The entry point at line 299 sets T$="E", and after drawing eight random notes, control falls to the type-check chain. Each type redirects to a block that sets the next type and GOTOs line 400 (which is not explicitly listed; line 403 is the actual first line of the note-drawing loop). This effectively creates a four-phase animation of different note shapes.
Key BASIC Idioms
- The double INKEY$ pattern (
IF INKEY$<>"" THEN GOTO nfollowed byIF INKEY$="" THEN GOTO n+1) at lines 40–41, 97–98, etc., is the standard keypress-wait idiom: the first loop flushes any held key, the second waits for a fresh press. SLOWat line 5 puts the machine in its slower display-refresh mode, ensuring screen output is visible.- Random note positions are generated with
INT(RND*17)+1and then filtered to odd values only (lines 211, 411, 516), since even values represent spaces between staff lines rather than note positions. TABis used extensively inside singlePRINT ATstatements to place multiple block graphic characters in one statement, reducing code length and improving speed.
Bugs and Anomalies
- The
DIM Y(17)array is never reset between the three outer quiz rounds (line 190FOR N=1 TO 3), so by the third round, many positions are already flagged and the inner loop at line 210–213 may spin for a long time seeking an unused slot. - Lines 301–331 set
T$and print a label, then allGOTO 400. Line 400 does not exist; execution continues at line 403. This is harmless but slightly confusing. - Several subroutine 2000 internal
GOTOtargets (2200, 2206, 2208, 2400, 2500) are absent from the listing; control falls through to the next available line in each case, which may cause some note types to render partially or incorrectly. - Lines 3118–3120 contain a conditional
IF K=9 THEN GOTO 3121, but line 3121 is the very next line, making the branch a no-op. - Lines 2201–2209 and 3086–3130 contain partial eighth-note flag code but some
PRINTstatements reference lines that do not appear (e.g., lines 2206, 2207 are absent; line 2209 appears but the preceding branch at 2203 references 2206 which is missing). This suggests the flag rendering is incomplete for some note positions.
Content
Image Gallery
Source Code
1 REM MUSIC EDUCATOR 1
5 SLOW
10 DIM Y(17)
19 PRINT AT 10,7;"MUSIC EDUCATOR 1"
20 PRINT AT 11,7;"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
21 FOR J=1 TO 80
22 NEXT J
28 GOSUB 1000
29 GOSUB 6000
30 PRINT AT 20,1;"THIS PROGRAM TEACHES THE NOTES"
31 PRINT AT 21,1;"ON THE TREBLE OR G CLEF STAFF."
32 GOSUB 8000
33 PRINT AT 11,10;"<--G CLEF"
34 FOR N=1 TO 60
35 NEXT N
36 PRINT AT 19,7;"[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]"
40 IF INKEY$ <>"" THEN GOTO 40
41 IF INKEY$ ="" THEN GOTO 41
51 GOSUB 1000
67 LET K=17
68 LET T$="Q"
69 LET M=0
70 FOR I=1 TO 5
75 GOSUB 2000
80 LET M=M+6
81 LET K=K-4
89 NEXT I
90 PRINT AT 15,2;"E"
91 PRINT AT 11,8;"G"
92 PRINT AT 7,14;"B"
93 PRINT AT 3,20;"D"
94 PRINT AT 4,26;"F"
95 PRINT AT 19,6;"E[V][E][R][Y] G[O][O][D] B[O][Y] D[O][E][S] F[I][N][E]"
96 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
97 IF INKEY$ <>"" THEN GOTO 97
98 IF INKEY$ ="" THEN GOTO 98
101 LET K=15
102 LET M=2
103 GOSUB 1000
105 FOR I=1 TO 4
106 GOSUB 2000
108 LET K=K-4
109 LET M=M+7
110 NEXT I
120 PRINT AT 12,4;"F"
121 PRINT AT 8,11;"A"
122 PRINT AT 4,18;"C"
123 PRINT AT 0,25;"E"
125 PRINT AT 19,0;" NOTES IN SPACES SPELL FACE "
128 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
130 IF INKEY$ <>"" THEN GOTO 130
131 IF INKEY$ ="" THEN GOTO 131
189 LET S=0
190 FOR N=1 TO 3
192 LET M=11
201 GOSUB 1000
203 PRINT AT 0,11;"NOTE TEST"
204 GOSUB 6000
205 GOSUB 8000
207 FOR I=1 TO 3
210 LET K=INT (RND*17)+1
211 IF K=2 OR K=4 OR K=6 OR K=8 OR K=10 OR K=12 OR K=14 OR K=16 THEN GOTO 210
212 IF Y(K)=1 THEN GOTO 210
213 LET Y(K)=1
220 GOSUB 5000
224 PRINT AT 21,18;" "
225 GOSUB 2000
249 PRINT AT 21,0;"WHAT IS THIS NOTE? (A THRU G)"
250 INPUT N$
255 IF N$=A$ THEN GOTO 275
256 PRINT AT 21,18;" [I][N][C][O][R][R][E][C][T] "
258 LET M=M+7
274 GOTO 279
275 PRINT AT 21,18;" CORRECT "
276 PRINT AT K+3,M+2;A$
277 LET S=S+11.12
278 LET M=M+7
279 NEXT I
280 FOR L=1 TO 30
281 NEXT L
290 NEXT N
291 PRINT AT 20,0;" SCORE=";INT S;" "
292 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
295 IF INKEY$ <>"" THEN GOTO 295
296 IF INKEY$ ="" THEN GOTO 296
299 GOSUB 1000
301 LET T$="E"
302 PRINT AT 21,6;" EIGHTH NOTES (E)"
303 GOTO 400
304 LET T$="Q"
305 GOSUB 1000
309 PRINT AT 21,6;"QUARTER NOTES (Q)"
310 GOTO 400
315 GOSUB 1000
325 LET T$="H"
326 PRINT AT 21,6;" HALF NOTES (H) "
327 GOTO 400
328 GOSUB 1000
330 LET T$="W"
331 PRINT AT 21,6;" WHOLE NOTES (W)"
403 LET M=1
406 FOR I=1 TO 8
408 LET K=INT (RND*17)+1
410 IF T$="E" AND K=11 THEN GOTO 408
411 IF K=2 OR K=4 OR K=6 OR K=8 OR K=10 OR K=12 OR K=14 OR K=16 THEN GOTO 408
412 GOSUB 2000
413 IF I=8 THEN GOTO 430
414 LET M=M+8
415 IF M>25 THEN GOTO 417
416 GOTO 430
417 LET M=1
418 FOR L=1 TO 30
419 NEXT L
421 GOSUB 1000
430 NEXT I
450 FOR N=1 TO 30
451 NEXT N
470 IF T$="E" THEN GOTO 304
471 IF T$="Q" THEN GOTO 315
472 IF T$="H" THEN GOTO 328
501 LET M=1
502 LET S1=0
503 GOSUB 1000
504 FOR I=1 TO 12
515 LET K=INT (RND*17)+1
516 IF K=11 OR K=2 OR K=4 OR K=6 OR K=8 OR K=10 OR K=12 OR K=14 OR K=16 THEN GOTO 515
517 IF T$="E" AND K=11 THEN GOTO 515
519 IF K=17 OR K=13 OR K=3 THEN LET T$="H"
520 IF K=1 OR K=7 THEN LET T$="E"
521 IF K=5 OR K=11 THEN LET T$="Q"
522 IF K=9 OR K=15 THEN LET T$="W"
523 PRINT AT 20,11;" "
524 PRINT AT 0,8;"NOTE TYPE TEST"
525 GOSUB 2000
526 PRINT AT 21,0;"ENTER TYPE OF NOTE;(E,Q,H, OR W)"
527 INPUT A$
528 IF A$=T$ THEN GOTO 535
530 PRINT AT 20,11;"[I][N][C][O][R][R][E][C][T] "
534 GOTO 540
535 PRINT AT 20,11;" CORRECT "
536 PRINT AT K+3,M+2;T$
537 LET S1=S1+8.34
540 LET M=M+8
541 IF I=12 THEN GOTO 550
542 IF M>25 THEN GOTO 545
543 GOTO 550
545 LET M=1
546 FOR J=1 TO 30
547 NEXT J
549 GOSUB 1000
550 NEXT I
574 PRINT AT 20,11;" "
575 PRINT AT 20,11;"SCORE=";INT S1
576 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
580 IF INKEY$ <>"" THEN GOTO 580
581 IF INKEY$ ="" THEN GOTO 581
582 LET K=3
585 GOSUB 1000
586 GOSUB 6000
587 GOSUB 6120
590 GOSUB 6135
601 GOSUB 1000
602 LET M=1
603 LET T$="E"
605 PRINT AT 18,0;" EIGHTH NOTES GET 1/2 BEAT EACH."
607 GOSUB 2000
610 LET M=9
612 LET T$="Q"
615 PRINT AT 19,0;"QUARTER NOTES GET ONE BEAT EACH."
617 GOSUB 2000
620 LET M=17
621 LET T$="H"
625 PRINT AT 20,0;" HALF NOTES GET TWO BEATS EACH. "
627 GOSUB 2000
630 LET M=24
631 LET T$="W"
632 LET K=5
635 PRINT AT 21,0;"WHOLE NOTES GET FOUR BEATS EACH."
637 GOSUB 2000
639 PRINT AT 0,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
640 IF INKEY$ <>"" THEN GOTO 640
641 IF INKEY$ ="" THEN GOTO 641
642 GOSUB 1000
643 GOSUB 6000
644 FOR J=1 TO 2
647 LET T$="E"
648 LET K=1
649 PRINT AT 21,0;" EIGHTH NOTES GET ONE/HALF BEAT"
650 FOR M=1 TO 25 STEP 8
651 GOSUB 2000
655 PRINT AT 19,M+2;"1/2"
668 LET K=K+2
669 NEXT M
670 FOR I=1 TO 20
671 NEXT I
675 IF J=2 THEN GOTO 680
676 GOSUB 1000
677 GOSUB 6120
678 NEXT J
698 LET K=3
699 LET T$="Q"
700 GOSUB 1000
701 GOSUB 6000
702 GOSUB 6120
703 PRINT AT 21,0;" QUARTER NOTES GET ONE BEAT"
704 FOR M=1 TO 25 STEP 8
710 GOSUB 2000
711 PRINT AT 19,M+2;"1"
715 NEXT M
720 FOR I=1 TO 40
722 NEXT I
725 LET T$="H"
726 LET M=1
727 LET K=7
730 GOSUB 1000
731 GOSUB 6000
732 GOSUB 6120
735 PRINT AT 21,0;" HALF NOTES GET TWO BEATS"
737 GOSUB 2000
738 PRINT AT 19,M+2;"2"
739 LET M=17
740 GOSUB 2000
741 PRINT AT 19,M+2;"2"
742 FOR I=1 TO 40
743 NEXT I
745 GOSUB 1000
746 GOSUB 6000
747 GOSUB 6120
750 LET T$="W"
751 LET M=1
752 LET K=11
753 PRINT AT 21,0;" WHOLE NOTES GET FOUR BEATS"
755 GOSUB 2000
756 PRINT AT 19,M+2;"4"
760 FOR I=1 TO 40
761 NEXT I
762 CLS
765 PRINT AT 2,12;"SUMMARY"
766 PRINT AT 3,12;"▀▀▀▀▀▀▀"
768 PRINT AT 5,2;"4 BEATS PER BAR IN 4/4 METER"
769 PRINT AT 6,2;"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
770 PRINT AT 8,1;"EIGHTH NOTES GET ONE/HALF BEAT"
772 PRINT AT 10,3;"QUARTER NOTES GET ONE BEAT"
774 PRINT AT 12,4;"HALF NOTES GET TWO BEATS"
776 PRINT AT 14,3;"WHOLE NOTES GET FOUR BEATS"
789 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
790 IF INKEY$ <>"" THEN GOTO 790
791 IF INKEY$ ="" THEN GOTO 791
800 LET S2=0
802 LET K=5
803 LET M=1
804 GOSUB 1000
805 PRINT AT 0,8;"NOTE BEAT TEST"
806 LET T$="Q"
807 FOR I=1 TO 8
809 IF S2>=50 AND S2<62.5 THEN LET T$="W"
811 IF T$="H" THEN GOTO 816
812 IF T$="W" THEN LET T$="H"
813 IF T$="E" THEN LET T$="W"
814 IF T$="Q" THEN LET T$="E"
815 GOTO 817
816 LET T$="Q"
817 GOSUB 2000
818 PRINT AT 20,0;"ENTER THE NUMBER OF BEATS THIS"
820 PRINT AT 21,0;"NOTE GETS: (1/2, 1, 2 OR 4)"
825 INPUT B$
828 IF B$="0.5" THEN LET B$="1/2"
829 IF B$=".5" THEN LET B$="1/2"
830 IF T$="E" AND B$="1/2" THEN GOTO 850
831 IF T$="Q" AND B$="1" THEN GOTO 850
832 IF T$="H" AND B$="2" THEN GOTO 850
833 IF T$="W" AND B$="4" THEN GOTO 850
835 PRINT AT 19,10;"[I][N][C][O][R][R][E][C][T] "
849 GOTO 870
850 PRINT AT 19,10;" CORRECT "
852 PRINT AT K+3,M+2;B$
853 LET S2=S2+12.5
870 LET M=M+8
871 IF I=8 THEN GOTO 880
872 IF M>25 THEN GOTO 875
873 GOTO 880
875 LET M=1
876 FOR J=1 TO 30
877 NEXT J
879 GOSUB 1000
880 NEXT I
887 PRINT AT 19,10;" "
888 PRINT AT 20,0;" "
889 PRINT AT 21,0;" "
890 PRINT AT 20,11;"SCORE=";INT S2
891 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
892 IF INKEY$ <>"" THEN GOTO 892
893 IF INKEY$ ="" THEN GOTO 893
894 CLS
901 PRINT AT 4,7;"SUMMARY OF SCORES"
902 LET A=(INT S+INT S1+INT S2)/3
903 PRINT AT 5,7;"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
905 PRINT AT 7,6;"NOTE NAME TEST...";INT S
906 PRINT AT 9,6;"NOTE TYPE TEST...";INT S1
907 PRINT AT 11,6;"NOTE BEAT TEST...";INT S2
908 PRINT AT 12,6;"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
910 PRINT AT 14,6;"AVERAGE..........";INT A
919 IF A<60 THEN LET G$="F"
920 IF A>=60 THEN LET G$="D"
921 IF A>=70 THEN LET G$="C"
922 IF A>=80 THEN LET G$="B"
923 IF A>=90 THEN LET G$="A"
925 PRINT AT 17,11;"GRADE...";G$
997 PAUSE 10000
998 PRINT AT 21,8;"█[E][N][D]█[O][F]█[P][R][O][G][R][A][M]█"
999 STOP
1000 PRINT AT 0,0;" ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ "
1099 RETURN
2010 IF T$="W" THEN GOTO 2300
2050 IF K<=9 THEN GOTO 2300
2060 IF K=3 OR K=7 OR K=11 OR K=15 THEN GOTO 2070
2065 PRINT AT K-12,M+5;"▙";TAB M+37;"▌";TAB M+69;"▌";TAB M+101;"▌";TAB M+133;"▙";TAB M+165;"▌";TAB M+197;"▌";TAB M+229;"▌"
2066 PRINT AT K-4,M+5;"▙";TAB M+37;"▌";TAB M+69;"▌";TAB M+101;"▌"
2067 GOTO 2190
2070 IF K=15 THEN GOTO 2074
2071 PRINT AT K-12,M+5;"▙";TAB M+37;"▌";TAB M+69;"▌";TAB M+101;"▌";TAB M+133;"▙";TAB M+165;"▌";TAB M+197;"▌";TAB M+229;"▌"
2072 GOTO 2075
2074 PRINT AT K-12,M+5;"▌";TAB M+37;"▌";TAB M+69;"▙";TAB M+101;"▌";TAB M+133;"▌";TAB M+165;"▌";TAB M+197;"▙";TAB M+229;"▌"
2075 PRINT AT K-4,M+5;"▌";TAB M+37;"▌";TAB M+69;"▙";TAB M+101;"▌"
2190 IF T$="E" THEN GOTO 2200
2199 GOTO 2300
2201 PRINT AT K-12,M+5;"▛▖";TAB M+38;"▐"
2203 IF K=3 OR K=7 OR K=11 OR K=15 THEN GOTO 2206
2204 PRINT AT K-10,M+6;"▐"
2205 GOTO 2208
2207 PRINT AT K-10,M+6;"▟"
2209 PRINT AT K-9,M+6;"▞"
2298 IF T$="Q" THEN GOTO 2400
2310 PRINT AT K-1,M+1;"▞▀▀▚"
2315 IF K=3 OR K=7 OR K=11 OR K=15 THEN GOTO 2325
2320 PRINT AT K,M;"▟▄▄▄▄▙";TAB M+32;"▝▖ ▗▘";TAB M+65;"▝▀▀▘"
2324 GOTO 2341
2325 PRINT AT K,M;"▐ ▌";TAB M+32;"▝▖ ▗▘";TAB M+65;"▟██▙"
2398 IF T$="H" THEN GOTO 3000
2399 IF T$="W" THEN GOTO 3999
2410 PRINT AT K-1,M+1;"▟██▙";TAB M+33;"████";TAB M+65;"████"
2435 IF K=3 OR K=7 OR K=11 OR K=15 THEN GOTO 2445
2440 PRINT AT K+2,M+2;"▀▀"
2441 GOTO 2500
2445 PRINT AT K+2,M+1;"▟██▙"
3010 IF K>9 THEN GOTO 3999
3070 IF K=1 OR K=5 OR K=9 THEN GOTO 3095
3071 PRINT AT K+1,M;"▐";TAB M+32;"▟";TAB M+64;"▐";TAB M+96;"▐";TAB M+128;"▐";TAB M+160;"▟";TAB M+192;"▐";TAB M+224;"▐"
3079 PRINT AT K+9,M;"▐";TAB M+32;"▟";TAB M+64;"▐";TAB M+96;"▐";TAB M+128;"▝"
3084 IF T$="E" THEN GOTO 3086
3085 GOTO 3999
3086 PRINT AT K+13,M;"▀"
3087 PRINT AT K+12,M-1;"▚"
3088 PRINT AT K+11,M-1;"▌"
3089 PRINT AT K+10,M-1;"▙"
3090 PRINT AT K+9,M-1;"▞"
3094 GOTO 3999
3095 PRINT AT K+1,M;"▐";TAB M+32;"▐";TAB M+64;"▐";TAB M+96;"▟";TAB M+128;"▐";TAB M+160;"▐";TAB M+192;"▐";TAB M+224;"▟"
3113 PRINT AT K+9,M;"▐";TAB M+32;"▐";TAB M+64;"▐"
3118 IF K=9 THEN GOTO 3121
3121 IF T$="E" THEN GOTO 3125
3122 GOTO 3999
3126 PRINT AT K+11,M-1;"▝▟"
3127 PRINT AT K+10,M-1;"▌"
3128 PRINT AT K+9,M-1;"▌"
3129 PRINT AT K+8,M-1;"▌"
3130 PRINT AT K+7,M-1;"▞"
3999 RETURN
5010 IF K=1 OR K=15 THEN LET A$="F"
5011 IF K=3 OR K=17 THEN LET A$="E"
5012 IF K=7 THEN LET A$="C"
5013 IF K=5 THEN LET A$="D"
5014 IF K=9 THEN LET A$="B"
5015 IF K=11 THEN LET A$="A"
5016 IF K=13 THEN LET A$="G"
5099 RETURN
6100 PRINT AT 2,0;"▌";TAB 32;"▌";TAB 64;"▌";TAB 96;"▙";TAB 128;"▌";TAB 160;"▌";TAB 192;"▌";TAB 224;"▙"
6110 PRINT AT 10,0;"▌";TAB 32;"▌";TAB 64;"▌";TAB 96;"▙";TAB 128;"▌";TAB 160;"▌";TAB 192;"▌";TAB 224;"▙"
6115 RETURN
6120 PRINT AT 2,31;"▐";TAB 63;"▐";TAB 95;"▐";TAB 127;"▟";TAB 159;"▐";TAB 191;"▐";TAB 223;"▐";TAB 255;"▟"
6130 PRINT AT 10,31;"▐";TAB 63;"▐";TAB 95;"▐";TAB 127;"▟";TAB 159;"▐";TAB 191;"▐";TAB 223;"▐";TAB 255;"▟"
6131 RETURN
6135 PRINT AT 4,1;"<--BAR LINE";TAB 20;"BAR LINE-->"
6140 PRINT AT 11,9;"THIS IS A BAR"
6145 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
6150 IF INKEY$ <>"" THEN GOTO 6150
6151 IF INKEY$ ="" THEN GOTO 6151
6155 PRINT AT 4,1;" "
6200 PRINT AT 3,5;"<--TIME SIGNATURE"
6250 PRINT AT 19,0;"THE FOLLOWING INSTRUCTION IS FOR"
6260 PRINT AT 20,0;"MUSIC WRITTEN IN 4/4 METER."
6300 PRINT AT 2,4;"▄";TAB 35;"▞▐";TAB 66;"▞ ▐";TAB 97;"▟▄▄▟▄";TAB 129;"▝▀▀▜▀";TAB 164;"▐";TAB 196;"▐"
6400 PRINT AT 10,4;"▄";TAB 35;"▞▐";TAB 66;"▞ ▐";TAB 97;"▟▄▄▟▄";TAB 129;"▝▀▀▜▀";TAB 164;"▐";TAB 196;"▐"
6500 PRINT AT 7,7;"FOUR BEATS PER BAR"
6600 PRINT AT 15,5;"QUARTER NOTE GETS ONE BEAT"
6800 PRINT AT 21,0;"███[P][R][E][S][S]█[A][N][Y]█[K][E][Y]█[T][O]█[C][O][N][T][I][N][U][E]████"
6980 IF INKEY$ <>"" THEN GOTO 6980
6981 IF INKEY$ ="" THEN GOTO 6981
6999 RETURN
8001 PRINT AT 0,6;"▙";TAB 38;"▙▙";TAB 70;"▌ ▚";TAB 102;"▌ ▌";TAB 134;"▌ ▞";TAB 166;"▙▟";TAB 198;"▛";TAB 229;"▞▌"
8002 PRINT AT 8,4;"▞ ▌";TAB 35;"▟▄▄▙";TAB 66;"▞ ▞▀▛▀▚";TAB 97;"▗▘▐ ▌ ▚";TAB 129;"▐ ▐ ▌ ▝▖";TAB 161;"▟▄▄▙▄▙▄▄▄▙";TAB 194;"▌ ▌ ▗▘";TAB 226;"▝▖ ▌ ▞"
8003 PRINT AT 16,3;"▝▖ ▌ ▞";TAB 36;"▟███";TAB 70;"▌";TAB 101;"▝▘"
8099 RETURN
9000 SAVE "MUSI[C]"
9010 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.