Raspberry-Pi_Zeroやスマホ、タブレットパソコンには汎用USBポートが一つしか使えない物が多い。そこで、SD リーダーとLANアダプタ、マウスやキーボードなど複数のUSB機器を接続するにはUSBハブを使っているが、チョット立ち寄ったパソコンショップで3個のUSB2.0ハブと(micro)SDカードリーダーを同時に使えるMRS-MBH10(エレコム製、\1,000)を見つけ、入手した。USBポートが少ないマシンには、コンパクトで持ち運びにも便利なので、これがベストチョイス。
Excelでデータを検索し、一致した場合に関連付けされたデータを取り出したい時があります。こんな時にはLOOKUP関数またはVLOOKUP関数、HLOOKUP関数が使える。しかし、表の形式に左右されないLOOKUP関数を使った場合、思惑と異なる結果やエラーで出ることがあります。
これは、LOOKUP関数には以下の欠点がある、
VLOOKUP/HLOOKUP関数では、4番目の引数で「FALSE」を指定すると、データが完全に一致したものだけを取り出すことができるが、LOOKUP関数で完全一致しない場合はエラーを表示するのではなく、近似値で一致したデータを取り出してくる。また、検査範囲データが順不同の場合はLOOKUP関数が使えないので、VLOOKUP/HLOOKUP関数を使うしかない。
LOOKUP(検査値,検査範囲,対応範囲) | |
---|---|
検査値: | 検索する値(一致させたい場所のセル参照や値、文字列)を指定 |
検査範囲: | 上の「検査値」で検索する1行または1列を指定 |
対応範囲: | 検索結果に表示する1行または1列を指定 |
VLOOKUP/HLOOKUP(検索値,範囲,列番号[,検索の型]) | |
検索値: | 検索する値(一致させたい場所のセル参照や値、文字列)を指定 |
範 囲: | 検索する(一致させる)相手のデータ全体を指定 |
列番号: | 「範囲」で指定したデータの「検索値」を一致させる左から何番目の列 |
検索の型: | 完全一致させたい場合は「FALSE」、近似値で一致させたい場合は「TRUE」を入力。 省略した場合は「TRUE」になる。(FALSEは「0」、TRUEは「1」でも可) |
前報(abc793)でBASICによるMML演奏ができたので、MML演奏データを作成するエディッタを作成した。基本的にはabc792とabc793を併せたもので、鍵盤(キーボード)からのMMLデータ入力・修正、任意の場所からの試し演奏や、ファイルの入出力などを追加した。
起動画面 |
鍵盤(キーボード)の配置 |
疑似鍵盤(シールで目印) | MML編集(演奏)画面 |
10 '*** MML Play & Edit program *** 50 CLEAR 9000,&HE7FF: DEFINT A-Z 60 CONSOLE 0,25,1,1: PRINT CHR$(12) 70 CONSOLE ,,0,0: COLOR 0: WIDTH 80,20 100 '-- Declear Val. 110 DIM MM$(9,10),V(9),NA$(9) :'MML data 120 DIM W%(15) :'Wave Parameter 130 DIM M$(15) :'Scal Data 140 DIM T%(13) :'Delay Time Data 150 DIM SD% :'Sound Data 160 DIM OC% :'Current Octave 170 DIM DN% :'Default Note Value 180 DIM TM% :'Time Count Data 190 DIM TT% :'Tempo 195 DIM NT$(14) :'Note Data 199 '--- User Func. 200 DEF USR0 = &HE800 :'Sound Init 210 DEF USR1 = &HE80C :'Sound Clear 220 DEF USR2 = &HE81A :'Sound Off 230 DEF USR3 = &HE820 :'Ch0 Play 240 DEF USR4 = &HE824 :'Ch1 Play 250 DEF USR5 = &HE828 :'Ch2 Play 260 DEF USR6 = &HE831 :'Sound On 270 DEF USR7 = &HE837 :'Copy Char to PCG 300 '--- Init Param. 310 IF PEEK(&HE800)=62 THEN 340 :'Check "3E" 315 PRINT "Initalizing. wait!" 320 GOSUB 9010 :'Mashin Lang. Set 330 D=USR7(1) :'Copy Char to PCG 335 LOCATE 0,0: PRINT SPC(30); 340 GOSUB 9510 :'MML Data Init. 350 GOSUB 9710 :'Delay Time Data Init. 360 D=USR0(SD%) :'Init. PCG Sound 365 OC%=4:DN%=4:TM%=T%(8):TT%=120 370 ML= 2: Y=ML-1: GOSUB 980 :'MML Line 380 CL=15: Y=CL-1: GOSUB 980 :'Cmd Line 390 GOSUB 4910 :'Init. Edit Data 395 G=0: SV=0: M=0: P=1 :'Common Var.s 400 '=== Main Loop === 410 Y=ML: GOSUB 950 420 GOSUB 910: GOSUB 920: GOSUB 510 425 SV=V(G): IF SV>0 THEN M=1 ELSE M=0 430 MG$="CR:play,E]dit,L]oad,S]ave,N]ew,[0-9] ?": GOSUB 960 440 K$=INPUT$(1): IF K$="!" THEN 490 450 IF K$=CHR$(13) THEN GOSUB 610: GOTO 410 460 S=INSTR("0123456789",K$): IF S>0 THEN G=S-1:GOTO 420 470 S=INSTR("ELSN",K$): IF S=0 THEN 440 480 ON S GOSUB 5010,7010,8010,650 485 GOTO 410 490 MG$="End":GOSUB 970: IF K$="y" THEN END ELSE 430 500 '--- Dsp. Music List 510 GOSUB 3120: LOCATE 0,ML 520 FOR I=1 TO 9 530 IF G=I THEN COLOR 4 ELSE COLOR 0 540 PRINT HEX$(I);":";NA$(I);SPC(20-LEN(NA$(I))); 550 AM=I MOD 3: IF AM=0 THEN PRINT ELSE PRINT TAB(AM*26); 560 NEXT: COLOR 0 570 RETURN 600 '--- Play Music 610 SV=V(G): IF SV=0 THEN M=0: RETURN 620 M=1: GOSUB 710: RETURN 640 '--- Delete MML (New) 650 MG$="Delete": GOSUB 970: IF NOT(K$="y") THEN RETURN 660 FOR I=0 TO 9: MM$(G,I)="": NEXT 670 SV=0: V(G)=0: NA$(G)="": M=0 680 GOSUB 910: GOSUB 920 690 RETURN 700 '=== Play MML === 705 '--- Main Play Loop 710 OC%=4: DN%=4: TM%=T%(8): TT%=120: ST=0: P=1 715 GOSUB 3150 720 GOSUB 910: GOSUB 920 730 RM=0: RP=0 740 BF$=MM$(G,M): BN=LEN(BF$) 745 GOSUB 910: Y=ML+(M-1)*3: GOSUB 940: GOSUB 3220: COLOR 4 750 IF INKEY$<>"" THEN 870 760 ER=0: ST=0: GOSUB 1020 :'Decode MML 770 IF ST=0 THEN D=USR2(1) :'Sound Off 780 IF ER<0 THEN 830 790 D=USR3(SD%) :'Sound On 800 T=TM%/TT% :'Time Delay 810 FOR I=0 TO T:Z=Z: NEXT 820 GOTO 750 830 IF M<SV THEN M=M+1: P=1: GOTO 740 840 '-- Play End 850 D=USR2(1): COLOR 0: RETURN :'Sound Off 860 '-- Pause 870 D=USR2(1): GOSUB 3240: COLOR 0: MG$="Cont": GOSUB 970 880 IF K$="y" THEN COLOR 4: GOSUB 3250: GOTO 760 890 IF K$="n" THEN RETURN ELSE 870 900 '--- DSP Sub.s 910 LOCATE 0,0:COLOR 0:PRINT USING"M/V[#/#]";M,SV;:PRINT SPC(30);: RETURN 920 LOCATE 40,0:COLOR 0:PRINT HEX$(G);":";NA$(G);SPC(20-LEN(NA$(G)));:RETURN 930 LOCATE 0,0:COLOR 0:PRINT USING"M/V[#/#] P[###],";M,SV,P; 935 PRINT USING"T[###],O[#],L[##] ";TT%,OC%,DN%;:PRINT CHR$(OV+37);:RETURN 940 LOCATE 0,Y:COLOR 0: PRINT BF$;SPC(240-LEN(BF$));: RETURN 950 LOCATE 0,Y:COLOR 0: PRINT SPC(240); : RETURN 960 Y=CL: GOSUB 950: LOCATE 0,Y:PRINT MG$;: RETURN 970 GOSUB 960:PRINT" Sure (y OR n) ?";:K$=INPUT$(1):RETURN 980 LOCATE 0,Y:FOR I=0 TO 79:PRINT "-";:NEXT: RETURN 1000 '--- Decode MML (BF$,frpm P) 1010 P=P+1 1020 IF BN<P THEN ER=-1: RETURN 1030 C$=MID$(BF$,P,1):PRINT C$; 1040 S=INSTR("RCDEFGAB<>OLT^[]/",C$) 1050 IF S=0 THEN 1010 1060 IF C$="^" THEN ST=1: GOTO 1010 1070 IF S>8 THEN 1280 1080 SS=(S-1)*2: SD%=W%(SS): IF SD%=0 THEN 1010 1090 P=P+1: IF BN<P THEN L=DN%: GOTO 1190 1100 C$=MID$(BF$,P,1) 1110 S=INSTR("#+-",C$):IF S=0 THEN 1145 ELSE PRINT C$; 1120 IF S=3 THEN SS=SS-1 ELSE SS=SS+1 1130 SD%=W%(SS): IF SD%=0 THEN 1010 ELSE P=P+1 1135 '--- Sound length 1140 IF BN<P THEN L=DN%: GOTO 1190 1145 IF C$="." THEN L=DN%+1: P=P+1: print c$;: GOTO 1190 1150 GOSUB 1510: IF S2=0 THEN L=DN%:GOTO 1190 1160 IF BN<P THEN 1190 1170 C$=MID$(BF$,P,1):IF C$="." THEN L=L+1:P=P+1:PRINT C$; 1180 '--- Set T-Count Data 1190 TM%=T%(L): ER=0 1200 '-- Count Data Set 1210 IF SS=0 THEN SD=1 : RETURN 1220 IF OC=3 THEN SD=SD*2: RETURN 1230 IF OC=5 THEN SD=SD/2: RETURN 1240 IF OC=6 THEN SD=SD/4: RETURN 1250 RETURN 1270 '--- Special cmd 1280 ON S-8 GOSUB 1310,1330,1360,1410,1610,,1710,1730,1810 1290 GOTO 1020 1300 '--- cmd "<",">" Sub. 1310 IF OC%>3 THEN OC%=OC%-1 1320 P=P+1:RETURN 1330 IF OC%<6 THEN OC%=OC%+1 1340 P=P+1: RETURN 1350 '-- cmd "O" Sub. 1360 P=P+1: IF BN<P THEN RETURN 1370 C$=MID$(BF$,P,1): N=VAL(C$) 1375 print c$; 1380 IF N>2 AND N<7 THEN OC%=N: P=P+1 1390 RETURN 1400 '--- cmd "L" Sub. 1410 P=P+1: IF BN<P THEN RETURN 1430 GOSUB 1510: DN%=L: RETURN |
1500 '--- Get Note Sub. 1510 C$=MID$(BF$,P,1) 1520 S2=INSTR("31248",C$) :IF S2=0 THEN RETURN 1525 print c$; 1530 IF S2>2 THEN L=VAL(C$): GOTO 1590 1540 P=P+1: IF BN<P THEN L=0:RETURN 1550 C$=MID$(BF$,P,1) 1570 IF S2=1 THEN L=10:print c$;: GOTO 1590 1580 IF S2=2 AND C$="6" THEN L=6: print c$;: ELSE L=0: RETURN 1590 P=P+1: RETURN 1600 '--- cmd "T" Sub. 1610 NN=0 1620 P=P+1: IF BN<P THEN RETURN 1630 C$=MID$(BF$,P,1) 1640 S3=INSTR("1234567890",C$) 1650 IF S3>0 THEN PRINT C$;: NN=VAL(C$)+NN*10: GOTO 1620 1660 TT%=NN 1670 RETURN 1700 '--- Set Repeat "[" 1710 P=P+1:RM=M: RP=P: RETURN 1720 '--- Jump Repeat "]" 1730 IF RP=0 THEN P=P+1: RE=0: RETURN 1740 RE=P+1:' PRINT"]"; 1750 M=RM: P=RP: RP=0 1760 BF$=MM$(G,M):BN=LEN(BF$):GOSUB 910:Y=ML+(M-1)*3:GOSUB 940 1770 LOCATE 0,Y: COLOR 4: IF P=1 THEN RETURN 1780 PRINT LEFT$(BF$,P-1); :RETURN 1800 '--- Break Loop "/" 1810 IF RE=0 THEN P=P+1: RETURN 1820 COLOR 0: PRINT MID$(BF$,P+1,RE-P-1); 1830 P=RE: RE=0: COLOR 4 1840 RETURN 3000 '=== Edit MML === 3100 '--- MML Data Dsp. Sub. 3110 FOR Y=2 TO 11 STEP 3:LOCATE 0,Y:PRINT SPC(240)::NEXT:RETURN 3120 FOR Y=5 TO 11 STEP 3:LOCATE 0,Y:PRINT SPC(240)::NEXT:RETURN 3150 LOCATE 0,ML :'Dsp. 4-MML 3160 FOR I=0 TO 3 3170 IF I<SV THEN BF$=MM$(G,I+1):Y=ML+I*3: GOSUB 940 3180 NEXT: RETURN 3190 Y=ML+(M-1)*3: GOTO 940 :'Dsp.MML Sub. 3200 '--- Cursol Position 3220 X=(P-1)MOD 80: Y=(P-1)/80 :'Cal.Cur.Pos. 3230 LOCATE X,ML+(M-1)*3+Y: RETURN :'Set Cur.Pos. 3240 CX=POS(X): CY=CSRLIN: CP=P:RETURN :'Save Cur.Pos. 3250 LOCATE CX,CY: P=CP: RETURN :'ReSet Cur.Pos. 4000 '--- Cursol Action 4010 ON S GOSUB 4110,4210,4310,4410,4050,4060 4020 GOTO 5080 4050 P=INT((P-1)/80)*80+1: GOTO 3220 4060 P=P+10: IF P=<BN THEN 3220 4070 P=BN+1: IF P>240 THEN P=240 4080 GOTO 3220 4100 '-- right (&H1C)28 4110 IF P<240 AND BN>P THEN P=P+1: GOTO 3220 4120 IF M=SV THEN RETURN ELSE 4430 :'Next M 4200 '-- left (&H1D)29 4210 IF P>1 THEN P=P-1: GOTO 3220 4220 IF M<2 THEN RETURN ELSE 4330 :'Prev. M 4300 '-- up (&H1E)30 4310 IF P>80 THEN P=P-80:GOTO 3220 4320 IF M=1 THEN RETURN 4330 MM$(G,M)=BF$: M=M-1 :'Move M-1 4340 BF$=MM$(G,M): BN=LEN(BF$) 4350 P=BN: GOSUB 3220 4390 RETURN 4400 '--- down (&H1F)31 4410 IF P<160 AND BN>P+80 THEN P=P+80: GOTO 3220 4420 IF M=SV THEN RETURN 4430 MM$(G,M)=BF$: M=M+1 :'Move M+1 4440 BF$=MM$(G,M): BN=LEN(BF$) 4450 P=1 : GOSUB 3220 4480 RETURN 4500 '--- Insert Char. 4510 IF BN+LEN(S$)>240 THEN RETURN 4520 IF P=BN THEN BF$=BF$+S$: GOTO 4580 4530 IF P<2 THEN BF$=S$+BF$: GOTO 4580 4540 BF$=LEFT$(BF$,P-1)+S$+MID$(BF$,P) 4580 P=P+LEN(S$): RETURN 4600 '--- Overwrite Char. 4610 IF BN+LEN(S$)>241 THEN RETURN 4620 IF P=BN THEN BF$=LEFT$(BF$,P-1)+S$:GOTO 4680 4630 IF P<2 THEN BF$=S$+MID$(BF$,2): GOTO 4680 4640 BF$=LEFT$(BF$,P-1)+S$+MID$(BF$,P+1) 4680 P=P+LEN(S$)-1: RETURN 4700 '--- Delete Char. 4710 IF BN=0 THEN RETURN 4720 IF OV THEN GOSUB 4810 ELSE 4760 4730 BN=LEN(BF$): RETURN 4750 '--- MD:=Ins 4760 IF P=1 THEN RETURN 4770 IF P=2 THEN BF$=MID$(BF$,2): P=P-1: RETURN 4780 BF$=LEFT$(BF$,P-2)+MID$(BF$,P):P=P-1:RETURN 4800 '--- MD:=Ovr 4810 IF P>1 THEN GOSUB 4840:P=P-1:RETURN 4820 IF BN=1 THEN BF$="" ELSE BF$=MID$(BF$,2) 4830 RETURN 4840 IF P=BN THEN BF$=LEFT$(BF$,P-1): RETURN 4850 BF$=LEFT$(BF$,P-1)+MID$(BF$,P+1): RETURN 4900 '--- Edit MML Init 4910 K1$="sedrfgyhujik " 4920 K2$=CHR$(13)+")(" 4930 K3$="NVMQW$" 4940 K4$="Z%&" 4950 K5$=CHR$(28)+CHR$(29)+CHR$(30)+CHR$(31) 4960 K6$=K5$+CHR$(12)+"p" 4970 RESTORE 4990 4980 FOR I=1 TO 13: READ NT$(I):NEXT:RETURN 4990 DATA "C","C#","D","D#","E","F","F#","G","G#","A","A#","B","R" 5000 '---Edit MML Main Loop 5010 IF G=0 THEN RETURN ELSE OV=0 5020 SV=V(G):IF SV=0 THEN SV=1:M=1 5040 GOSUB 3110:P=1 :'MML Clear 5050 GOSUB 3150 :'Dsp. 4-MML 5060 BF$=MM$(G,M): BN=LEN(BF$) 5070 MG$="[s-k][C-B]:Note,[VMNQW$Z%&)(]: ?":GOSUB 960 5080 GOSUB 930: GOSUB 920 :'Loop Ent. 5090 GOSUB 3220: BN=LEN(BF$) :'Set Cur. 5100 '--- 5110 COLOR 0: S$=INPUT$(1) 5120 IF S$="X" THEN 5310 5130 IF S$=CHR$(8) THEN GOSUB 4710: GOTO 5220 :'Delete 5140 S=INSTR(K1$,S$): IF S>0 THEN S$=NT$(S):GOTO 5210 :'Note 5150 S=INSTR(K2$,S$): IF S>0 THEN 5510 :'Play 5160 S=INSTR(K3$,S$): IF S>0 THEN 6010 :'Cmd 5170 S=INSTR(K4$,S$): IF S>0 THEN 5710 :'Mode 5180 S=INSTR(K6$,S$): IF S>0 THEN 4010 :'Cursol 5190 IF S$>="a" AND S$=<"z" THEN 5110 5200 '-- Set MML 5210 IF OV THEN GOSUB 4610 ELSE GOSUB 4510 5220 MM$(G,M)=BF$: BN=LEN(BF$) 5230 GOSUB 3190 5250 GOTO 5080 5300 '--- MML Check 5310 IF SV=0 THEN RETURN ELSE ER=0 5320 FOR I=1 TO SV 5330 S=INSTR("RCDEFGAB<>OLT^[]/",LEFT$(BF$,1)) 5340 IF S=0 THEN ER=9: GOTO 5370 5350 NEXT 5360 RETURN 5370 MG$="Not MML Comand! at "+HEX$(I)+" ! END": GOSUB 970 5380 IF K$="y" THEN RETURN ELSE 5070 5500 '--- Test Play 5510 IF SV=0 THEN 5110 5520 ON S GOSUB 720,710,5550 5530 GOTO 5050 5540 ' 5550 IF M=0 THEN RETURN 5560 M=1: GOTO 710 |
5700 '-- Mode "Z%&" 5710 ON S GOSUB 5730,5740,5750 5720 GOTO 5070 5730 OV = OV XOR 1: RETURN 5740 OV = 0: RETURN 5750 OV = 1: RETURN 6000 '-- Cmd Action "NVMQW$" 6010 ON S GOSUB 6110,6210,6320,6410,8010,7110, 6020 V(G)=SV 6030 GOTO 5020 6100 '-- N cmd 6110 MG$="Add(Ins) New MML":GOSUB 970: IF NOT(K$="y") THEN RETURN 6120 IF SV>3 THEN RETURN 6130 IF M=SV THEN 6150 6140 FOR I=SV TO M+1 STEP -1: MM$(G,I+1)=MM$(G,I): NEXT 6150 M=M+1: MM$(G,M)="": SV=SV+1: RETURN 6200 '--- V cmd 6210 MG$="Sepalate MML":GOSUB 970: IF NOT(K$="y") THEN RETURN 6220 IF SV>3 THEN RETURN 6230 FOR I=SV TO M+1 STEP -1: MM$(G,I+1)=MM$(G,I): NEXT 6240 MM$(G,M+1)=MID$(MM$(G,M),P) 6250 MM$(G,M)=LEFT$(MM$(G,M),P-1) 6280 SV=SV+1: RETURN 6300 '--- M CMD 6310 MG$="Merge MML":GOSUB 970: IF NOT(K$="y") THEN RETURN 6320 IF M=SV THEN RETURN 6330 IF BN+LEN(MM$(G,M+1))>240 THEN RETURN 6340 MM$(G,M)=MM$(G,M)+MM$(G,M+1) 6350 IF M+1=SV THEN 6390 6360 FOR I=M+1 TO SV-1: MM$(G,I)=MM$(G,I+1): NEXT 6390 SV=SV-1: RETURN 6400 '--- Q cmd 6410 MG$="Erase MML":GOSUB 970: IF NOT(K$="y") THEN RETURN 6420 MM$(G,M)="" 6430 IF M=SV THEN M=M-1: GOTO 6490 6440 FOR I=M TO SV-1: MM$(G,I)=MM$(G,I+1): NEXT 6490 SV=SV-1: RETURN 7000 '--- Load MML 7010 IF G=0 THEN RETURN 7020 LOCATE 0,ML: GOSUB 10050 7030 MG$="0:Load File, [1-9]:Demo Load ?": GOSUB 960 7040 K$=INPUT$(1): IF k$="0" THEN 7110 7050 S=INSTR("123456789",K$): IF S=0 THEN RETURN 7060 MG$="Load Demo"+hex$(S):GOSUB 970 7070 IF NOT(K$="y") THEN RETURN 7080 GOSUB 10010: RETURN 7100 '--- Load file 7110 MG$="Load File":GOSUB 970 7120 IF NOT(K$="y") THEN RETURN 7130 PRINT "-- Loading --"; 7140 INPUT#-1,SV,N$: V(G)=SV: NA$(G)=N$ 7150 FOR I=1 TO SV: INPUT#-1,MM$(G,I):NEXT 7160 RETURN 8000 '--- Save MML 8010 IF G=0 OR SV=0 THEN RETURN 8020 MG$="Save File as ["+NA$(G)+"] (y OR n OR c:Chang Name) ":GOSUB 960 8030 K$=Input$(1) 8040 IF K$="y" THEN 8110 8050 IF K$="c" THEN 8150 8060 RETURN 8110 PRINT "-- Saving --"; 8120 PRINT#-1,V(G),NA$(G) 8130 FOR I=1 TO V(G): PRINT#-1,MM$(G,I):NEXT 8140 RETURN 8150 LOCATE 0,CL+1: PRINT NA$(G); 8160 LOCATE 0,CL+1: LINE INPUT NA$(G) 8170 IF LEN(NA$(G))>20 THEN NA$(G)=LEFT$(NA$(G),20) 8180 GOTO 8020 9000 '=== Mashin & Sound Data Init. === 9010 RESTORE 9030: A=&HE800 9020 FOR I=0 TO 80: READ B: POKE A+I,B: NEXT: RETURN 9030 '--- Sound Init. *S_INI: $E800H 9040 DATA &H3E,&H36 :'E800 LD A,00110110B ;Mode3 9050 DATA &HD3,&H0F :'E802 OUT (0FH),A ;Ch0 9060 DATA &H3E,&H76 :'E804 LD A,01110110B 9070 DATA &HD3,&H0F :'E806 OUT (0FH),A ;Ch1 9080 DATA &H3E,&HB6 :'E808 LD A,10110110B 9090 DATA &HD3,&H0F :'E80A OUT (0FH),A ;Ch2 9100 DATA &H3E,&H01 :'E80C LD A,01H 9110 DATA &HD3,&H0C :'E80E OUT (0CH),A ;Ch0 9120 DATA &HD3,&H0C :'E810 OUT (0CH),A 9130 DATA &HD3,&H0D :'E812 OUT (0DH),A ;Ch1 9140 DATA &HD3,&H0D :'E814 OUT (0DH),A 9150 DATA &HD3,&H0E :'E816 OUT (0EH),A ;Ch2 9160 DATA &HD3,&H0E :'E818 OUT (0EH),A 9170 '--- Sound Off *S_OFF: $E808H 9180 DATA &H3E,&H00 :'E81A LD A,00000000B 9190 DATA &HD3,&H02 :'E81C OUT (02H),A 9200 DATA &HC9 :'E81E RET 9210 DATA 0 :'E81F DB 0 9220 '--- Play Sub. (OUTI) $E820 9230 DATA &H0E,&H0C :'E820 LD C,0CH ;<-Ch0 9240 DATA &H18,&H06 :'E822 JR E02A (+6) 9250 DATA &H0E,&H0D :'E824 LD C,0DH ;<-Ch1 9260 DATA &H18,&H02 :'E826 JR E02A (+2) 9270 DATA &H0E,&H0E :'E828 LD C,0EH ;%lt-Ch2 9280 DATA &HFE,&H02 :'E82A CP 02H 9290 DATA &HC0 :'E82C RET NZ 9300 DATA &HED,&HA3 :'E82D OUTI ;(HL)->(C),HL=HL+1 9310 DATA &HED,&HA3 :'E82F OUTI ;(HL)->(C),HL=HL+1 9320 '--- Sound On *S_ON: $E031 9330 DATA &H3E,&HC8 :'E831 LD A,11001000B 9340 DATA &HD3,&H02 :'E833 OUT (02H),A 9350 DATA &HC9 :'E835 RET 9360 DATA 0 :'E836 DB 0 9370 '--- Copy Char2PCG *CP_CHR $E837 9380 DATA &H21,&H00,&H00 :'E837 LD HL,0000H 9385 DATA &H01,&H00,&H04 :'E83A LD BC,0400H 9390 DATA &H7D :'E83D LD A,L 9395 DATA &HD3,&H01 :'E83E OUT (01H),A 9400 DATA &H7C :'E840 LD A,H 9405 DATA &HF6,&H30 :'E841 OR 30H 9410 DATA &HD3,&H02 :'E843 OUT (02H),A 9415 DATA &HE6,&HCF :'E845 AND 0CFH 9420 DATA &HD3,&H02 :'E847 OUT (02H),A 9425 DATA &H23 :'E849 INC HL 9430 DATA &H10,&HF1 :'E84A DJNZ 0E03CH 9435 DATA &H0D :'E84C DEC C 9440 DATA &H20,&HEE :'E84D JR NZ,0E03CH 9445 DATA &HC9 :'E84F RET 9450 DATA 0 :'E850 DB 0 9500 '--- Sound Generate Data n = 3993600/f 9510 RESTORE 9530 9520 FOR I=0 TO 15: READ W%(I),M$(I): NEXT: RETURN 9530 DATA 1 ,R :' rest 9540 DATA 0 ,B3 :' 9550 DATA 15264 ,C4 :' 261.63 Hz (3BA0H) 9560 DATA 14408 ,C#4:' 277.18 Hz (3848H) 9570 DATA 13599 ,D4 :' 293.66 Hz (351FH) 9580 DATA 12836 ,D#4:' 311.13 Hz (3224H) 9590 DATA 12115 ,E4 :' 329.63 Hz (2F53H) 9600 DATA 0 ,E#?:' 9610 DATA 11435 ,F4 :' 349.23 Hz (2CABH) 9620 DATA 10794 ,F#4:' 369.99 Hz (2A2AH) 9630 DATA 10188 ,G4 :' 392.00 Hz (27CCH) 9640 DATA 9616 ,G#4:' 415.30 Hz (2590H) 9650 DATA 9076 ,A4 :' 440.00 Hz (2374H) 9660 DATA 8567 ,A#4:' 466.16 Hz (2177H) 9670 DATA 8086 ,B4 :' 493.88 Hz (1F96H) 9680 DATA 0 ,C5 :' 523.25 Hz (1DD0H) 9700 '--- Time Delay 9710 RESTORE 9730 9720 FOR I=0 TO 11: READ T%(I): NEXT: RETURN 9730 DATA 24000,24000 :'1 9740 DATA 12000,18000 :'2 9750 DATA 6000, 9000 :'4 9760 DATA 1100, 1650 :'16 9770 DATA 3000, 4500 :'8 9780 DATA 400, 600 :'32 |
10000 '=== MML Sample Data === 10010 IF G<1 OR G>9 THEN RETURN 10020 ON G GOSUB 10100,10200,10300,10400,10500,10600,10700,10800,10900 10030 READ N$,SV: NA$(G)=N$: V(G)=SV 10040 FOR I=1 TO SV: READ MM$(G,I): NEXT: RETURN 10050 FOR I=1 TO 9 10060 ON I GOSUB 10100,10200,10300,10400,10500,10600,10700,10800,10900 10070 READ N$: PRINT HEX$(I);":";N$;SPC(20-LEN(N$)); 10080 AM=I MOD 3: IF AM=0 THEN PRINT ELSE PRINT TAB(AM*26); 10090 NEXT: RETURN 10100 RESTORE 10110 : RETURN 10110 DATA "シキノウタ",1 10120 DATA "T120L8!O4B4BAGAGF#E4E4E2!>C4C<BAGA>C<B1!>C4C<BA4A>C<B4BGE2!F#4B4AGF#GE1" 10200 RESTORE 10210 : RETURN 10210 DATA "サクラ サクラ",1 10220 DATA "T060L4!O4[AAB2]!AB>C<BAB8A8F2!ECEFEE8C8<B2>AB>C<BAB8A8F2!ECEFEE8C8<B2!>AAB2!AAB2!EFB8A8FE1" 10300 RESTORE 10310 : RETURN 10310 DATA "エーデルワイス",2 10320 DATA "T096L4!O4E2G>D2.!C2<GF2R!E2EEFGA2.G2R!E2G>D2.C2<GF2R!E2GGAB>C2.C2R!" 10330 DATA "D<G8GBAGE2G>C2R!<A2>CD2C<B2.G2R!E2G>D2.C2<GF2R!E2GGAB>C2.C2R" 10400 RESTORE 10410 : RETURN 10410 DATA "イエスタディ",2 10420 DATA "T100[L8!O4GFF2.R4!AB>C+DEFE4.DD2R!DDC<B-AGB-4.!L4A8AGFAGDFA8A8^A2]!" 10430 DATA "A2A2>DEFE8D8E.D8CD<A1!A2A2>DEFE8D8E.D8CEFC<B-AG8F8F2." 10500 RESTORE 10510 : RETURN 10510 DATA "セイヤ(キヨシコノヨル)",2 10520 DATA "T088L4!O5G.A8GE2.R8!G.A8GE2R!>D2D<B2.!>C2C<G2R!A2A>C.<B8AG.A8GE2R!" 10530 DATA "A2A>C.<B8AG.A8GE2R!>D2DF.D8<B>C2.E2R!C<GEG.F8DC2.^C2R" 10600 RESTORE 10610 : RETURN 10610 DATA "セトノ ハナヨメ",3 10620 DATA "T090L8!O4EFG2^GGAEG2R4!>CDE4.ED4C4<B2R!AB>C4.C<B4A4G2R!FED4.DB4A4G2R!EFGG4.^GGAEG2R!" 10630 DATA ">CDE4.ED4C4<B2R!AB>C4.C<B4A4G2R!G>CED2C4<B4>C2.R!<AEEE^EEA>C<B2.R!BEEE^EEB>DC2.R!" 10640 DATA "C<AAA^AA>DC<G2R!FED4D4E4D4C2R!EFG2^GGAEG2R!>CDE4.ED4C4<B2R!AB>C4.C<B4A4G2R!G>CED2C4<B4>C1" 10700 RESTORE 10710 : RETURN 10710 DATA "シレトコ リョジョウ",2 10720 DATA "T120L4!O4CF2A>C2FFDFC2.<AB-AG2>C<AGAF2!CF2A>C2FFDFC2^C<AB-AG2>C<C2GF2.!" 10730 DATA "GGGGFGA2>C^C2.!DDDD<B-4.>D8F2.^F2.!GFDC2F<A2>DC2.!<AB-AGCGF2.^F2." 10800 RESTORE 10810 : RETURN 10810 DATA "ビワコ シュウコウノウタ",2 10820 DATA "T120L8!O4FB-4B-B-^AG>D4.D!D^F4^DD^C<B->C4.^CR4!<FB-4B-B-^AG>D4.D4D<F4.G4L16A^B-L8^B-4.^B-RR!" 10830 DATA "O4F4F>F4FD4C<B-4.!B-4B->C4L16C^DL8^F4.^F4FG4FD^C<B->C4^<B-G4.F4FG4L16^A^B-B-4.^B-8" 10900 RESTORE 10910 :RETURN 10910 DATA "セカイニ ヒトツダケノ ハナ",4 10920 DATA "T099L16!O4A8AA8.>E8E8.D8.C#8<B8^B4>C#^C#8D8C#C#<B^B4!A8AB8.>C#8C#8<BB8.A>C#4<B8A8A1R!" 10930 DATA "[R8E8A8AA8.A8A8AA8.A8B8.B8.>C#8C#4R!<A8AA8.>E8E8.D8.C#8<B8.F#8.A8G#4R!E8A8AA8.A8A8AA8AA8B8.B8.>C#8.C#4R!<A8AA8.>E8E8.D8.C#8C#8.<B8.A8A4R!E8A8AA8.A8A8AA8.AAB8BB8>C#8C#8C#4R!<A8AA8.>E8E8.D8.C#8<B8BF#8.A8G#4R!" 10950 DATA "E8A8AA8.A8A4A8A8B8.B8.>C#8C#4R!<A8.A8.>E8E8.D8.C#8C#8.<B8.BA8A4R!B8BB8.B8B8.B8.>C#8C#8.<B^B8A8A4R!B8BB8.B8B8.>C#8.C#8D8DC#8.<BAA4R!B8BB8.B8B8BB>C#C#DDD8DC#8.<B8B4R!A8B8BB8.>F#8F#C#8.<BAB1!" 10970 DATA "B8.>C#C#8D8C#4<BA8.A8AA8>E8E8.D8.C#8<B8.>C#8.8D8C#4<BA8.!A8AA8.R!F#8A8AA8.B8>C#4<BA8.!A8AA8.>E8E8.D8.C#8<B8B>C#8.D8C#4<BA8.!A8AA8.>C#8C#8.<B8.A8/A8AG#8.A8A4]!O5C#4<B8A8A4R!" |