ゲームミュージックのための

MMLプログラミング入門

(その2)



さあ、MMLを使って曲を書いてみよう

・MMLの基本は譜面だ
この記事を読んでいるヒトなら、すでにおなじみかもしれないけれど、MUSIC LALFのようなMML系の音楽言語で曲を演奏するには、まず、図1.のようなソースプログラムを書いて、曲をコンピュータが読める形で表現する必要がある。これだけみると、なんにもしらないヒトは、何かとてつもなく難しいことをしなくてはいけないように見えるかもしれない。しかし、「ものを書き表す」というのは、得てしてこういうモノだ。
たとえば、"This is a pen"という英語の文章があったとしよう。もし、アルファベットを全くしらないヒトがこれをみたら、一体何が書いてあるのか、皆目見当がつかないだろう。スゴくむづかしいことが書いてあると思うかもしれないよね。でも、ちょっとでも英語の勉強をした中学1年生なら、もう、これが教科書の最初に出てくるような、ごくごく簡単な文章だって、すぐわかるはずだ。MMLは、一見とっつきにくいけど、中に書いてあることは、それこそコトバで言えば、"This is a pen"みたいなレベルのことしか出てこない。だから、基本さえ押えてしまえば、理解するのは簡単なんだ。
その秘訣は「五線譜」にある。学校の音楽の授業を思い出してほしい。音楽の教科書では、曲を書き表すのには「譜面」を使っていたよね。実は、MMLのソースプログラムというのは、基本的には譜面そのものなんだ。これがさえわかれば、もうMMLは恐くない。では、どうやると「五線譜」が、MMLのソースに変わってしまうのだろうか。
そのカギは、「音名」にひそんでいる。各音程にはド、レ、ミ、といった名前がついている。これは、英語では「ド→c」、「レ→d」というようにアルファベットであらわされる。「ドレミファソラシド」は、「cdefgab」とあらわされる。ギターを奏くヒトだったら、「G7」とか、「Dm7」とか、コードネームとして、この英語式の音名の呼び方を使っているので、おなじみかもしれない。この、英語式のアルファベットで各音名を書くやり方で、メロディーを書いていく、これが、MMLのソースプログラムの書き方の基本なんだ。こう考えると、ぐっと身近に感じられるよね。
さあ、図2.のようにインプットしてみよう。この行が"A"から始まっているのは、FM音源のチャンネルでこのメロディーを鳴らす、という意味だけど、音源の使いこなしについては次回書く予定なので、今回はこういうモノだ、と思って見て欲しい。さて、この通りインプットしてplayすると、cdefgfedc、つまり、ドレミファソファミレド、と鳴るはずだ。入力するときには、音名が小文字の点だけは注意して欲しい。鳴ればもうこっちのもの。あとは、これをより細かくしていけばいいんだ。ふつうの楽器は、最初に音を鳴らすまでの練習が大変なんだから、こんなにすぐ鳴ってくれるパソコンの音源は、楽器として考えればほんとにとっつきやすいよね。
さて、これだと、ただ鳴っているだけみたいで、なんか変な感じだよね。それもそのはず、このメロディーにはリズムがない。それぞれの音符には、4分音符とか、8分音符とか、音程だけじゃなくて、音の長さもあったよね。これをインプットしなくては、譜面通りには鳴ってくれない。じゃ、これはどうするか。ところがMMLでは、これも譜面通りなんだ。つまり、cとかdとかいう音名のあとに、「何分音符」の何に相当する数字をつけてやれば、その長さで鳴ってくれる。つまり、c8は8分音符のC、g16は16分音符のG、という感じだ。附点音符なら、文字通りc4.というように、ピリオドを使って、附点にする。全音符はc1というように1であらわすんだ。さあ、これでメロディーが自由に書けるようになった。
「A c4.d16e16 f8e8d8c8 d4d8c8 e2」とインプットしてみよう。これをplayすると、図3.の音符のように演奏されるはずだ。さあ、音楽らしくなってきたよね。しかし、譜面を書き表すには、あと一つ大切なものがある。そう、休符だ。しかし、メロディーの書き方がわかったら、休符を書くのはいたって簡単。なんせ、音名のcとかdとかの代わりに、rを使えばいいというだけなのだから。つまり、4分休符なら、r4というワケ。これなら、簡単だね。
ここまでくれば、もう一通りの譜面はMMLで書けるはずだ。MUSIC LALFは、パソコンの内蔵音源をターゲットとしているけれど、内蔵音源では、一つのチャンネルからは一度に一つの音しか出ない。PC-98用のサウンドボードの場合、この「チャンネル」がFM音源で3つ、SSG音源で3つ、あわせて6つあるから、6音まで同時に出すことができる。つまり、一つのチャンネルでは、あくまでも一度に一音しか鳴らないんだ。だから、MMLで書く「譜面」は必ず単音になる。したがって、いままで書いてきただけの知識で、らくらくデータ作りができるというワケだ。おまけに、MMLの譜面は、あくまでもハ長調だ。これなら、こわくないよね。
さあ、手近にある雑誌の付録などの譜面から、メロディーをMMLでインプットしてみよう。一行書きおえたら、改行して、次の行も、また頭にAをつけて書きはじめよう。こつは、最初から、音符を一つ一つ置き換えてゆくことだ。さて、気がついたヒトもいると思うが、ここまでの知識では譜面が書き表せない場合がある。それは、メロディーが1オクターブをこえてしまったときだ。そのときには「オクターブ指定」をしてこれをクリアすることができる。
オクターブ指定には絶対指定と、相対指定がある。絶対指定とは、そのチャンネルでは、最初にどこの"C"を基準としたところから書きはじめるかを指定するのに使う。これを指定するには"o"コマンドを使う。MUSIC LALFでは、o1からo8まで8オクターブの指定が可能だ。8オクターブといえばグランドピアノの音域に匹敵するんだから、たいしたもんだよね。でも、どちらかというと、このオクターブの絶対指定は、音色の設定と深い関係がある。だから一つの音色を選ぶときに、一回使えばいいんだ。もちろん、この絶対指定は省略することもできる。省略したときには"o4"と同じになる。だから、今の段階では考えなくてもかまわない。
さて、ふつうのメロディーの中でオクターブをずらしたいときには相対指定の方を使う。MUSIC LALFのMML文で指定するメロディーは、いわば、1オクターブしか音程のない、ピアノの鍵盤のようなものだ。
オクターブの相対指定とは、ちょうどその1オクターブしかない鍵盤を、端まできたときに、1オクターブ上または下にずらすような働きがある。これをくりかえせば、いつでも鳴らしたいメロディーの音程を表記できるわけだ。相対指定のコマンドは、">"でオクターブダウン、"<"でオクターブアップを意味する。つまり、ラシドレミ、という具合に順にあがっていくときには、「ab>cde」とかけばいいワケだ。これで、もうどんなメロディーの譜面もインプットできるぞ。

・あとこれだけで演奏はバッチリだ
学校の音楽の授業で習った、譜面にでてくる記号には、もっといろんな種類があったよね。MUSIC LALFのMML文でも、それらの記号はちゃんとサポートしている。だから、譜面に書かれていることは、ほぼ、MML文で書きあらわすことができるんだ。音符を書くためのコマンドには、あとこれだけの種類があるぞ。
まず、くりかえしの記号がある。俗にカッコというヤツだ。同じメロディーを何回も書くのが大変なのは、譜面だろうと、MML文だろうと同じこと。だから、元の譜面でくりかえし記号が使われているところは、やっぱりMML文でもくりかえしとして書きたいよね。このためには、ループコマンド"[""]"を使う。図4.のようなくりかえし記号があったら、その「カッコ」に相当する部分を、文字通り、ループコマンドの「カッコ」で囲えばいい。このとき、くりかえしの回数を指定する必要があるから注意が必要だ。くりかえしの回数は閉じるカッコのうしろに数字をつけてあらわす。ふつうの譜面にでてくるくりかえしのカッコなら、数字は「2」になる。だから、図4.の譜例のような場合は、[ c4d4e4c4 d4e4f4d4 ]2 と表記される。
譜面の上で、くりかえしの記号とともに出てくるのが、くりかえしの1回目と2回目で一部だけ違うメロディーを演奏するときに使う、1カッコ、2カッコだ。これは、"/"コマンドを使って書き表す。たとえば、図5.のような譜面があったときには、くりかえしの1カッコの中のメロディーは、MML文中に"/"をはさんでカッコの内部に記述する。2カッコの中のメロディーは、カッコの外側で、カッコに続く部分に記述する。したがって、図5.の譜例のような場合は、[ c4d4e4c4 / d4e4f4d4 ]2 g4f4e4d4 と表記される。くりかえしの回数が3とか、4とか、2より大きいときは、くりかえしの最後の回のみ2カッコの方を演奏することになる。
さて、くりかえし関係には、もう一つ大ループコマンド"L"がある。これは、曲を一回演奏し終っても、また曲のどこかに戻り、stopさせるまでずっと演奏させ続けるためのものだ。だから、ゲーム音楽を作るときなどには強い味方になる。だけど、ふつうに演奏して楽しむだけのときには、それほど必要とはいえないコマンドだ。実際、ゲームミュージックなどのソースデータを作る場合には、曲が完成してから最後にLコマンドを入れるようにしているくらいだからね。BGMとして、ぐるぐると続けて演奏させたいときなどには使うといいかもしれない。
あと、譜面になくてはならない情報としては、テンポがある。これは"t"コマンドを使って記述する。譜面に書かれているbpm表示(一分間に四分音符をいくつ演奏する速さか)の数字をそのまま使い、たとえば、120bpmなら「t120」とやればいいから、これは簡単だね。その他、まず覚えていて欲しいコマンドとしては、"&"、"l"がある。"&"は、タイとかスラーとかをあらわすコマンドだ。タイやスラーでつながれた音符は、「c4&c8.」などというように、&で結んでやればいい。"l"は、音符の長さを示す数字を省略したときに、どういう長さの音符でならすかを指定するコマンドだ。だから、たとえば、16分音符がたくさん出てくるときは、「l16 cdec cdec」とかいておけば、「c16d16e16c16 c16d16e16c16 」と書いたのと同じになる。lコマンドは一つのトラックで何度でも指定できるから、これをうまく使うと、ソースを書くのがぐっと簡単になる。
さて、これで譜面はバッチリ書けるようになっただろう。でも、譜面だけじゃ音楽にならないね。そう、どういう楽器でそのメロディーを演奏するのか、この要素は譜面には入っていない。ちょうどそれと同じように、MUSIC LALFのMML文でも、どういう音色で演奏するかを指定する必要があるんだ。FM音源をつかうA〜Cチャンネルでは、音色ファイルのから使いたい音色を、SSG音源を使うD〜Fチャンネルでは、プリセット音色から使いたい音色を、それぞれ音色番号で指定すればいい。これには"@"コマンドを使い、「@1」という形式で使えばいいだろう。もちろん、自分でオリジナルの音色を作り、これをMML文中で記述することも可能だ。このやり方については、後日、オリジナル音色の作り方のところで説明しよう。
さあ、これでいろいろな音色が、自由に使えるようになった。しかし、このままでは、なぜか演奏にはメリハリがないだろう。ここで最後の基本技だ。それは、ボリュームコマンド。各チャンネル間で、メロディーと伴奏のバランスをとるためには、ボリュームの絶対指定コマンド"vn"を使う。nのところに音量を示す数字が入って、「n8」というように使われる。MUSIC LALFの場合、ボリュームはv0からv15まで16段階変化できる。これは、また、同じトラックの中で音色を変えたときに急に音が大きくなったり、小さくなったりするのを防ぐために使われる。だんだんと演奏が盛り上がるところで、ボリュームをで上げてゆくのには、ボリュームの絶対指定コマンド")""("を使う。")"コマンドではボリュームが1上がり、"("")"コマンドではボリュームが1下がる。このほか、メリハリをつけるにはLFOコマンド"M"やデチューンコマンド"D"といったものもあるが、これを使うこなすには、高度なワザが必要なので、MUSIC LALFを使いこなすワザの紹介をするときに、じっくりと触れることにしたい。

・ソースは読みやすく
さて、MUSIC LALFに限らず、こういうMML文で、曲を書き表すときのコツは、どこにあるのだろうか。それは、あくまでも「読みやすいソースを書く」ことを、頭においておくことだ。MUSIC LALFは、音楽用のコンピュータ言語だ。だから、ここで作っているMML文は、音楽を書き表してはいるものの、コンピュータの「プログラム」なんだ。だから、プログラムを書くときの注意事項が、そのままあてはまる。
実際にMML文を書いているときは、ともすると、なるべく省略できるものは省略して書きたくなる。でも、こういう一人よがりは、結局自分が泣くことになりかねない。トラック間でリズムがあわなくなったり、思い通りのメロディーにならなくなって、ソースのデバッグが必要なことはよくある。また、前に書いたソースを改良して、こったアレンジにすることもある。こういうとき、最初に読みやすく書いてあると、実に作業がやりやすい。でも、最初に手抜きをしてあると、ほんとにまた最初から書いた方がいい、というこのにもなりかねない。
けっきょく長い目で見れば、読みやすいソースを書くのがいちばん得するんだ。これは、コンピュータ界では常識だ。あと、コメント文も活用しよう。これは、単にメモを書くだけでなく、試行錯誤しながらアレンジするとき、不要な行の頭に";"をつけ、コメント文にするというように、アイディア次第でいろいろ活用できるんだ。
では、読みやすいMMLソースとはどんなものだろうか。図6.と図7.を見較べてほしい。どうして図7.のソースは見やすいのだろうか。それはまず、チャンネルの並べ方に秘密がある。図7.のように、曲の進行通りに、A〜F(K)のトラックを並べれば、各行ごとのブロックは、曲の同じ部分を示している。
ちょうど、バンドの譜面の書き方のようだね。だから、修正するときにも、そのブロックだけいじればいい、というようにぐっと処理しやすいんだ。また、図7.では、MUSIC LALFならではのデリミタを活用して読みやすくしている。1小節ごとに"|"をデリミタとして使い、各トラックは、上下に同じ小節が揃うようにしている。これをつかうと、トラック間でリズムがあわないなんてことは、一切なくなる。
さて、「 l16 cdeg cdeg cdeg cdeg 」などを、本来のくりかえしとは違うけど、ループを使って書くことも多い。こういうときこそ、デリミタで小節管理しておくと間違いがない。あと、読みやすいソースにためには、MUSIC LALFならではの強い味方としてMACROがあるが、これについてはあとでゆっくり説明したいと思う。



まえにもどる

つぎにすすむ

「まるボ」アーカイブにもどる


はじめにもどる