NEWS

IchigoJamで電子楽器を操作#5(MML解読プログラムを作るに脱線)

2022.5.26

前回から脱線してMMLプログラムを作る事となり、配列に音程を入れるところまで行きました。
では配列に入っている音符を1つずつ取り出すにはどうしたらいいでしょうか?
IchigoJamでは文字と数値の管理方法が異なっていて、文字の場合はメモリアドレスが記憶されます。

10 A=1
20 ? A
30 A="A"
40 ? A

RUN
1
3094
OK

(今回からPRINTを?で表記することとします)
このプログラムを実行すると、20行では画面に1が表示され、40行では3094が表示されるので、違いが判ると思います。
文字の場合は「メモリのココから文字が保存されてるよ」と教えてくれるので、この数値を順番に眺めていけば、文字を1文字ずつ取得することが可能です。メモリの場所を示す数値の事をアドレスと言って、このアドレスに入っている値を見る時はPEEK命令を使って読み込みます。例えば上の例を使うと・・・

10 A="A"
20 ? PEEK(A)
RUN
65
OK

こうすることで、Aのキャラクターコードである65が表示されるはずです。文字が連続している場合は、次のアドレスを見ればいいので、以下のようになります。

10 A="ABC"
20 ? PEEK(A)
30 ? PEEK(A+1)
40 ? PEEK(A+2)
65
66
67
RUN

変数Aに入っているA,B,Cのキャラクターコード65,66,67を順番に読み込むことができましたが、今回は配列を使うので・・・

10 [0]="ABCDEFG"
20 ? PEEK([0])
30 ? PEEK([0]+1)
40 ? PEEK([0]+2)

このようになります。
前回は配列番号65~71にMIDIの音程に相当する番号を入れました。この番号をこれ以降ノート番号と言います。配列番号はキャラクターコードになっているため、今回1文字ずつ取得したキャラクターコードを使えば簡単にノート番号を取得できるようになります。

10 [0]="ABC"
20 LET [65],69,71,60,62,64,65,67
30 M=PEEK([0]):? [M]
40 M=PEEK([0]+1):? [M]
50 M=PEEK([0]+2):? [M]
RUN
69
71
60
OK

どうでしょう、69 71 60が表示されたのではないでしょうか?これでアルファベットがノート番号に変換できました。
変数Mを使って、いったん文字のキャラクターコードを取得してから、ノート番号に変更していますが、IchigoJamの制限から? [PEEK([0])]と1回で記述することはできないようです。
次に最後の文字を知る必要がありますね。これは簡単で、文字列の最後は必ずダブルクォーテーションの34と空白の0になります。まずは配列を使わず簡単なプログラムで確認してみましょう。

10 A="A"
20 ? PEEK(A)
30 ? PEEK(A+1)
40 ? PEEK(A+2)
RUN
65
34
0
OK

登録した文字はAの1文字しかありませんが、このように文字の終わりを意味するキャラクターコードが自動的に記録されています。今回は分かりやすく最後の文字は0としておきます
ここまで規則が分かってしまえば、その規則に従ってプログラムを作るだけです。

10 [0]="CDEFGAB"
20 LET [65],69,71,60,62,64,65,67
30 A=0
40 M=PEEK([0]+A)
50 IF M==0 END
60 N=[M]
70 PRINT N
80 A=A+1:GOTO 40

最後にキャラクターコード34があるので、直す必要があるとしても、このプログラムを実行するとCDEFGABに応じたノート番号が表示されるはずです。急にプログラムが長くなって頭が痛くなっているかもしれませんが、今までの復習みたいなものです。
プログラム的には40行~80行を繰り返しています。文字列の最後は必ず0になるルールから、50行でMが0の時は終了するようにしました。
変数にA、M、Nを追加しましたが、それぞれ・・・

Aはアドレス、MはMML、Nはノート番号

このように意味を持たせています。IchigoJamの変数名は1文字しか使えないので、少々苦労しますが、このように意味を持たせておくと、分かりやすくなりますし、どこかに書いておくといいですね。

さて、この辺で休憩しましょう。まだまだ続きますわよ。

次へ(IchigoJamで電子楽器を操作#6)