Musician Royal is a comprehensive music transcription and performance program that allows users to enter, edit, and play single-voice musical compositions using standard note names (A–G), octave numbers, and accidentals. Notes are stored in a two-dimensional array `S(2,1512)`, with pitch values computed using a formula that converts note letter, octave, and sharp/flat status into semitone offsets for the BEEP command. The program supports key signatures of up to 7 sharps or flats, automatically applying accidentals based on the key, and allows up to 9 tempo changes within a composition. An on-screen staff display is rendered using user-defined graphics (loaded via DATA statements into UDG slots 65–79) along with PLOT and DRAW commands to draw staff lines. Compositions can be saved either as raw array data (“MELODY”) or as a self-contained BASIC program (“MUSIC”) with embedded DATA statements, and the editor supports note insertion, deletion, and duplication.
Program Analysis
Program Structure
The program is organized into distinct functional regions identifiable by line number ranges:
- Lines 1–20: Initialization, UDG loading, array allocation, and splash screen.
- Lines 21–79: Input mode — key signature selection, note entry loop, and automatic accidental application.
- Lines 80–210: Pitch encoding and duration input; note data written into array
S(). - Lines 236–430: Playback engine, tempo sequencing, data export via LPRINT.
- Lines 500–700: Introductory text, UDG definition routines (deleted after use).
- Lines 900–1430: Edit mode — change, insert, and delete notes; tempo editing.
- Lines 1450–1611: Duplication mode.
- Lines 4000–4100: Shared UI subroutines for edit/insert/delete prompts.
- Lines 5000–5040: Error/warning display subroutines.
- Lines 6000–6040: Name-entry and caps-lock warning subroutines.
- Lines 7000–7620: Staff display renderer using UDGs, PLOT, DRAW, and clef selection.
- Lines 8000–8120: Play mode entry, save routines (array data and full BASIC program).
- Lines 9000–9999: Utility subroutines (BEEP cue, playback display, tonality change, quit).
Data Storage
All note data is held in the two-dimensional array S(2,1512) declared at line 19. Row 1 stores note durations (as a fraction of a whole note), and row 2 stores the semitone pitch value for BEEP, or 99 as a sentinel value for rests. The array also doubles as save metadata: indices 1500–1512 are used at line 8080 to pack tempo waypoints (W()) and tempo durations (T()) before saving.
Tempo section boundaries are tracked in W(11) (note-number waypoints) and T(10) (whole-note durations in seconds). Up to 9 tempo changes (QQ sections) are supported; a tenth triggers the error at line 5040.
Pitch Encoding Formula
At line 180, the semitone value stored in S(2,J) is computed as:
S(2,J) = -51 + C*2 + 12*D - (1 AND C>1) - (1 AND C>4) + (1 AND V$(3)="S")
where C = CODE V$(1) - 65 (0=A … 6=G) and D = VAL V$(2) - 1 (octave minus 1). The constants subtract 1 for note letters beyond B (index 1) and beyond E (index 4) to account for the missing semitones in the diatonic scale (B–C and E–F), effectively mapping letter+octave to a chromatic semitone offset compatible with BEEP’s pitch argument. A sharp adds 1.
Key Signature and Accidental Application
Lines 73–79 implement automatic accidental inference from the key signature. The variable NM holds the number of sharps or flats (0–7) and S$ holds “S” or “F”. For each count of sharps or flats, the program applies the correct accidental to the appropriate scale degrees using Spectrum BASIC’s string Boolean idiom (e.g., ("S" AND condition) evaluates to “S” or ” ” based on the truth of the condition).
Flat conversion (lines 90–110) lowers a flatted note by stepping its letter down one ASCII value and adjusting the octave for A-flat. Sharp correction (line 120) handles B-sharp and E-sharp by raising them to C and F respectively. Line 121 defaults any unset accidental field to “N” (natural).
Self-Deleting Initialization Code
The program makes heavy use of DELETE to remove code that is no longer needed, freeing memory and preventing re-execution. The UDG loader (lines 610–700) is deleted at line 3 after running. The initialization lines 19–20 delete themselves. The intro/description block (lines 500–604) is deleted at line 710. When entering Play Mode at line 8040, a large swath of lines 10–8040 is deleted to reclaim memory for playback. The quit routine at line 9799 deletes itself and nearly all remaining code.
User-Defined Graphics and Staff Rendering
Lines 610–700 load 15 UDG characters (slots A–O, ASCII 65–79) with bitmap data from DATA statements. These are used in lines 7510–7620 to render note head and clef symbols on the staff display. Staff lines themselves are drawn with PLOT/DRAW commands in the loop at lines 7570–7592, with conditional ledger lines for high (V$(3)="H") and low (V$(3)="L") clef positions. The display supports treble clef (TC), treble clef high (TCH), treble clef low (TCL), bass clef (BC), bass clef high (BCH), and bass clef low (BCL) modes.
Playback Engine
Playback is handled in the loop at lines 340–370. For each note from A to B, the current tempo section is determined by comparing K against W(I+1). The BEEP duration is calculated as T/S(1,K), converting the whole-note duration T(I) (in seconds) and the note’s fractional value. A rest (sentinel value 99 in S(2,K)) triggers a PAUSE instead of BEEP. The variable TON allows transposition by adding a semitone offset to every pitch at play time (line 360 and configured at lines 9990–9999).
Save Mechanisms
Two save options are provided. Line 8090 uses SAVE "MELODY" DATA S() to store the raw note array, which can be reloaded into the program. Line 8120 uses SAVE "MUSIC" LINE 9100 to save the entire BASIC program with an auto-run entry point at line 9100, which acts as a standalone playback loader — it checks available memory and returns to line 1 if insufficient. A separate LPRINT path (lines 406–430) exports the composition as BASIC DATA statements, suitable for embedding in another program.
Input Validation and Error Handling
The program uses ON ERR GO TO extensively as a self-referencing trap (e.g., ON ERR GO TO 40 at line 40) to prevent crashes during INPUT statements. Numeric range checks are performed by inspecting CODE of the first character of a stringified number (e.g., CODE L$<46 OR CODE L$>57 to reject non-numeric input). The subroutine at line 5000 displays a flashing “WRONG NUMBER” message with a BEEP, while line 5010 emits only the error BEEP.
Notable Idioms and Techniques
PAUSE 0followed byINKEY$is used throughout as a keypress wait idiom (e.g., lines 23, 246, 930).- Computed
GO TOat lines 400, 1010, and 8070 uses arithmetic on string comparisons to select branch targets, e.g.,GO TO (900 AND I$="0")+(300 AND I$="1")+.... - String Boolean expressions (e.g.,
("S" AND S$="S" AND V$(1)="F")) are used at lines 73–79 to assign accidentals conditionally without IF statements. VAL "number"inGO SUB VAL "9000"is not present here, butVAL M$and similar patterns appear for compact numeric conversion.- The variable
QJtracks the high-water mark of entered notes to correctly manage editing offsets and deletions.
Potential Anomalies
- Line 7600: The condition
V$(3)<>"H" OR V$(3)<>"L"is always true (a value cannot simultaneously equal both “H” and “L”), so the ledger lines it draws are always rendered regardless of clef mode. This is likely a logic error; the intended condition was probablyAND. - Line 7590: Contains a bare
PLOT 8,0with no coordinates after a semicolon, likely a typo — the statementPLOT 8,0would plot at (8,0) rather than drawing the intended ledger line. - Line 1255: Branches to line 238 which does not exist in the listing; this is a well-known technique to exit a loop or subroutine cleanly by triggering
ON ERR. - Line 277: The condition checks
A<>INT Ainstead of the presumably intendedB<>INT B, reusing the wrong variable for the last-note integer check.
Content
Image Gallery
Source Code
1 ON ERR GO TO 1: BORDER 4: PAPER 6: CLS : PAUSE 30
2 LET A$="ELECTERET": PRINT AT 10,9; PAPER 1; INK 7; FLASH 1;"stop the tape": GO SUB 9000
3 GO SUB 610: DELETE 610,700: DELETE 2,3
4 GO SUB 9000: CLS : FOR K=0 TO 10: PRINT INK 1;" MUSICIAN ROYAL "; INK 3;" MUSICIAN ROYAL ": NEXT K
5 PRINT ' PAPER 5;" mr * mr * mr **** mr * mr * mr "
7 PRINT PAPER 7;" "; PAPER 5;" \* 1986 Electret Scientific Co. ": GO SUB 500
19 DIM V$(3): DIM S(2,1512): DIM W(11): DIM T(10): DIM H(10)
20 LET TON=0: LET YY=1500: LET Q=1: LET QQ=1: LET QJ=1: DELETE 19,20
21 ON ERR GO TO 21: GO SUB 6010: LPRINT 'TAB 0;"INPUT MODE";TAB 0;"FOLLOWING NOTES ARE ENTERED"
22 CLS : GO SUB 9000: PRINT PAPER 5;"********** INPUT MODE **********": PRINT '''''''''" INPUT THE NUMBER OF SHARPS OR FLATS IN THE KEY SIGNATURE."
23 PAUSE 0: LET M$=INKEY$: IF CODE M$<48 OR CODE M$>55 OR LEN M$>1 THEN CLS : GO SUB 5000: GO TO 22
24 LET NM=VAL M$: LPRINT : LPRINT "Key Signature ";NM;: IF NM=0 THEN LPRINT ;0: LPRINT : GO TO 30
25 GO SUB 9000: PRINT ''" DOES THE SIGNATURE CONTAIN"," SHARPS (S) OR FLATS (F)?": PAUSE 0
27 IF CODE INKEY$>90 THEN GO SUB 6040: GO TO 25
28 IF INKEY$<>"S" AND INKEY$<>"F" THEN GO SUB 5010: CLS : GO TO 25
29 LET S$=INKEY$: LPRINT S$: LPRINT
30 CLS : LET V$="TC ": GO SUB 7500
32 FOR J=Q TO YY
40 ON ERR GO TO 40: PRINT PAPER 7;AT 20,0;" R Q K M P T Z TCH TCL BC BCH BCL TC ": BEEP 0.1,20: PRINT PAPER 5;AT 12,0;" INPUT NOTE OR REST NO. ";J;" "," ": IF QJ<J THEN LET QJ=J
51 INPUT "THE NOTE IS: ";V$: IF CODE V$>90 THEN GO SUB 6040: GO TO 30
52 IF V$(1 TO 2)="BC" OR V$(1 TO 2)="TC" THEN CLS : GO SUB 7500: GO TO 40
53 IF (CODE V$<65 OR CODE V$>71) AND V$(1)<>"Q" AND V$(1)<>"R" AND V$(1)<>("M" AND J>1) AND V$(1)<>("P" AND (J>1 OR QJ>1)) AND V$(1)<>("K" AND J>1) AND V$(1)<>("T" AND J>1) AND V$(1)<>("Z" AND J>1) THEN GO SUB 5010: GO TO 40
60 IF V$(1)="R" THEN LET S(2,J)=99: GO TO 130
62 IF V$(1)="Z" THEN LET J=J-1: GO TO 40
63 IF V$(1)="Q" THEN LPRINT TAB 0;"--------------------": GO TO 40
65 IF V$(1)="M" THEN GO TO 1450
66 IF V$(1)="P" THEN GO TO 236
67 IF V$(1)="T" AND QQ>9 THEN LET Q=J: GO SUB 5040: GO TO 30
68 IF V$(1)="T" THEN LET W(QQ+1)=J-1: LET QQ=QQ+1: LPRINT : LPRINT TAB 0;"TEMPO CHANGE AFTER NOTE ";J-1: LPRINT : GO TO 40
69 IF V$(1)="K" THEN LET Q=J: LPRINT : GO TO 22
70 IF CODE V$(2)<49 OR CODE V$(2)>57 THEN GO SUB 5010: GO TO 40
71 GO SUB 72: GO TO 130
72 IF V$(3)<>" " THEN GO TO 80
73 IF NM=1 THEN LET V$(3)= ("S" AND S$="S" AND V$(1)="F")+("F" AND S$="F" AND V$(1)="B")
74 IF NM=2 THEN LET V$(3)= ("S" AND S$="S" AND (V$(1)="F" OR V$(1)="C"))+("F" AND S$="F" AND (V$(1)="B" OR V$(1)="E"))
75 IF NM=3 THEN LET V$(3)= ("S" AND S$="S" AND (V$(1)="F" OR V$(1)="C" OR V$(1)="G"))+("F" AND S$="F" AND (V$(1)="B" OR V$(1)="E" OR V$(1)="A"))
76 IF NM=4 THEN LET V$(3)= ("F" AND S$="F" AND V$(1)<>"F" AND V$(1)<>"C" AND V$(1)<>"G")+("S" AND S$="S" AND V$(1)<>"B" AND V$(1)<>"E" AND V$(1)<>"A")
77 IF NM=5 THEN LET V$(3)= ("F" AND S$="F" AND V$(1)<>"F" AND V$(1)<>"C")+("S" AND S$="S" AND V$(1)<>"B" AND V$(1)<>"E")
78 IF NM=6 THEN LET V$(3)= ("F" AND S$="F" AND V$(1)<>"F")+("S" AND S$="S" AND V$(1)<>"B")
79 IF NM=7 THEN LET V$(3)=("F" AND S$="F")+("S" AND S$="S")
80 IF V$(3)<>"F" THEN GO TO 120
90 LET V$(3)=("S" AND (V$(1)<>"C" AND V$(1)<>"F"))+("N" AND (V$(1)="C" OR V$(1)="F"))
100 LET V$(2)=STR$ (VAL V$(2)-(1 AND V$(1)="A"))
110 LET V$(1)=(CHR$ (CODE V$(1)-1) AND V$(1)<>"A")+("G" AND V$(1)="A")
120 IF V$(3)="S" AND (V$(1)="B" OR V$(1)="E") THEN LET V$(1)=CHR$ (CODE V$(1)+1): LET V$(3)="N"
121 IF V$(3)=" " THEN LET V$(3)="N"
122 IF V$(3)<>"S" AND V$(3)<>"N" THEN GO SUB 5010: GO TO 40
125 RETURN
130 ON ERR GO TO 130: BEEP 0.1,10: BEEP 0.1,10: PRINT AT 12,1; PAPER 7;"INPUT THE VALUE (DURATION) OF": PRINT AT 13,3; PAPER 7;" THE NOTE OR REST NO. ";J;" "
140 INPUT "THE VALUE IS: ";S(1,J): LET L$=STR$ S(1,J): IF CODE L$<46 OR CODE L$>57 THEN GO SUB 5010: GO TO 130
145 LET S(1,J)=INT (S(1,J)*100+.5)/100: IF S(1,J)<.2 OR S(1,J)>128 THEN GO SUB 5000: GO TO 130
150 IF V$(1)="R" THEN GO TO 210
160 IF V$(3)=" " THEN LET V$(3)="N"
180 LET C=CODE V$(1)-65: LET D=VAL V$(2)-1: LET S(2,J)=-51+C*2+12*D-(1 AND C>1)-(1 AND C>4)+(1 AND V$(3)="S")
210 LPRINT J;" ";V$;" ";S(1,J);" ";S(2,J),: NEXT J
236 LET YY=1500: IF J>=1500 THEN GO SUB 5030
239 LPRINT TAB 0;" STOP ": LET J=QJ: LET W(QQ+1)=J-1: LET Q=J: LET XX=J-1: IF J=1 THEN LET QQ=1: GO TO 21
242 ON ERR GO TO 242: CLS : PRINT ''''''" PRESS ""ENTER"" IF YOU WANT TO PLAY THE COMPOSITION"'''" PRESS ""0"" IF YOU WANT TO EDIT THE COMPOSITION"'''" PRESS ""1"" IF YOU WANT TO ADD MORE NOTES"
246 PAUSE 0: IF INKEY$="0" THEN GO SUB 900
247 IF INKEY$="1" THEN GO TO 30
258 GO SUB 268: FOR K=2 TO QQ+1
259 IF W(K-1)+1>W(K) THEN GO TO 266
260 GO SUB 9220: PRINT W(K-1)+1;" TO NOTE NO. ";W(K),"OF THE MELODY."
263 INPUT "THE DURATION IS: ";T(K-1): LET I$=STR$ T(K-1): IF CODE I$<46 OR CODE I$>57 OR CODE I$=47 THEN GO SUB 5000: GO SUB 268: GO TO 260
264 LET T(K-1)=INT (T(K-1)*100+.5)/100: IF T(K-1)>10 THEN LET T(K-1)=10
265 IF T(K-1)<.1 THEN LET T(K-1)=.1
266 NEXT K: GO SUB 268: GO TO 271
268 CLS : PRINT PAPER 7;"THERE ARE ";J-1;" NOTES IN"; PAPER 6;AT 2,(31-LEN C$)/2;C$: RETURN
271 BEEP .1,12: LET D$="FIRST": LET E$="MELODY": GO SUB 9230
272 INPUT "THE FIRST NOTE IS NO. ";A: LET A$=STR$ A: IF CODE A$<49 OR CODE A$>57 THEN GO SUB 5000: GO SUB 268: GO TO 271
273 IF A<1 OR A>J-1 OR A<>INT A THEN GO SUB 5000: GO SUB 268: GO TO 271
275 BEEP .1,12: LET D$="LAST": GO SUB 9231
276 INPUT "THE LAST NOTE IS NO. ";B: LET B$=STR$ B: IF CODE B$<49 OR CODE B$>57 THEN GO SUB 5000: GO SUB 268: GO TO 275
277 IF B<1 OR B>J-1 OR B<A OR A<>INT A THEN GO SUB 5000: GO SUB 268: GO TO 275
305 LET CC=0
310 LET B=VAL B$: LET I=0: GO SUB 9200
340 FOR K=A TO B: IF K>W(I+1) THEN LET I=I+1
341 IF INKEY$<>"" THEN GO TO 380
355 LET T=T(I): IF S(2,K)=99 THEN PAUSE T/S(1,K)*60: GO TO 370
360 BEEP T/S(1,K),S(2,K)+TON
370 NEXT K: IF CC=1 THEN GO TO 310
380 IF FREE >7000 THEN GO TO 8050
383 ON ERR GO TO 383: CLS : PRINT AT 6,0;"PRESS ""1"" TO PLAY AGAIN.","PRESS ""2"" TO PLAY DIFFERENTLY.","PRESS ""3"" TO PLAY CONTINUOUSLY.","PRESS ""4"" TO ADD MORE NOTES.","PRESS ""5"" TO SAVE THE MELODY.","PRESS ""6"" TO GO TO PLAY MODE.","PRESS ""7"" TO LPRINT MUSIC DATA.","PRESS ""0"" TO EDIT.": PAUSE 0
390 IF INKEY$="3" THEN LET CC=1: GO TO 310
395 LET I$=INKEY$: IF CODE I$<48 OR CODE I$>55 THEN GO TO 380
396 IF I$="6" THEN GO TO 8000
398 IF I$="7" THEN GO TO 406
400 GO TO (900 AND I$="0")+(300 AND I$="1")+(258 AND I$="2")+(30 AND I$="4")+(8080 AND I$="5")+(1990 AND I$="6")
406 LPRINT : LPRINT "DATA ";"""";C$;""", ";J-1;",";QQ;",";: FOR K=2 TO QQ: LPRINT W(K);",";T(K-1);",";: NEXT K: LPRINT W(K);",";T(K-1): LPRINT : LPRINT "DATA ";
408 LET P=1: FOR I=1 TO J-2: FOR K=2 TO QQ: IF I=W(K)+1 THEN LPRINT 100;",";100;",";
410 NEXT K: IF P=19 THEN LPRINT ((S(2,I)+TON) AND S(2,I)<>99)+(99 AND S(2,I)=99);",";INT (S(1,I)*100+.5)/100: LPRINT : LPRINT "DATA ";: LET P=1: NEXT I
420 LPRINT ((S(2,I)+TON) AND S(2,I)<>99)+(99 AND S(2,I)=99);",";S(1,I);",";: LET P=P+1
430 NEXT I: LPRINT S(2,J-1)+TON;",";INT (S(1,J-1)*100+.5)/100: GO SUB 9000: GO TO 380
500 PRINT ''" THIS PROGRAM TRANSCRIBES AND PLAYS ONE-VOICE MUSIC.": GO TO 609
607 PRINT PAPER 3;" THIS PROGRAM PLAYS "
608 PRINT ''TAB (31-LEN C$)/2;C$
609 PRINT '' PAPER 7;" PRESS ""ENTER"" TO START ": PAUSE 0: CLS : IF A$="PLAY" THEN GO TO 305
610 FOR K=65 TO 79
620 FOR J=0 TO 7
630 READ Q
640 POKE USR CHR$ K+J,Q
650 NEXT J
660 NEXT K
670 DATA 0,0,0,0,0,0,56,68, 0,0,0,56,68,66,34,28, 56,68,66,34,28,0,0,0, 0,0,0,0,0,56,68,66, 0,0,56,68,66,34,28,0
680 DATA 0,0,0,0,0,0,0,56, 0,0,0,0,56,68,66,34, 0,56,68,66,34,28,0,0, 66,34,28,0,0,0,0,0, 34,28,0,0,0,0,0,0
690 DATA 68,66,34,28,0,0,0,0, 28,0,0,0,0,0,0,0, 16,40,40,40,16,48,80,146, 137,137,74,60,4,100,100,24, 112,137,200,200,9,16,32,64
700 RETURN
710 DELETE 500,604: DELETE 710,710
720 RETURN
900 GO SUB 4010
920 GO SUB 6000: PRINT '''''''' PAPER 5;" PRESS ""N"" TO CHANGE NAME"," OF COMPOSITION. PRESS ""T"""," TO CHANGE TEMPO SEQUENCES."," PRESS ""ENTER"" TO MAKE ANY"," OTHER CORRECTIONS. "
925 PRINT AT 21,7; BRIGHT 1; PAPER 6;"PRESS ""X"" TO EXIT"
930 PAUSE 0: IF INKEY$="N" THEN CLS : GO SUB 6010: GO TO 242
940 IF INKEY$="T" THEN CLS : GO TO 1140
945 IF INKEY$="X" THEN GO TO 242
950 CLS : LET A$="NOTE": GO SUB 4020
960 INPUT "THE FIRST NOTE IS NO. ";Q: LET W$=STR$ Q: IF CODE W$<49 OR CODE W$>57 THEN GO SUB 5010: GO TO 950
970 IF Q>J-1 THEN GO SUB 5000: GO TO 950
990 GO SUB 4000
1000 PAUSE 0: IF INKEY$<>"1" AND INKEY$<>"2" AND INKEY$<>"3" THEN GO SUB 5010: GO TO 1000
1010 GO TO (1020 AND INKEY$="1")+(1030 AND INKEY$="2")+(1300 AND INKEY$="3")
1020 LPRINT : LPRINT TAB 0;"NOTES CHANGED TO": LPRINT : GO TO 22
1030 LET A$="NOTES": GO SUB 4030
1040 INPUT "THE NUMBER OF NOTES IS: ";Y: LET Y$=STR$ Y: IF CODE Y$<48 OR CODE Y$>57 THEN GO SUB 5010: GO TO 1040
1045 IF Y>1500-J+1 THEN GO SUB 5000: GO TO 1030
1051 IF Y=0 THEN GO TO 240
1055 GO SUB 4040
1070 FOR K=J-1 TO Q STEP -1: LET S(1,K+Y)=S(1,K): LET S(2,K+Y)=S(2,K)
1080 LPRINT K+Y;" ";S(1,K);" ";S(2,K),
1100 FOR I=1 TO QQ: IF W(I)=K THEN LET W(I)=K+Y: GO SUB 1430
1125 NEXT I: NEXT K: LET QJ=QJ+Y
1127 FOR K=0 TO Y-1: LET S(1,Q+K)=8: LET S(2,Q+K)=0: NEXT K
1129 GO SUB 4100
1130 CLS : LET YY=Q+Y-1: GO TO 22
1140 GO SUB 9000: PRINT PAPER 5;" INPUT THE SEQUENTIAL NUMBER OF THE FIRST NOTE AFTER WHICH THE TEMPO IS TO BE CHANGED. "
1150 INPUT "THE FIRST NOTE IS NO. ";Z: LET Z$=STR$ Z: IF CODE Z$<49 OR CODE Z$>57 THEN GO SUB 5010: GO TO 1150
1155 IF Z>J-2 THEN GO SUB 5000: GO TO 1140
1170 GO SUB 9000: PRINT '' PAPER 3;"HOW MANY TIMES DOES THE TEMPO CHANGE AFTER NOTE NO. ";Z;"?","(ALL TEMPO CHANGES FOLLOWING","NOTE NO. ";Z;" MUST BE RESET)"
1180 INPUT "THE NUMBER OF CHANGES IS: ";O: LET O$=STR$ O: IF CODE O$<48 OR CODE O$>57 THEN GO SUB 5010: GO TO 1170
1185 IF O>J-Z-1 OR O>9 THEN GO SUB 5000: GO TO 1170
1200 IF QQ=1 THEN GO TO 1225
1209 FOR I=2 TO QQ: IF W(I)<Z THEN GO TO 1220
1215 LET Y=I: FOR S=Y TO QQ: LET W(S)=0: NEXT S: LET QQ=I-1: GO TO 1225
1220 NEXT I
1225 LET NN=Z
1230 FOR I=1 TO O
1240 GO SUB 9000: PRINT AT 11,0; PAPER 5;"INPUT THE NOTE NUMBER (NOT ","SMALLER THAN ";NN;") AFTER WHICH","TEMPO CHANGE NO. ";I;" TAKES PLACE"
1250 INPUT "THE NOTE NUMBER IS: ";NN: LET K$=STR$ NN: IF CODE K$<49 OR CODE K$>57 THEN GO SUB 5010: GO TO 1250
1255 IF NN>=J-1 THEN GO SUB 5000: GO TO 238
1260 IF NN<Z THEN LET NN=Z: GO SUB 5000: GO TO 1240
1270 LET QQ=QQ+1: LET W(QQ)=NN: LPRINT : LPRINT TAB 0;"TEMPO CHANGES AFTER NOTE ";NN: LPRINT
1275 LET NN=NN+1: LET Z=NN: IF QQ>10 THEN GO SUB 5040: GO TO 238
1280 NEXT I
1290 GO TO 238
1300 GO SUB 9000: PRINT '' PAPER 5;"HOW MANY NOTES OR RESTS STARTINGWITH NOTE NO. ";Q;" ARE TO BE","DELETED?"
1310 INPUT "THE NUMBER IS: ";X: LET X$=STR$ X: IF CODE X$<48 OR CODE X$>57 THEN GO SUB 5010: GO TO 1310
1315 IF X>J-Q THEN GO SUB 5000: GO TO 1300
1321 IF X=0 THEN GO TO 240
1325 LET QZ=0: GO SUB 4050
1327 FOR I=2 TO QQ: LET H(I)=W(I)
1328 IF QZ=0 THEN IF W(I)>=Q-1 THEN IF W(I)<=Q+X-1 THEN LET QZ=I: LET W(I)=Q-1: GO SUB 1430
1330 NEXT I: FOR K=Q+X TO J-1
1340 LET S(1,K-X)=S(1,K): LET S(2,K-X)=S(2,K)
1350 LPRINT K-X;" ";S(1,K);" ";S(2,K),
1370 FOR I=2 TO QQ: IF QZ=0 THEN LET QZ=I
1380 IF H(I)=K THEN LET W(QZ+1)=K-X: LPRINT : LPRINT TAB 0;"TEMPO CHANGE AFTER NOTE ";W(QZ+1): LPRINT : LET QZ=QZ+1
1402 NEXT I: NEXT K: IF QZ=0 THEN LET QZ=1
1420 LET Q=Q-X: LET QQ=QZ: LET J=J-X: LET QJ=QJ-X: CLS : GO TO 239
1430 LPRINT : LPRINT TAB 0;"TEMPO CHANGE AFTER NOTE ";W(I): LPRINT : RETURN
1450 GO SUB 4060: PRINT '"NOTE NO. ";J
1460 LET A$="NOTE": GO SUB 4070
1470 INPUT "THE FIRST NOTE IS NO. ";E: LET U$=STR$ E:: IF CODE U$<49 OR CODE U$>57 THEN GO SUB 5010: GO TO 1470
1480 IF E>J-1 OR E<1 THEN GO SUB 5000: GO TO 1460
1500 GO SUB 4080
1510 INPUT "THE LAST NOTE IS NO. ";D: LET R$=STR$ D: IF CODE R$<49 OR CODE R$>57 THEN GO SUB 5010: GO TO 1510
1520 IF D>J-1 OR D<E THEN GO SUB 5000: GO TO 1500
1531 IF D-E>YY-J THEN GO SUB 5000: GO TO 1500
1532 LPRINT : LPRINT TAB 0;D-E+1;" NOTES ARE DUPLICATED FROM";TAB 0;E;" TO ";D: LPRINT
1550 GO SUB 7000: GO SUB 4090
1580 FOR I=J TO J+D-E: LET S(1,I)=S(1,E): LET S(2,I)=S(2,E): IF A$<>"O" THEN LPRINT I;" ";S(1,I);" ";S(2,I);" ",:
1610 LET E=E+1: NEXT I: LET Q=I: LPRINT TAB 0;"END": IF QJ<I THEN LET QJ=I
1611 GO TO 30
4000 GO SUB 9000: CLS : PRINT ; PAPER 3; BRIGHT 1;"PRESS ""1"" TO CHANGE NOTES, PRESS ""2"" TO INSERT NOTES, PRESS ""3"" TO DELETE NOTES ": RETURN
4010 CLS : PRINT PAPER 5;"********** EDIT MODE ***********": RETURN
4020 GO SUB 9000: PRINT '''''''' PAPER 5;" INPUT THE SEQUENTIAL NUMBER OF THE FIRST ";A$;" OR REST WHICH"," IS TO BE CHANGED, INSERTED, OR DELETED. ": RETURN
4030 GO SUB 9000: PRINT '' PAPER 5;"HOW MANY ";A$;" OR RESTS ARE TO"," BE INSERTED? ": RETURN
4040 LPRINT : LPRINT TAB 0;"FOLLOWING NOTES ARE RENUMBERED": LPRINT : GO SUB 4090: RETURN
4050 LPRINT : LPRINT TAB 0;X;" ";A$;" ARE DELETED. FOLLOWING NOTES ARE RENUMBERED": LPRINT : GO SUB 4090: RETURN
4060 CLS : PRINT TAB 6; PAPER 5;"* DUPLICATION MODE *": RETURN
4070 GO SUB 6000: PRINT '''"INPUT THE SEQUENTIAL NUMBER OF","THE FIRST ";A$;" TO BE DUPLICATED": RETURN
4080 GO SUB 9000: PRINT ''"INPUT THE SEQUENTIAL NUMBER OF","THE LAST ";A$;" TO BE DUPLICATED": RETURN
4090 PRINT AT 10,8; PAPER 2; INK 7; FLASH 1;"PLEASE STAND BY": RETURN
4100 LPRINT : LPRINT TAB 0;"FOLLOWING ";Y;" ";A$;" ARE INSERTED": LPRINT : RETURN
5000 CLS : GO SUB 5010: PRINT AT 10,4; FLASH 1; PAPER 2; INK 7;"WRONG NUMBER, TRY AGAIN": PAUSE 180: CLS : RETURN
5010 BEEP .4,-36: RETURN
5020 GO SUB 5010: CLS : PRINT AT 9,9; FLASH 1; PAPER 2; INK 7;A$;" NOTES";AT 11,5;"MUST BE ENTERED FIRST": PAUSE 180: CLS : RETURN
5030 CLS : GO SUB 5010: PRINT ''''''''''" "; FLASH 1; PAPER 2; INK 7;"DATA LIMIT HAS BEEN REACHED": PAUSE 180: CLS : RETURN
5040 CLS : GO SUB 5010: PRINT ''''''''''; FLASH 1; PAPER 2; INK 7;" ONLY 9 TEMPO CHANGES";TAB 11;"ARE ALLOWED ": PAUSE 180: CLS : RETURN
6000 BEEP .3,9: BEEP .3,13: BEEP .1,9: BEEP .1,13: RETURN
6010 GO SUB 6000: PRINT '''''''''" PLEASE TYPE AND ENTER"''" THE NAME OF THE COMPOSITION"
6030 INPUT "THE NAME IS: ";C$: IF LEN C$>30 THEN GO SUB 5010: PRINT FLASH 1; PAPER 3; INK 7;AT 20,0;" THE NAME IS TOO LONG, PLEASE MAKE IT SHORTER. ": PAUSE 180: CLS : GO TO 6010
6035 LPRINT "*";C$;"*": RETURN
6040 CLS : PRINT ''''''''''" please turn on the caps lock"," and press ""enter""": GO SUB 5010: INPUT A$: CLS : RETURN
7000 CLS : BEEP .1,24: BEEP .1,20: BEEP .1,16 : PRINT '''" PRESS ""O"" TO TURN"," THE PRINTER OFF. PRESS"," ""ENTER"" TO CONTINUE.": PAUSE 0: LET A$=INKEY$: RETURN
7510 PRINT AT 2,26;"\f \g \h"
7520 PRINT TAB 22;"\d \e \k \l"
7530 PRINT TAB 16;"\a \b \c \j"
7540 PRINT TAB 10;"\f \g \h \i"
7550 PRINT TAB 6;"\d \e \k \l"
7560 PRINT "\a \b \c \j"'"\i"
7570 FOR K=123 TO 147 STEP 6
7580 IF V$(3)<>"H" AND V$(3)<>"L" THEN PLOT 0,K: DRAW 255,0
7581 IF V$(3)="H" THEN PLOT 0,K-18: DRAW 255,0
7583 IF V$(3)="L" THEN PLOT 0,K+12: DRAW 255,0
7585 NEXT K
7588 IF V$(3)="H" THEN PLOT 192,147: DRAW 8,0: PLOT 208,147: DRAW 8,0: PLOT 224,147: DRAW 8,0: PLOT 240,147: DRAW 8,0: PLOT 160,141: DRAW 8,0: PLOT 176,141: DRAW 8,0: PLOT 192,141: DRAW 8,0: PLOT 208,141: DRAW 8,0: PLOT 224,141: DRAW 8,0: PLOT 240,141: DRAW 8,0
7589 IF V$(3)="H" THEN PLOT 128,135: DRAW 8,0: PLOT 144,135: DRAW 8,0: PLOT 160,135: DRAW 8,0: PLOT 176,135: DRAW 8,0: PLOT 192,135: DRAW 8,0: PLOT 208,135: DRAW 8,0: PLOT 224,135: DRAW 8,0: PLOT 240,135: DRAW 8,0
7590 IF V$(3)="L" THEN PLOT 0,123: DRAW 8,0: PLOT 16,123: DRAW 8,0: PLOT 8,0: PLOT 32,123: DRAW 8,0: PLOT 48,123: DRAW 8,0: PLOT 64,123: DRAW 8,0
7592 IF V$(3)="L" THEN PLOT 0,129: DRAW 8,0: PLOT 16,129: DRAW 8,0: PLOT 32,129: DRAW 8,0: PLOT 32,129: DRAW 8,0: PLOT 48,129: DRAW 8,0: PLOT 64,129: DRAW 8,0: PLOT 80,129: DRAW 8,0: PLOT 96,129: DRAW 8,0
7600 IF V$(3)<>"H" OR V$(3)<>"L" THEN PLOT 0,111: DRAW 8,0: PLOT 0,117: DRAW 8,0: PLOT 16,117: DRAW 8,0: PLOT 32,117: DRAW 8,0: PLOT 224,153: DRAW 8,0: PLOT 240,153: DRAW 8,0
7606 IF V$(1)="B" THEN GO TO 7612
7608 IF V$="TCL" THEN PRINT AT 0,0; PAPER 7;"D E F G "; PAPER 5;"A B C D E F G"; PAPER 7;" A B C D E "; PAPER 7;"4 4 4 4 "; PAPER 5;"5 5 5 5 5 5 5"; PAPER 7;" 6 6 6 6 6 "
7609 IF V$="TCH" THEN PRINT AT 0,0; PAPER 5;"G"; PAPER 7;" A B C D E F G "; PAPER 5;"A B C D E F G"; PAPER 7;" A "; PAPER 5;"5"; PAPER 7;" 6 6 6 6 6 6 6 "; PAPER 5;"7 7 7 7 7 7 7"; PAPER 7;" 8 "
7610 IF V$(3)<>"H" AND V$(3)<>"L" THEN PRINT AT 0,0; PAPER 5;"A B C D E F G"; PAPER 7;" A B C D E F G "; PAPER 5;"A B","5 5 5 5 5 5 5"; PAPER 7;" 6 6 6 6 6 6 6 "; PAPER 5;"7 7 "
7611 IF V$(1 TO 2)="TC" THEN PRINT INK 2;AT 2,1;"\m";AT 3,1;"\n treble clef": RETURN
7612 IF V$="BCH" THEN PRINT AT 0,0; PAPER 7;"B C D E F G "; PAPER 5;"A B C D E F G"; PAPER 7;" A B C "; PAPER 7;"4 4 4 4 4 4 "; PAPER 5;"5 5 5 5 5 5 5"; PAPER 7;" 6 6 6 "
7614 IF V$="BCL" THEN PRINT AT 0,0; PAPER 7;"F G "; PAPER 5;"A B C D E F G"; PAPER 7;" A B C D E F G"; PAPER 7;" 2 2 "; PAPER 5;"3 3 3 3 3 3 3"; PAPER 7;" 4 4 4 4 4 4 4 "
7618 IF V$(3)<>"H" AND V$(3)<>"L" THEN PRINT AT 0,0; PAPER 5;"C D E F G"; PAPER 7;" A B C D E F G "; PAPER 5;"A B C D","3 3 3 3 3"; PAPER 7;" 4 4 4 4 4 4 4 "; PAPER 5;"5 5 5 5 "
7620 IF V$(1 TO 2)="BC" THEN PRINT AT 2,1;" "; INK 2;AT 3,1;"\o bass clef ": RETURN
8000 CLS : PRINT PAPER 2; INK 7; FLASH 1;"*********** WARNING ************"
8010 PRINT '''''''"IN THE ""PLAY"" MODE YOU CAN PLAY","OR SAVE THE COMPOSITION, BUT YOUCAN NOT RETURN FROM IT TO THE INPUT MODE OR TO THE EDIT MODE."
8020 PRINT PAPER 7;'''''''" PRESS ""ENTER"" TO RETURN TO THE"," INPUT MODE. ENTER ""PLAY"" TO GO"," TO THE PLAY MODE. "
8030 INPUT A$: IF A$<>"PLAY" AND A$<>"play" THEN LET PP=0: GO TO 383
8040 DELETE 10,248: DELETE 383,400: DELETE 900,8040
8050 ON ERR GO TO 8050: CLS : PRINT AT 6,0;"PRESS ""1"" TO PLAY AGAIN.","PRESS ""2"" TO PLAY DIFFERENTLY.","PRESS ""3"" TO PLAY CONTINUOUSLY.","PRESS ""4"" TO CHANGE TONALITY.","PRESS ""5"" TO SAVE THE MELODY.","PRESS ""6"" TO SAVE COMPOSITION.","PRESS ""7"" TO LPRINT MUSIC DATA.","PRESS ""X"" TO QUIT MUSICIAN ROYAL": PAUSE 0
8060 LET I$=INKEY$: IF CODE I$<49 OR CODE I$>55 THEN IF I$<>"X" AND I$<>"x" THEN GO TO 8050
8064 IF I$="4" THEN GO TO 9990
8065 IF I$="3" THEN LET CC=1: GO TO 310
8066 IF I$="7" THEN GO TO 406
8068 IF I$="X" OR I$="x" THEN GO TO 9799
8070 GO TO (305 AND I$="1")+(258 AND I$="2")+(8080 AND I$="5")+(8120 AND I$="6")
8080 FOR K=1 TO 10: LET S(1,1500+K)=W(K+1): LET S(2,1502+K)=T(K): NEXT K
8090 LET S(2,1501)=QQ: LET S(2,1502)=J-1: SAVE "MELODY" DATA S( ): GO SUB 9000: GO SUB 9250: GO TO 380
8120 LET A$="PLAY": SAVE "MUSIC" LINE 9100: GO SUB 9000: GO SUB 9250: GO TO 8050
9000 BEEP .1,0: RETURN
9100 ON ERR GO TO 1: IF FREE <18000 THEN GO TO 1
9110 PRINT AT 10,9; PAPER 1; INK 7; FLASH 1;"stop the tape": GO SUB 9000: PAUSE 240: CLS : GO TO 1
9200 CLS : PRINT PAPER 5;"********* NOW PLAYING **********"
9210 PRINT AT 10,(31-LEN C$)/2;C$''''''''''' PAPER 5;"********* NOW PLAYING **********":
9212 PRINT PAPER 7;AT 20,0;" PRESS ""ENTER"" TO STOP ": PAPER 6: RETURN
9220 BEEP .1,12: PRINT AT 6,0;"INPUT THE DESIRED DURATION OF","A WHOLE NOTE IN SECONDS FROM","NOTE NO. ";: RETURN
9230 PRINT '''"INPUT THE SEQUENTIAL NUMBER OF THE ";D$;" NOTE FROM WHICH THE",E$;" SHOULD BE PLAYED.": RETURN
9231 PRINT '''"INPUT THE SEQUENTIAL NUMBER OF THE ";D$;" NOTE TO WHICH THE ",E$;" SHOULD BE PLAYED.": RETURN
9250 CLS : PRINT AT 10,9; PAPER 1; INK 7; FLASH 1;"stop the tape": PAUSE 180: RETURN
9799 ON ERR RESET : CLEAR : DELETE 1,9300: DELETE 9990,
9800 CLS : PRINT AT 10,8;"Come back soon!";TAB 4;"I'll be waiting for you.": BEEP .25,21: BEEP .38,23: BEEP .5,19: BEEP .15,21: BEEP .15,21: BEEP .15,21: BEEP .38,23: BEEP .1,21: BEEP .2,21: BEEP .5,19: PAUSE 300: CLS
9801 DELETE 9799,9799: DELETE 9801,9801
9990 CLS : PAPER 5: PRINT AT 6,0;"YOU CAN CHANGE THE TONALITY "
9991 PRINT "OF THE COMPOSITION. ENTER 0 TO "
9992 PRINT "RETAIN THE ORIGINAL TONALITY. "
9993 PRINT "ENTER A POSITIVE NUMBER TO MAKE "
9994 PRINT "THE TONALITY HIGHER. ENTER A "
9995 PRINT "NEGATIVE NUMBER TO MAKE IT "
9996 PRINT "LOWER. EACH UNIT CHANGES THE "
9997 PRINT "TONALITY BY ONE SEMI-TONE. "
9998 INPUT "ENTER THE TONALITY CHANGE ";TON: LET T$=STR$ TON: IF CODE T$<48 AND CODE T$>57 THEN GO SUB 5000: GO TO 9990
9999 PAPER 6: GO TO 305
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.