100 OPEN #3,con_430x100a50x16:SCALE #3,100,0,-100:PAPER #3,4:INK #3,0:OVER #3,1
110 OPEN #4,scr_400x100a80x16:PAPER #4,4:CLS
140 DIM notes(45),position(45):notes$="":RESTORE 5000
150 FOR i=0 TO 45:READ line$,notes(i),position(i):notes$=notes$&line$
160 DIM music$(500)
500 RESTORE 9000:l_note=0
510 REPeat note
515 IF EOF OR l_note>30 THEN EXIT note
520 READ line$
530 FOR i=1 TO LEN(line$)-2 STEP 3:l_note=l_note+1:music$(l_note)=CHR$((line$(i TO i+2) INSTR notes$-1)/3)
540 END REPeat note
545 draw_scale
550 REMark pos=9999:FOR i=1 TO 20:play CODE(music$(i))
560 BEEP
570 FOR i=0 TO 19:dis_note i,CODE(music$(i+1))
580 c_note=1:pos=0:key1=0
590 REPeat key
600 CURSOR #3,30+pos*20,30
605 IF key1 THEN key=key1:key1=0:ELSE Q_CURSON #3:key=CODE(INKEY$(#3,-1)):Q_CURSOFF #3
610 SELect ON key
620 =192
625 note_l
630 =200
635 note_r
640 =202
650 IF c_note<l_note THEN music$(c_note+1 TO l_note)=music$(c_note TO l_note+1)
660 l_note=l_note+1:music$(c_note)=CHR$(46):ins_note pos,c_note
670 =194
680 IF l_note<1 THEN NEXT key
690 IF c_note<l_note THEN music$(c_note TO l_note-1)=music$(c_note+1 TO l_note)
700 l_note=l_note-1:del_note pos,c_note
710 IF c_note>l_note AND l_note>0 THEN note_l
720 =208
730 j=CODE(music$(c_note)):IF l_note<1 OR j<1 THEN NEXT key
740 upd_note j-1
750 =216
760 j=CODE(music$(c_note)):IF l_note<1 OR j>45 THEN NEXT key
770 upd_note j+1
780 =65 TO 71,97 TO 103
790 note$=CHR$(key)&" ":Q_CURSON #3:key1=CODE(INKEY$(#3,-1)):Q_CURSOFF #3
820 SELect ON key1=35,183:note$(2)=CHR$(key1):Q_CURSON #3:key1=CODE(INKEY$(#3,-1)):Q_CURSOFF #3
830 IF key1<48 OR key1>52 THEN NEXT key
840 j=(CHR$(key1)&note$) INSTR notes$:key1=0:IF j>0 THEN upd_note (j-1)/3
930 =27:EXIT key
940 END SELect 
950 END REPeat key
1000 DEFine PROCedure dis_note(pos,note)
1010 LOCal x,y,y1,d,i,l_note
1020 IF note>45 THEN RETurn 
1030 x=pos*15+25:y=-6-position(note)*3:l_note=2
1035 i=note*3+1:CURSOR #3,x,y+4,4:PRINT #3,notes$(i+2);
1037 CURSOR #3,30+pos*20,90:PRINT #3,notes$(i TO i+1);
1040 FILL #3,l_note>1:CIRCLE #3,x,y,2:FILL #3,0:IF l_note<1 THEN RETurn 
1050 IF note>19 THEN d=1:y1=y+16:ELSE d=-1:y1=y-16
1060 x=x+2:LINE #3,x,y TO x,y1:IF l_note<3 THEN RETurn 
1070 FOR i=3 TO l_note:LINE #3,x,y1 TO x-4,y1-4*d:y1=y1-d*4
1080 END DEFine 
1090 DEFine PROCedure clr_block(pos)
1100 LOCal k
1105 j=30+pos*20:BLOCK #3,16,100,j,0,4
1110 FOR k=9 TO 33 STEP 6:BLOCK #3,16,1,j,k,7:BLOCK #3,16,1,j,k+36,7
1111 END DEFine 
1113 DEFine PROCedure play(note)
1114 LOCal j
1116 pos=(pos+1)*(pos<19):clr_block pos
1120 BEEP:PAUSE 1:IF note>45 THEN RETurn 
1122 BEEP 0,notes(note)
1125 CURSOR #3,j,position(note)*3+1:PRINT #3,"o";notes$(note*3+3);
1130 END DEFine 
1140 DEFine PROCedure draw_scale
1150 CLS #3:BLOCK #3,3,25,0,9,7:BLOCK #3,3,25,0,45,7
1160 FOR i=9 TO 36 STEP 6:BLOCK #3,430,1,0,i,7:BLOCK #3,430,1,0,i+36,7
1170 END DEFine 
1180 DEFine PROCedure note_r
1190 IF c_note>=l_note THEN RETurn 
1200 c_note=c_note+1:IF pos<19 THEN pos=pos+1:ELSE del_note 0,c_note-20
1210 END DEFine 
1220 DEFine PROCedure note_l
1230 IF c_note<=1 THEN RETurn 
1240 c_note=c_note-1:IF pos>0 THEN pos=pos-1:ELSE ins_note 0,c_note
1250 END DEFine 
1260 DEFine PROCedure del_note(pos,c_note)
1270 LOCal k
1275 WINDOW #4,400-pos*20,100,80+pos*20,16:PAN #4,-20
1280 FOR k=9 TO 33 STEP 6:BLOCK #3,20,1,410,k,7:BLOCK #3,20,1,410,k+36,7
1290 IF c_note+20-pos<l_note THEN dis_note 19,CODE(music$(c_note+20-pos))
1300 END DEFine 
1310 DEFine PROCedure ins_note(pos,c_note)
1320 LOCal k
1325 WINDOW #4,400-pos*20,100,80+pos*20,16:PAN #4,20
1330 FOR k=9 TO 33 STEP 6:BLOCK #4,20,1,0,k,7:BLOCK #4,20,1,0,k+36,7
1340 dis_note pos,CODE(music$(c_note))
1350 END DEFine 
1360 DEFine PROCedure upd_note(note)
1370 music$(c_note)=CHR$(note):clr_block pos:dis_note pos,note
1380 IF note<46 THEN BEEP 2000,notes(note)
1390 END DEFine 
5000 DATA "0a ",3,0,"1g#",3,1,"1g ",4,1,"1f#",5,2,"1f ",6,2,"1e ",7,3,"1e",8,3
5010 DATA "1d ",9,4,"1c#",10,5,"1c ",11,5,"1b ",12,6,"1b",13,6,"1a ",15,7
5020 DATA "2g#",16,8,"2g ",18,8,"2f#",20,9,"2f ",22,9,"2e ",24,10,"2e",26,10
5030 DATA "2d ",28,11,"2c#",30,12,"2c ",33,12,"2b ",36,13,"2b",38,13,"2a ",41,14
5040 DATA "3g#",43,15,"3g ",46,15,"3f#",50,16,"3f ",54,16,"3e ",58,17,"3e",62,17
5050 DATA "3d ",66,18,"3c#",71,19,"3c ",76,19,"3b ",82,20,"3b",87,20,"3a ",92,21
5060 DATA "4g#",97,22,"4g ",103,22,"4f#",111,23,"4f ",120,23,"4e ",127,24,"4e",134,24
5070 DATA "4d ",142,25,"4c#",152,26,"4c ",162,26
9000 DATA "2b2f 1d 2f 2a 2f 1c 2f 2b2f 1d 2f 3e 1a 1f 1a 3g 2d 1a 2d "
9010 DATA "3e 2d 1a 2d 3g 2d 1a 2d 3d 2f 1d 2f 3e2b2g 2b3d 2b2f 2b"
9020 DATA "3e2b2g 2b3b2d 1a 2d 3c 2d 2e2d 3b2d 2g 2d 3a 2c 2f 2c "
9030 DATA "4f 2a 2e2a 3b1d 1f 1d 3e 1a 1d 1a 3d 2f 1a 2f 3b2d 2f 2d "
9040 DATA "4g 3d 3e 3f#3g 2a 2b2c 2b3g 2a 2b2c 2d 2e 2f 2c 2e 2g 2e "
9050 DATA "3g 2c 2e 2c 3e 3g 2c 3g 3c 3e 3g 3c 3c 3e 3g 3c 4g 1c 1e 1c "
9060 DATA "4e 2g 1c 2g 4c 2e 2g 2e 3a 3e 3e 3g 2a 2b 2c 2d 2c 2a 2b 2c "
9070 DATA "2d 2e 2f 2d 2c "
