Vol.794 24.Apr.2020

USBハブ付きカードリーダー EXCELの(V/H)LOOKUP関数 PasoconMiniPC8001(11)〜MML楽譜エディッタ

C USBハブ付きカードリーダー

by fjk

 Raspberry-Pi_Zeroやスマホ、タブレットパソコンには汎用USBポートが一つしか使えない物が多い。そこで、SD リーダーとLANアダプタ、マウスやキーボードなど複数のUSB機器を接続するにはUSBハブを使っているが、チョット立ち寄ったパソコンショップで3個のUSB2.0ハブと(micro)SDカードリーダーを同時に使えるMRS-MBH10(エレコム製、\1,000)を見つけ、入手した。USBポートが少ないマシンには、コンパクトで持ち運びにも便利なので、これがベストチョイス。

MRS-MBH


E EXCELの(V/H)LOOKUP関数

by fjk

 Excelでデータを検索し、一致した場合に関連付けされたデータを取り出したい時があります。こんな時にはLOOKUP関数またはVLOOKUP関数、HLOOKUP関数が使える。しかし、表の形式に左右されないLOOKUP関数を使った場合、思惑と異なる結果やエラーで出ることがあります。
 これは、LOOKUP関数には以下の欠点がある、

@ データの完全一致ができない
A「検査範囲」のデータは昇順(小さい順)に並んでいなければならない。

 VLOOKUP/HLOOKUP関数では、4番目の引数で「FALSE」を指定すると、データが完全に一致したものだけを取り出すことができるが、LOOKUP関数で完全一致しない場合はエラーを表示するのではなく、近似値で一致したデータを取り出してくる。また、検査範囲データが順不同の場合はLOOKUP関数が使えないので、VLOOKUP/HLOOKUP関数を使うしかない。

LOOKUP(検査値,検査範囲,対応範囲)
 検査値: 検索する値(一致させたい場所のセル参照や値、文字列)を指定
 検査範囲: 上の「検査値」で検索する1行または1列を指定
 対応範囲:検索結果に表示する1行または1列を指定
 
VLOOKUP/HLOOKUP(検索値,範囲,列番号[,検索の型])
 検索値: 検索する値(一致させたい場所のセル参照や値、文字列)を指定
 範 囲: 検索する(一致させる)相手のデータ全体を指定
 列番号: 「範囲」で指定したデータの「検索値」を一致させる左から何番目の列
 検索の型: 完全一致させたい場合は「FALSE」、近似値で一致させたい場合は「TRUE」を入力。
省略した場合は「TRUE」になる。(FALSEは「0」、TRUEは「1」でも可)


P PasoconMiniPC8001(11) 〜MML楽譜エディッタ

by fjk

 前報(abc793)でBASICによるMML演奏ができたので、MML演奏データを作成するエディッタを作成した。基本的にはabc792とabc793を併せたもので、鍵盤(キーボード)からのMMLデータ入力・修正、任意の場所からの試し演奏や、ファイルの入出力などを追加した。

  • 1つのMML文字列は最大240文字で、1曲で最大4つの文字列(240×4=960文字)が使える。しかし、プログラムはほぼフルメモリに近い状態で使っているので、大きなデータをフルで作成すると"Out of string space"エラーが出る可能性があります。この場合、使用する曲の数を減らして下さい。
  • データに変更や追加があっても、未保存の警告が出ないので注意!
  • 機能を欲張ったので、テストが(時間的に)行き届かず、まだバグや無駄があるかもしれない。作成されたデータが無くなっても責任は一切負いません。
1.起動画面
・使用する曲番号(1−9)を選ぶ(0は選択クリア)
・編集(E)、読込(L)、書込(S)などを選ぶ
  (デモデータは"L"入力後、表示されるリストで選択)
・演奏(CR)を押すと、選択されている曲を演奏する(途中での中断はSpaceキー)
・"!"を押すと、確認後、終了する。
起動画面
2.編 集
【鍵盤入力モード】(鍵盤の配置は以下の通り)
・編集画面ではデモデータは読み込めない。
・鍵盤になる英小文字はMML音符に変換され入力(反応が遅いのでゆっくりと・・)
・英大文字、数字、記号の予約文字以外はそのまま入力
・入力文字はカーソル前に挿入(%)/カーソル位置に上書(&)。編集時1行目に現在モードを表示
・カーソルキーでMMLデータ上を移動できる。"Home"は行頭へ、"p"は10文字右へ(skiP)移動
鍵盤(キーボード)の配置
3.試し演奏(演奏を中断する場合はSPACEキー) 
@【CR】カーソルのある場所から演奏
A【)】現在カーソルのあるMML文字列データの先頭から演奏
B【(】曲の最初から演奏
   ※途中演奏はオクターブが異なることもあるので、TOLコマンドを挿入し、実行するのが良い。
4.ファイル保存【W】(起動画面では”S“)
「曲名入力」(20文字まで)、「確認」後、曲の全MML文字列データを書き込む。
(曲名変更後、保存をキャンセルすると、曲名のみ変更される)
   ※新規にファイルを作成し、MEDIAのATTRはアペンドモードにしておくこと。
5.ファイル読込【$】(起動画面では”L“)
@【1−9】 デモデータを読み込む(編集画面時は表示されない)
A【0】読込確認後、曲の全MML文字列データを読み込む
   ※MEDIAのPOSITIONを0%にしておくこと。
6.新規(挿入・追加)【N】 (前挿入はVコマンドをデータの先頭で利用)
現在カーソルのあるMML文字列データの後に空のMML文字列データを挿入・追加する。
(ただし、追加後のMML文字列データ数が4を超える場合、追加は実施されない)
7.分 割【V】
現在カーソルの位置でMML文字列データを分割し、カーソル以後は新MML文字列データとなる。
(ただし、分割後のMML文字列データ数が4を超える場合、分割は実施されない)
8.結 合【M】
現在カーソルのあるデータと次のデータを結合し1つのデータとする。
(ただし、結合後の文字数が240文字を超える場合、結合は実施されない)
9.消 去【Q】(起動画面では”N“)
現在カーソルのあるMMLデータを消去し、後ろのデータを詰める。
(起動画面では曲の全MMLデータを消去する)
疑似鍵盤(シールで目印) MML編集(演奏)画面
emml.cmt(zip)
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!"


USBハブ付きカードリーダー EXCELの(V/H)LOOKUP関数 PasoconMiniPC8001(11)〜MML楽譜エディッタ