2022.5.28
前回のプログラムで「MML解析プログラムの骨格」ができました。今回はオクターブ変更の処理を追加してみます。
早速、いつも通りルールの話になりますが、鍵盤中央付近のドに相当するノート番号は60となっています。では1オクターブ上下するとノート番号はどうなるでしょうか?MIDIのノート番号一覧を見ればすぐわかりますが、ドからシまでの鍵盤を数えると12鍵(白鍵・黒鍵含めて)あります。と言うことは1オクターブは現在値から12ズレれば良いことが分かります。そのため1オクターブの処理はノート番号に12を加減算すればいいことになりますね。現状ではドを発音するとノート番号は60です。1オクターブ上げた時に72にしたいのですが、これ結構簡単で、ノート番号変換用に用意した配列の値をこのように変更します。
LET[65],9,11,0,2,4,5,7
この配列を使って「ド」を変換すると「0」になります。そこにオクターブ用の変数「O」を用意して、先ほど取得した「0」と加算します。
N=[67]+O
もし変数Oが60だったら変数Nは60になりますよね。変数Oを12ずつ変更すればオクターブ処理は完了です。低音から高音までこの数式だけで完結します。では、前回のプログラムでコメントだけ書き込んでいた80行をこのように変更します。
80 O=O+((M==62)-(M==60))*12
IchigoJamのMMLとオクターブの上げ下げ記号が逆ですが、自分が最初に触ったMMLはこちらだったのでそのようにします。たったこれだけで、MMLに「'>'が見つかったらオクターブを上げる、'<'が見つかったらオクターブを下げる」の処理が完成しました。が・・・発音する部分にオクターブを反映しなければいけません。
160 ? CHR$(#90,N+O,127)・・・鍵盤を押す
170 WAIT 60・・・待つ
180 ? CHR$(#80,N+O,127)・・・鍵盤を離す
これでドレミファソラシの音階に相当する変数Nにオクターブ情報の変数Oを加算したものがノート番号として送信されます。
今回はここまで。
前回言ったように「骨格」はできているので、このような単純な変更だけで機能追加ができました。
もちろん追加機能によっては、複雑な場合もありますが、肝となる規則をしっかり理解して、その通り作れば後で楽できる証拠です。
次回の音長は複雑です・・・
