2022.5.26
前回はプログラムで音を出すことができました。
しかし音を1つ出すだけで3行のプログラムになるので、1曲プログラムするのは大変です。そこでMMLによる音符入力にチャレンジします。
MMLはプログラムのように文字や記号を使って音符を表現するためのもので、IchigoJamにも搭載されていますがMIDIでは使えません。それはIchigoJamのブザー専用命令だからです。そのため・・・
MML解読プログラムを作ります
この段階で話がそれてしまいますが、コンピューターやプログラムなんてそんなものです。「あれやりたい、これやりたい」と思ったら、そのためのプログラムを作る時が必ず来ます。最近ではライブラリやフレームワークを使うと思いますが、結局のところ誰かが作っているわけですね。
ここから先はいろんな知識が必要となりますが、なんとなーくの説明をして、なんとなーくわかっていれば大丈夫。
MML解読プログラムを作るのでMMLを知る必要があります。初心に帰りましょう。以前、道具を使うためには道具を知る必要があることをお話ししました。その時がやってきましたね。
MMLはA~Gで音程、Rで休符、数値で音の長さ、<>でオクターブなどなど、いくつかのルールがあります。自分でプログラムを作るのでルールも自分で決められます。そこである程度制限をしてプログラムの製作を楽にしましょう。こんなルールにしてみました。
- 音程はABCDEFGのみ、小文字は使わない
- 半音上げ下げは音程の直後に指定する。C+、E-など
- 音の長さは数値2桁とする、1は全音符、2は2分音符、16は16分音符
- 音の長さは音程の直後に指定するC4、C+4
- 音の長さが未指定の場合4分音符とする
- 付点は音の長さの直後に指定する、音の長さを省略することはできない。C4.はOK、C.はNG
- Rは休符とする
- >でオクターブ上げる、<でオクターブを下げる、オクターブの直接指定はできない。
なんか難しそうに見えますが、これがプログラムを作る基本です。いきなりパソコンに向かってプログラムを作りません。プログラム作成前に必ずルールを決めて、どこかに記録しておくことをおすすめします。簡単なモノや小規模なモノであれば、頭の中だけで処理できますが、後々プログラムを見た時に何をやっているか理解できない恐れがありますよ。
これをどうやってプログラムとして表現するかが腕の見せ所ですが、自分はプログラムが下手で無理やりねじ込む作り方なので、たぶん参考になりません。
さて、決めたルールから何らかの規則性か最低限やりたいことを探します。
まず音程がA~Gなのは規則性があるし音を出すのが最低限の目標なので、とても重要な部分ですね。
細かいことを抜きに考えると「Cはド」で、MIDIでは中央のドが60。つまりCを60に変換するプログラムが必要であることが分かります。
例えば・・・
IF MML=="C" THEN 60を送信
IF MML=="D" THEN 62を送信
IF MML=="E" THEN 64を送信
みたいな方法が考えられます。しかし、なんか効率が悪そうです。音はA~Gつまり「ABCDEFG」と規則性があります。この規則をうまく活用しましょう。
キャラクターコードを見ると「Aは65」「Bは66」「Cは67」と順番に増えていきますが、MIDI信号は残念なことに「ミ(64)とファ(65)」の差は1の差、それ以外は黒鍵があるので差が2となっています。なので、MMLとMIDI(鍵盤)の規則は異なることが分かりました。そこで便利な配列を使ってみましょう。
「E(ミ)の時は64」、「F(ファ)の時は65」、「G(ソ)の時は67」
このように配列を作れば、A~Gの規則性があればなんとかなります。
LET [65],69,71,60,62,64,65,67
キャラクターコード65はA、つまり「ラ」なので69、キャラクターコード66はBで「シ」なので71、次はCで「ド」なので60となっています。これで配列番号にキャラクターコードを入れれば、MIDIの音程に相当する数値を取得できます。
長くなったので、今回はここまで。もう電子楽器ではなくプログラムの話に脱線していますが、しばらくすると楽器制御に到着します。
この辺でだんだん分かってくると思いまが、プログラムは教えてもらうものではなくて、自分で考えなければいけません。
だから「プログラムで何ができる?」と言った質問の答えは自分次第です。教えてもらった通りにプログラムを作って、その通りに動くのは当たり前。その感覚がつかめれば、プログラム(道具)を使いこなせるので、できることが増えて、ますます楽しくなりますよ。
