MML入門

 

MMLの書き方(1)

 

 MMLとは楽譜をコンピュータ上で記述しやすいように文字列(主にアルファベット)にして表わした言葉です。サンプルのデータなどを見るとアルファベットが羅列してあって難しく感じるかもしれませんが、基本的なところさえ解ってしまえば、とてもシンプルで便利な言語です。

 

 まずは下のような1行のファイルをテキストエディタで作成して、コンパイル、演奏をしてみて下さい。MIDIでつながれた楽器の受信チャンネルは1にしておいて、音色はわかりやすいピアノの音などに設定しておくとよいでしょう。

 

例1

A ch1 t120 l8o4 cdefgab

 

 MIDIケーブルが正常に接続されていて、コンパイル、演奏の手順が正しければ、ド・レ・ミ・ファ・ソ・ラ・シの各音が鳴ります。では、この1行がどんな働きをしたのでしょうか?

 最初から順を追って説明をしていきましょう。

 行の最初の A というアルファベット、これがまず第一のポイントになります。Annex MIDIMMLを記述する基本として、

 

[トラックネーム(AZ)] スペース MMLの記述]

 

 1行が上のような形になってなければなりません。例1で言うと、最初の A がトラックネーム、その後にスペースが入って、それ以降の ch1 t120 l8o4 cdefgab という部分がMMLになります。1行が上のような形になっていない時は、MMLが書いてあるとはみなされずに無視されてしまいますから注意して下さい。トラックネームは1文字で必ず大文字の AZ、そしてその後には必ずスペース、その後にMMLを書く。この基本を何より覚えておかないと、せっかくMMLを書いても認識されません。

 トラックネームについては後で説明しますので、ここでは、まず A というトラックネームを最初に書くんだな、と覚えておいて下さい。

 

 いよいよMMLの記述を見ていってみましょう。ずらずらとアルファベットと数字がちりばめられていますが、カンのいい人は最後の cdefgab というのが音階を表わしているんだということに気がつくかと思います。実際、その通りでMMLでは音符は cdefgab の文字がそれぞれ ドレミファソラシ になります。

 

 

 

 ためしに例1の cdefgab をいじって、 ccegfdba などに変更しても、ちゃんとその通りに演奏されるでしょう。しかし、そのままだと、それぞれの音を同じ長さでしか演奏してくれませんし、音の高さも変えられませんね。もちろんそれらを変更することができるようになっています。MMLでは大きくわけて、実際の音符を表わす文字( cdefgab のような)と、音の高さや長さなどの設定をするための文字( l, o, t など)の2つの種類があります。音符を表わす文字は、書けばそのまま演奏されますが、設定をするための文字は、それ以降の音符に影響を与える、音符のサポートをする役目を持ちます。

 

 基本的にアルファベット1文字と数字の組み合わせで1つの意味を持っていて、これをMMLのコマンドと呼びます。たとえば、ch1 1つのカタマリ。コマンドになります。これは、MIDIの送信チャンネルを1に設定する、という意味ですし、t120 もまた1つのコマンドで、テンポを120に設定する、という意味を持っています。

 

 音符もまたコマンドの1つです。c というコマンドは、「ド」の音を一定時間鳴らすという意味を持っています。このように、音符や、設定などを順番に記述していくもの、それがMMLなのです。コマンドとコマンドの間はスペースであけても、あけなくてもかまいません。当然、1行に入りきらなくなりますから、また別の行に続きを書いていってかまいません。例1の1行を、

 

A ch1 t120 l8o4

A cdefgab

 

のように書いても、

 

A ch1 t120

A l8o4

A cdefgab

 

のように書いてもかまいません。どちらも同じ動作になります。

 MMLは楽譜と違って、小節で区切って書く必要はなく、区切り方も人にまかされているので、自分にわかりやすい自由な記述ができる反面、他の人が見ると複雑でわからないデータになってしまう可能性もあります。自分なりの見やすい形に区切るのが基本ですが、なるべく小節単位に区切るように、くせをつけておくことをおすすめします。

 

 

MMLの書き方(2)

 

 ここでは基本的なMMLコマンドを説明します。これらは、どんなデータを作る際にも重要な働きをするものばかりなので、バッチリ覚えておきましょう。

 

 音階を表わすコマンドが、cdefgab の各文字(必ず小文字)だということは上で言いましたね。たとえばドレミミファラシという音を鳴らしたい場合は、cdeefab になります。しかしドレミにも、高い音でのドレミや、低い音のドレミがあり、それを指定しなくてはなりません。そのためのコマンドが o です。

o は、o3 o5 のように数値を指定して、それ以降の音の高さ(オクターブ)を設定します。標準となる値は 4 で、-19 まで指定ができます。ですから、例1を下のように変えると、

 

A ch1 t120 l8o4 cdefgab o5 c

 

ドレミ…で最後に1オクターブ上のドまで出すことができます。

 

 次は音の長さの指定です。これは、l(小文字のエル)で設定することができます。例1にあるように、l8 のように数値を後につけて長さを決めます。l8 8分音符、l4 4分音符、l16 16分音符というぐあいに、楽譜の長さと同じように指定できます。l で長さを指定すると、それ以降の音符はその長さで鳴ります。

 

例2:

A ch1 t120 l8o4 cd l4 e l8 fg l4 a l8 b l2 o5 c

 

 上のように長さを指定して鳴らすと、だんだん音楽らしくなってきましたね。しかし、実際の楽譜は音の長さがひんぱんに変わりますし、オクターブが上下に激しく変わる曲も多いです。そこで、MMLでは音の長さやオクターブの変化を簡単に書ける方法も用意されています。たとえば、例2のような音の長さも、もっと簡単に次のように書くことができます。

 

例3:

A ch1 t120 l8o4 cd e4 fg a4 b ~c2

 

 だいぶ短くなりましたが、例3も例2も同じように鳴ります。つまり、e4 a4 などのように音符の後に長さをつけることで、その音符だけを指定した長さで演奏できるのです。これは逆に考えると、音符の長さを指定しないと、l で指定した音長になる、と考えることもできます。ですから、

 

A l16 eeee dddd

A e16e16e16e16 d16d16d16d16

 

 上の2つの行は、どちらも同じ演奏になります。しかし、音の長さを指定しないぶん l で指定した方が楽になるのです。

 このように、l による指定と、音符に直接指定する方法をうまく使って効率よく楽譜を書いていくと良いでしょう。

 またAnnex MIDIでは、オクターブの指定も音符に付加することが可能です。例3の最後の部分、~c2 という音符の前についている、~ がその指定です。つまり、

 

~ を音符の前に置くと、その音は1オクターブ上がる

_ を音符の前に置くと、その音は1オクターブ下がる

 

という機能になります。ですから、

 

例4:

A o4 ce o5 ce o3 ag

A o4 ce ~c~e _a_g

 

上の2つの行は、どちらも同じ演奏になります。オクターブを直接指定する oコマンドを使うと、それ以降の音符のオクターブが変化するのに対して、~ _ は、その直後の音符だけが変化します。そしてさらに別の方法として、下のような1文字のコマンドで高いオクターブや、低いオクターブに変えることもできます。

 

> は、それ以降の音を1オクターブ上げる

< は、それ以降の音を1オクターブ下げる

 

ですから、例4のリストを下のように書くこともできます。

 

A o4 ce > ce << ag

 

< > で変化するのは常に1オクターブだけです。オクターブ設定のコツとしては、最初に標準となるオクターブを oコマンドで設定しておいて、後は < > でオクターブを変化させるようにすると良いでしょう。こうしておくと、後になって全体のオクターブを一度に変化させたくなった時でも、最初の o コマンドの設定を修正するだけで簡単に変わります。

 

 

MMLの書き方(3)

 

 ここではさらに少し深く、音符の記述方法を説明します。まず、音符の種類をもう一度おさらいしてみましょう。

 

c          

d          

e          

f            ファ

g          

a          

b          

 

 これが音を鳴らすためのMMLコマンドでした。しかし、まだ足りないものがあります。その1つが、音を鳴らさないためのコマンド、

 

r           休符

 

です。休符もまた普通の音符と同じように使うことができます。

 また、実際の楽譜には、ド〜シの間に半音も含まれて12音階が存在します。MMLでは次のようにして半音を表わします、

 

c+         # (シャープ)

d-          b (フラット)

d+        #

e-          b

f+         ファ#

g-          b

g+        #

a-          b

a+        #

b-          b

 

 つまり cdefgab の音符の後に + を付けると半音上がり(シャープになる)、- を付けると半音下がる(フラットになる)のです。上の表で同じ行にあるもの、たとえば c+ d- はどちらも同じ音になります。また、c の半音下は b になりますし、e の半音上は f になります。

 以上の cdefgabr の各コマンドは音符として次のような指定ができるようになっています。

 

_ もしくは ~ ][音符(cdefgabr)][音の長さ]

 

 これらはすべて1つのコマンドとしてスペースを入れずに記述しなければなりません。たとえば、

 

A o4 ~ c4 e- 2 _f +1 6

 

のようなMMLは間違いで、

 

A o4 ~c4 e-2 _f+16

 

のようにするのが正解です(注:現在では数値の間にスペースを入れるケース以外は正しくコンパイルされます)。 この音符は左からそれぞれ、オクターブ5のド・4分音符,オクターブ4のミのフラット・2分音符,オクターブ3のファのシャープ・16分音符になります。

 さて、音階がすべて記述できるようになったところで、今度は音符の形、つまり音の長さをより細かく指定してみましょう。音長の指定は基本的に下のようになっています。この例では c の音を鳴らす場合の記述になっています。

 

c1         全音符

c2         2分音符

c4         4分音符

c8         8分音符

c16       16分音符

c32       32分音符

c64       64分音符

c           lコマンドで指定した長さ

 

 さらにそれぞれの半分の長さを付け加える付点音符が存在します。それは下のように指定します。

 

c1.         付点全音符

c2.         付点2分音符

c4.         付点4分音符

c8.         付点8分音符

c16.       付点16分音符

c32.      付点32分音符

c64.      付点64分音符

 

 音の長さを指定する数字の後にピリオド(.)を付けることで、その長さの半分の音符を追加した長さになります。つまり、c2.(付点2分音符)だと、2分音符より4分音符だけ長い音になります。付点音符にさらに点をつけて、

 

A o4 a4..

 

のようにすることもできます。上の例だと、4分音符に8分音符と16分音符を足した長さになります。しかし、これは音の長さを把握するのが難しいので、なるべく避けるのが無難でしょう。

 もう1つ、実際に使われる音の長さとして連符があります。これは、全体の音の長さから自分で計算して音符の長さを出す必要があり、最初はちょっと手間取りますが、基本的には下のような式を覚えてしまえば、らくに計算ができるようになってきます。

 

c6c6c6                             2分音符の3連符

c12c12c12         4分音符の3連符

c24c24c24        8分音符の3連符

c48c48c48        16分音符の3連符

 

 6分音符とか、12分音符とか聞きなれない音符が出てきますが、3つあわせると普通の音符になりますので安心して下さい。この法則さえ覚えておけば、6連符や9連符にも応用できます。

 

 

MMLの書き方(4)

 

 ここまでの説明で、かなり複雑な楽譜でもMMLにすることができるようになったかと思います。しかしまだ、単音だけの演奏しかできませんでした。ここでは、複数のトラックやコマンドを使って和音を出す方法について説明をします。

 1行の書式として、

 

[トラックネーム(AZ)] スペース MMLの記述]

 

のようにする、というのはすでに説明しました。いままではトラックネームには A のみを使ってきましたが、和音を書くにあたっては、このトラックネームに別のアルファベットも使わなければなりません。トラックネームは A から Z まであり、それぞれが同時に進行して演奏されるようになっています。

 たとえば、

 

A ch1 l8o4 c d e

B ch1 l8o4 e f g

 

というようなリストを演奏させると、最初にドとミの和音、次にレとファの和音、ミとソの和音という順番で演奏されます。c, d, e の音を鳴らしているのはトラックネームが A の行。e, f, g の音を鳴らしているのは、トラックネームが B の行になります。これを、それぞれトラック A ,トラック B と呼び、おのおのが同時に演奏されます。たとえば、ベースライン,メロディー,リズム,バッキングなどをそれぞれ別のトラックに書いておいて同時に演奏される、などといった使い方をします。

 それぞれのトラックはリストの上から順番に演奏されていきます。別々のトラックネームが入り交じっていても、かたまっていてもかまいません。たとえば、

 

例5:

A ch1 l8o4

B ch1 l8o4

A c d e

B e f g

A f g a

B a b ~c

 

というリストがあっても、

 

A ch1 l8o4

A c d e

A f g a

B ch1 l8o4

B e f g

B a b ~c

 

というリストがあってもかまいません。どちらも同じ演奏になります。

 しかしこの方法で曲の各パートを作る場合、ベースラインやメロディーには便利ですが、バックでコードを3〜4つの和音で鳴らしたい、という時はかえって不便です。そこで Annex MIDIでは、1トラック内に和音を記述することもできるようになっています。

 たとえば、例5のリストの和音を1つのトラックで演奏するためには、

 

A ch1 l8o4

A c:f d:g e:a

A f:a g:b a:~c

 

のように記述することになります。音符と音符を : でつなぐことにより、それぞれの音符が同時に鳴り和音となるのです。いくらでも : でつなぐことができますから、たとえばド・ミ・ソの和音を出したい時などは、c:e:g になります。音長を指定した時は、その後に : を書かなければなりません。つまり、c1:e1:g1 のようになります。また、それぞれの和音の長さが違って指定された場合、たとえば c2:e4:g1 のような時でも、c の音は2分音符、e の音は4分音符、g の音は全音符で演奏されます。ただし次の音が鳴るのは、最後に指定した g1 が鳴り終わってからになります。

 

 

MMLの書き方(5)

 

 MMLでは演奏する上での設定や、各トラックごとの設定をするためのコマンドが用意されています。ここでは、その中でも重要なものについて説明をします。

 まず、曲全体のテンポを設定する tコマンドを最初に入れることを覚えておきましょう。これは、

 

A t140 l8o4

A bag f+4ec2

 

のように、t の後に数字で指定をします。t140 1分間に1404分音符を演奏する早さ、ということになります。ですから、この数値を増やせばテンポが早くなり、減らせば遅くなります。t コマンドはどの音符よりも先に書いておきます。このコマンドだけは全トラック共通なので、どのトラックでもいいですから、最初に書いておけば全トラックがそのテンポで演奏されます。また、途中でテンポの変更をしたい場合でも、任意のトラックで指定すればOKです。

 

 次に、トラックの演奏を送るチャンネルを設定する ch コマンド。これも各トラックの最初に設定しておかなければなりません。たとえば、

 

A t140

A ch1 l8o4 bag f+4ec2

 

と指定した場合には、A のトラックはMIDIのチャンネル1に演奏データを送ります。指定は ch の後に数字で書いておきます。116までの指定ができます。

 

 次は、最初に設定しておく代表的なものとしてベロシティ(音量)と音色チェンジを覚えておきましょう。ベロシティとは、鍵盤で言えば弾いた時の力の強さになります。強く弾くと、それだけ大きな音で鳴るわけです。MIDIの楽器によっては、単純に音量が変わるだけでなく、音の感じが変わったりするものもあります。これを設定するためのコマンドが v になります。v コマンドの後に数字でベロシティの指定をします。たとえば、

 

A t140 ch1 l8o4v80 bag f+4ec2

 

のように最初に指定すると、A のトラックはそれ以降どの音もベロシティ80で演奏されます。ベロシティの範囲は、1127までで、通常は7080くらい。強く弾いた時は100120くらいが目安ですが、MIDI楽器によって変化の度合も変わります。

 

 音色指定をするコマンドを最初に入れておくと、MIDI楽器側でいちいち設定をしなくても、各チャンネルの音色を設定できるので便利です。これには、

 

A t140 ch1 @1 r8 l8o4v80 bag f+4ec2

 

のように @コマンドを使います。@の後に数字で音色ナンバーを指定します。すると音色を変更する信号がMIDIから送信されて、そのチャンネルの音色が変わります。ですから、途中で音色を変えることもできるわけです。ただし、このコマンドには注意する点がいくつかあります。まず、指定する数字は0127の範囲ですが、MIDI楽器側で表示されている番号は1から始まって128の場合や、18, 1118などの飛び飛びの番号になっている場合もあり、必ずしも楽器側の番号とは一致しないことを覚えておきましょう。また、MIDI楽器側の設定で、MIDI信号による音色チェンジ(MIDI PROGRAM CHANGE)ができないようになっている場合があるので、それが可能な状態かどうかを確かめておきましょう。

 そしてもう1つ、音色チェンジを送った直後に音を鳴らそうとすると、MIDI楽器によっては音が出ないことがあります。そんな時は、上のリストのように、音色チェンジの後に休符で時間待ちを入れると安心です。最初の音が鳴らなかったり、音色チェンジができなかったりした時は、以上の点に注意してみるといいでしょう。

 

 では最後に、ここで説明したMMLコマンドのおさらいをしておきます。ここまでのコマンドはなるべく覚えて、スラスラ使えるようになりましょう。

 

t テンポ設定(全トラック共通)

ch チャンネル設定(116

v ベロシティ設定(1127

@ 音色チェンジ(0127

 

 

MMLの書き方(6)

 

 ここでは少しMMLの書き方に慣れてきた人に、より効率よく書くことができるような方法、ループについて説明します。ループコマンドは、MML独特の手軽さと自由度を持っています。基本的には単純に、くり返しをしたいMML [ ] で囲むだけでOKです。たとえば、

 

A t140 ch1 l16o4v80

A [ cceg ]4

 

のように cceg [ ] で囲みます。] の後にある数字はくり返しの回数を指定しています。ためしに、上のリストを演奏させると、cceg の部分を4回くり返して終了するはずです。つまり、

 

A t140 ch1 l16o4v80

A cceg cceg cceg cceg

 

などと本来は書かなければならなかった部分が、短く簡単に書けてしまうのです。実際の音楽も、くり返す部分が少なくありませんから、このループコマンドを覚えておくと便利に使えます。ただし、リストが見難くなる危険性もあるので気をつけて使いましょう。

 くり返しの中で、さらにくり返しがあるような場合でも、

 

A t140 ch1 l16o4v80

A [ [ca]2 cceg ]4

 

のように書くことができます。上の例だと、ca ca cceg 4回くり返します。また、もう1歩高度な使い方としてループ抜けだしコマンドがあります。これは、

 

A t140 ch1 l16o4v80

A [ eree / crcc ]2 grgg

 

のようにループの中に / を置くと、最後のくり返しの時だけは / 以降の演奏はしないでループから抜けだしてしまうものです。上の例だと、eree crcc 2回くり返すはずですが、1回目の eree crcc はそのままで、2回目、つまり最後のくり返しは eree だけを演奏して、次の grgg に進みます。慣れないうちは戸惑ってしまいがちなコマンドですが、使えるようになると、音楽のパターンとして多く出てくるものなので、効率がとても良くなります。

 もう1つ特殊なループの使用方法があります。曲を打ちこんでいる最中で何回ループさせるかの見当がつかない時や、終わりのない無限にくり返す曲を作りたい時などは、

 

A t140 ch1 l16o4v80

A [ e2c4.d4._a4 ]*

 

のようにくり返しの回数を * にすると無限にループを続けるようになります。

 

 

最後に

 

 以上が基本的なMMLの書き方になります。まだ多くのコマンドが Annex MIDI には存在しますが、もっとも多く使われるのはいままでに説明した、cdefgabr の各音符、l, o, t, v などの設定コマンドです。まずはこの使い方を十分にマスターしてから次の段階に進むのが良いでしょう。

 

 

 

 

 

 

 


 

Annex MIDI の文法(1

音符について

 

 

音長と間隔

 

 Annex MIDI では全ての音符はそれ自身の長さと次の音符までの間隔を持っていて、 それぞれ音長と間隔と呼んでいます。

 

【例】  A l4 ed8c16

この場合には音長と間隔は次のようになります。

              e           音長=4分音符               間隔=4分音符

              d8         音長=8分音符               間隔=8分音符

              c16       音長=16分音符             間隔=16分音符

 

図にすると次のようなイメージになります。

 

 

普通はこの例のように音長と間隔は同じ長さになります。

 

 もう一つの例として和音の場合を見てみます。

 

【例】  A l4 e:d8:c16

 

              e:          音長=4分音符               間隔=0

              d8:        音長=8分音符               間隔=0

              c16       音長=16分音符             間隔=16分音符

 

 

             

 

: が付くと間隔だけが0になります。

 ここで : の後に長さをかけば和音の鳴り始めをずらすことができます。

 

【例】  A l4 e:8 d8:16 c16

 

              e:8                     音長=4分音符               間隔=8分音符

              d8:16   音長=8分音符               間隔=16分音符

              c16                     音長=16分音符             間隔=16分音符

 

             

 

 このように音長と間隔を自由に設定することによってメロディに細かな表情をつけることが可能です。

 ただしあまり複雑な記述をするとあとで読みづらくなってしまいますので注意が必要です。例えば、ピアノ譜の右手のパートと左手のパートを : を使って一つのトラックに書くことは確かにできますが、 この場合は分けた方がずっと見やすくなりますし、それが自然です。

 

 

休符

 

 休符は間隔だけを持った音符と考えてください。

 

【例】  A l4 e:8 r16 c16

 

              e:8        音長=4分音符               間隔=8分音符

              r16       音長=なし         間隔=16分音符

              c16       音長=16分音符             間隔=16分音符

 

             

 

休符を書かずに間隔の一部に含めてもかまいません。

 

【例】  A l4 e:8. c16

 

              e:8.       音長=4分音符               間隔=付点8分音符

              c16       音長=16分音符             間隔=16分音符

 

             

 

 

長さについて

 

 すでに出てきたように Annex MIDI では長さは2分音符の長さなら 2、4分音符の長さなら 4 というように書きます。 このとき . をつけて符点音符(1.5 倍の長さ)を表わすことができ、たとえば付点2分音符なら 2. と書きます。

 さらに、^ を使って音長を足したり引いたりすることができます。2分音符と8分音符を足し合わせた長さなら 2^8 、2分音符に16分音符ぶん足りない長さなら 2^-16 と書き表します。

 

【例】  A c4.                                // 付点4分音符

【例】  A c4.^32 c32^4.            // 付点4分音符と32分音符を合わせた音符が2つ

【例】  A l4^-16 ccc                   // 4分音符に16分音符分足りない長さの音符が3つ

 

 Annex MIDI で正確に表現できる長さは、#clock で指定された値を割り切ることができる音符の長さとその組み合わせによって得られる長さです。

 

 例えば #clock の指定をしない場合のデフォルト値は 192 ですから

              192, 96, 64, 48, 32, 24, 16, 12, 8, 6, 4, 3, 2, 1

分音符とその組み合わせだけが正確に表現できる長さになります。

 長さは ^ を使って足したり引いたりできるので、 結局 192分音符の整数倍の長さなら全て作り出すことができます。

 しかし128分音符は正確に表現できません。 192分音符は128分音符より短いですし、 192分音符2つぶんの96分音符は128分音符より長くなります。 192分音符の整数倍では128分音符は作り出せないのです。 (もちろん #clock 128 とすれば 128分音符が正確に表現できます。 ただし、この場合192分音符,96分音符や3連符などは正確に表現できなくなります。)

 割り切れない長さがあると「割り切れません」という警告( Warning )を出したうえで、内輪で一番近い長さで代用するようになっています。

 なお、間隔の指定や q コマンド(音長の変更)などでは特別に 0 を指定できるようになっています。これは長さとしてゼロを指定するという意味で、0 分音符(長さ無限大?!)のことではありません。

 

 

そこだけオクターブを変える

 

 音符の前に _ ~ を付けてそこだけオクターブを変えることができます。 ~ で1オクターブ上がり、 _ で1オクターブ下がります。

 たくさん書くとその数だけオクターブが変わります。

 

【例】  A c ~c ~~c                       // 普通のド、1オクターブ上のド、2オクターブ上のド

【例】  A c _c __c                        // 普通のド、1オクターブ下のド、2オクターブ下のド

 

 また、数字を付けることによって半音単位でずらすこともできます。

 

【例】  A c ~1c ~2c                     // c c+ d と同じ

【例】  A a _1a _2a                    // a a- g と同じ

 

 1オクターブは半音12個分なので、「数字が省略されると12」と考えると良いでしょう。

 この機能は和音をマクロで定義するときに便利です。

 

【例】  %major %1 : ~4%1 : ~7%1

              A %major( c )                 // c:e:g (ドミソの和音)と同じ

 

 

そこだけベロシティを変える

 

 音符の後に '(アポストロフィー)を書いて数字を書くと その音符だけベロシティを変化させることができます。

 

【例】  A v80 ccd'100c                             // d だけベロシティ100で鳴る(他は80)

 

 このコマンドは、間隔を指定する : の後に書きます。

 

【例】  A v80 l4 c:e:'100g                        // ドミソの和音だが、e だけベロシティ100で鳴る

【例】  A v80 l4 c:8 e8:16'100 g16        // 鳴り始まるタイミングをずらして演奏する場合

 

 

音符に関連するデフォルト値の設定

 

 オクターブ・音長・間隔の3つについてデフォルト値を設定します。

 

              o           オクターブ指定(デフォルトは o4

              <           オクターブダウン

              >           オクターブアップ

              l            デフォルト音長指定(デフォルトは l4

              w          デフォルト間隔指定(デフォルトは w0

 

 o4 c MIDI のノートナンバー 60 に対応します。オクターブとして指定できる値は-19です。また間隔には 0 が設定できます。

 

 

音長をまとめて変える

 

 q コマンドで、その後の音符の音長をいっせいに変えることができます。 音符の間隔は変化しません。 音を短く切るスタッカートのような効果を付けるのに有効です。

 必ず決まった長さだけ鳴らす絶対指定と、 それぞれの音符からちょっとずつ音長を削る相対指定とがあります。

 

【例】  A q-16 c4e4g4 // どの音符も16分音符分だけ短く鳴ります(相対指定)。

【例】  A q16 c4e4g4   // どの音符も16分音符分だけ鳴ります(絶対指定)。

 

 指定を解除するには相対指定を使って q-0 と書きます。

 

  q コマンドの例として、音長と間隔のところで使った

 

【例】  A l4 ed8c16

 

を使います(下図)

 

             

 

ここに q-32 (相対指定)を追加すると次のようになります。

 

【例】  A l4 q-32 ed8c16

             

q32 (絶対指定)では次のようになります。

 

【例】  A l4 q32 ed8c16

             

 

いずれも、間隔は変化せずに音長だけが変化します。

 

 

キーシフト(一斉)

 

 k コマンドでそれより後ろの音符の音程をいっせいにずらすことができます。 これによって移調・転調が簡単にできます。

 

【例】  A k-3 cdefg        // 半音3つ分低い音が鳴ります

 

 

キーシフト(個別)

 

 音符別にキーシフトを定義することもできます。

 

【例】  A kf+ kc+ defgab>cd<

 

この例は♯が2つ付いたニ長調のドレミファソラシドが鳴ります。

 リズムトラックで別のオクターブに割り当てられている音などを多用したい場合にも有効です。

 

【例】  A ch10 o2 kb+1 l16 bbbbaaaagggg

 

 この例のように本来は ~c~c~c~caaaagggg などと書かなくてはならないものが 簡単に書けるようになります。 ただしあまり多用すると後で見たときにわかりにくくむなるので注意してください。

 

 

キーシフト(移調)

 

 楽譜では♯や♭の数が決まればそれを付ける位置は決まっています。ks コマンドではその数を指定すれば自動的に所定の位置に個別キーシフトが設定されます。

 

【例】  A ks+2 defgab>cd<       // ♯が2つ付く場合

【例】  A ks-3 defgab>cd<         // ♭が3つ付く場合

 

 この ks コマンドは内部で個別キーシフト(k コマンド)に変換されるので、事前に k コマンドで設定されていた個別キーシフトは全て解除されます(一斉キーシフトは別扱いになっているので影響を受けません)。 また、移調と個別のキーシフトの場合、c+ d- などは変化しません (本来の c+ d- の音が鳴ります)。ナチュラルは c= および d= と書きます。

 キーシフトを解除するには、次のようにします。

 

【例】  A k3 cdefgab k0                                         // 一斉シフトは k0 で解除

【例】  A kf+ kc+ defgab>cd< kf= fc=   // 個別シフトは個別に解除(ks0で全解除)

【例】  A ks+2 defgab>cd< ks0                            // 移調シフトは ks0 で解除

 

 

 

Annex MIDI の文法(2

 

構文について

 

 

タイトル

 

 曲のタイトルを設定します。ここで設定されたタイトルは、ファイルパレットでファイル名とともに表示されるほか、スタンダードMIDIファイルにも出力されます。

 

【例】  #title "「愛の嵐」 by ぐぎゃごー"

 

#title は行の1桁目から書いてください。

 

 

分解能指定

 

 Annex MIDI では全音符の分解能は 192 (4分音符の分解能は48)がデフォルト(標準)ですが、これを変更することができます。

 

【例】  #clock 96

 

 この例のように分解能を下げると、 理論上は処理が軽くなります。 ゲームのBGMなどに使う場合など、 CPUの負荷を減らしたい場合に使うことがあります。

#clock は行の1桁目から書いてください。

 

 

トラック名

 

 行の先頭に書く文字がトラック名です。 行の1桁目に半角のアルファベット大文字を書くことで、 その行にコンパイルすべきMMLがあると判断されます。

 Annex MIDI ではトラック名として AZ(半角アルファベット大文字)で始まる名前が付けられます。最大32文字で、先頭以外には小文字も数字も含めることができます。トラック名は大文字小文字が区別されます( たとえば ABC Abc は違うトラックになります)。 また、トラック名と各種コマンド(音符など)の間には1つ以上の空白が必要です。次に例を示します。

 

【例】  A cde   // A という1文字のトラック名

【例】  Zoo cde              // Zoo という3文字のトラック名

【例】  A01 cde             // A01 という3文字のトラック名

【例】  a12 cde             // × 小文字で始まってはいけない

【例】  01A cde             // × 数字で始まってはいけない

 

 

継続トラック

 

 行の先頭が + の行は直前のトラックと同じ名前となります。 これはマクロでも同じです。

 

【例】  %macro aa

              + bb

              A r1 %macro

              + r1 %macro

 

上の例は次のように解釈されます。

 

【解釈】

              %macro aa

              %macro bb

              A r1 %macro

              A r1 %macro

 

さらにマクロが展開されて次のようになります。

 

【解釈】

              A r1 aa bb

              A r1 aa bb

 

 

共通トラック

 

 * で始まるトラックは共通トラックとなり、全てのトラックで コンパイルされます。また、頭文字を指定する事により、特定の範囲の トラックを対象とすることができます。

 

【例】  *                          // 全てのトラック

【例】  *A-G                   // A から G で始まる名前を持つトラック

【例】  *ABC                 // A, B, C で始まる名前を持つトラック

 

 もう少し具体的な例を示します。

 

【例】  * [

              A cde

              B efg

              *AB ]10

 

この例は下と同じです。

 

【例】  A [

              B [

              A cde

              B efg

              A ]10

              B ]10

 

 共通トラックは無限ループなどの曲全体の構成を書くのに便利です。

 

 

コンパイル制御

 

 行の先頭に #off と書くとそれ以降の行をコンパイルしなくなります。 行の先頭に #on と書くとそれ以降の行のコンパイルを再開します。 これによって行単位でコンパイルする/しないを制御できます。 長い曲を作っていて、曲の前半部分をとりあえず飛ばしたい時に便利です。

 

【例】  A cccc cccc

              #off

              A dddd dddd

              #on

              A eeee eeee

 

この例では 3行目(A dddd dddd)がコンパイルされません。

 

 

マクロ

 

 Annex MIDI ではマクロが使えます。マクロは % を付けて表します。

 行頭に % のある行はマクロ定義行となります。マクロ名は英文字で始まる32文字以内の文字列で、先頭以外は数字が使えます。マクロの中からマクロを呼び出す事ができます。

 

 Annex MIDI のマクロは9つまでの引き数を使う事ができます。定義時に %1 %9 と書かれた部分は1番目から9番目までの引き数に置き換えられて展開されます。対応する引き数が無い場合はブランクとなり、余計な引き数がある場合は使われないだけでエラーとはなりません。 しかし、対応する引き数がないと大抵の場合エラーを引き起こすので 定義時と使用時の引き数の数をそろえることをお奬めします。また、一般にマクロを使うと曲が大きくなりがちなので注意してください。

 

【例】  %domiso c:e:g   // マクロ

              %waon %1 : %2 : %3      // 引数付きマクロ

              %major %waon( %1, ~4%1, ~7%1 )        // マクロからマクロを呼び出す

              A %domiso %waon( c, e, g )       

              A %waon( c, a ) %major( c )       

 

【解釈】

              A c:e:g c:e:g c:a: c:~4c:~7c

 

 

コメント

 

 // を書くと、そこからその行の最後までコメントになります。 当然ですが、コメント部分に音符などを書いても演奏されません。

 

【例】  A cde   // この部分はコメント

 

 

ループ

 

  [ ] で囲まれた部分は指定された回数分繰り返して演奏されます。 回数を省略すると警告が出されて1回になります。 8重までネスト可能です。[ ] の中に / があれば、 最後の繰り返しのとき / から ] までは演奏しません。

 回数を書くかわりに * (アスタリスク) を書くと無限ループになります。 無限ループは1トラック中に一つしか使えません。 また、いちばん外側のループにしか指定できません。

 

 

整列(トラック内)

 

 | Shift + \ で入力される記号)で区切ると、 あらかじめ設定した長さの倍数になるように自動的に休符が挿入されます。 通常は u で指定された長さ単位となります。 u のデフォルトは u4 です。

 | に続けて長さを指定すると、 そこだけ指定された長さ単位になるように休符の挿入が行われます。

 

【例】  A l8 u1 |* ceee gecc | cdef g4 | e2g2g2 |

【解釈】

              A l8 ceee gecc cdef g4 r4 e2g2g2 r2

 

 上の例では u1 として整列単位を全音符に設定しています。 一つ目の区切りの長さはちょうど全音符なので休符の挿入は行われません。二つ目の区切りは付点2分音符分の長さで、全音符になるよう4分休符が挿入されます。三つ目の区切りは全音符+2分音符の長さで、全音符2つ分になるよう、 2分休符が挿入されます。

 

 

整列機能(トラック間)

 

 Annex MIDI ではフレーズ名による整列機能があります。 "" でくくった文字列はフレーズ名となり、整列の対象となります。

 

【例】  A l4 cccc cccc

              B l4 d

              A "A" cde

              B "A" efg

 

 この例では "A" が同じ位置になるように整列が行われて、次のようになります。

 

【解釈】

              A l4 cccc cccc

              B l4 drrr rrrr

              A "A" cde

              B "A" efg

 

長さが足りなかったトラック B に休符が挿入されます。

 

 上の例のように、各トラックにフレーズ名を書いてもいいのですが、 通常は次の例のように共通行を作ってそこにフレーズ名を書きます。

 

【例】  * "A"

              A cdef

 

              * "B"

              A gab~c

              B ~cbag

 

              * "C"

              B fedc

 

【解釈】(共通行展開)

              A "A" cdef "B" gab~c "C"

              B "A" "B" ~cbag "C" fedc

 

【解釈】(最終)

              A "A" cdef "B" gab~c "C"

              B "A" rrrr "B" ~cbag "C" fedc

 

(※)フレーズ整列にあたって、コンパイラはフレーズ名どうしの前後関係をチェックします。 このとき、前後関係が定まっていないフレーズの組があったり、トラックによって前後が入れ替わっているフレーズがあったりすると エラーとなります。このエラーが出ると対処が非常に難しいので、 上の例のように共通行を使ってフレーズ名を設定することを強くお奬めします。

 

 

 

 

 

 

 

 

?

 

Annex MIDI の文法(3)

 

音を飾る

 

チャンネル

 

 Annex MIDI では、チャンネルは ch で指定します。このとき . で区切って系統番号を指定することができ、MIDI出力先が複数ある場合に出力先を振り分けることができます (系統番号を指定しないと0番となります)。出力先の一覧はコントロールパネルのマルチメディア−MIDIで確認できます。 系統番号0番はここでの設定に従って出力され、 1〜15番はここで表示されている機器に出力されます (おそらくここで表示されている順番に上から1〜15となると思われます。 当方のマシンではそうなっていますが、全てのマシンでそうであるかは未確認です)。

 

【例】  A ch1                 // トラックAのチャンネルを1とする

              B ch2.3              // トラックBのチャンネルを第3系統の2とする

 

 

音色の指定

 

 音色は @ で指定します。音色を指定するときに . で区切ってバンク番号を同時に指定することができます。音色とバンク番号の指定は 0127 の数値を指定します。機種によっては音色番号が1番から128番までとなっていたり、 1017,2027などと、とびとびだったりするので、注意してください。

 

【例】  A @0                  // 音色を0番とする

【例】  A @33.7             // 音色を33番、バンク番号を7とする

【例】  A @.0                 // バンク番号だけの指定も可能

 

 通常のバンク番号指定では上位バイトのみ指定でき、その場合は下位バイトは0となりますが、 ここに . をもう一つ付けると下位バイトを指定することができます。

 

【例】  A @1.33.7         // 音色を33番、バンク番号を 33, 7 (上位,下位の順)とする

 

 

アトリビュート

 

 アトリビュートとはテンポやボリュームなど曲の飾り付けに関係するコマンドのことです。 これには大きく分けて小文字系と大文字系の2つがあります。

 

 小文字系はテンポとベロシティの2つだけです。 小文字系のアトリビュートは定義も変更もできません。

 

              t            // テンポ設定。1分間に演奏される4分音符の数を指定します。

              v           // ベロシティを決めます。そのトラックに対して効果を持ちます。

 

 大文字系は MIDI のコントロールチェンジやエクスクルーシブを送信するもので、チャンネルに対して効果を持ちます。このため、2つのトラックから同じチャンネルに出力してしまうことがあるので注意してください。

 

 大文字系のアトリビュートは基本的には自分で定義してから使うものですが、以下の4つはあらかじめ定義されています。

 

              D          // ピッチベンド

              M         // モジュレーションデプス[コントロールチェンジ 1 番]

              P          // パンポット[コントロールチェンジ 10 番]

              V          // ボリューム[コントロールチェンジ 7 番]

 

 アトリビュートの値は MIDI 規格のコントロールチェンジの値そのもので、0〜127です。

 ピッチベンドはコントロールチェンジではありませんが、 Annex MIDI では大文字系アトリビュートとして扱っています。 このため、ピッチベンドで指定できるのは上位バイトのみで、下位バイトは0が出力されます。

 

 

アトリビュート(時間変化)

 

 アトリビュートを指定するときに、すぐにその値にならずに徐々に変化するように指定することができます。小文字系にも大文字系にも有効です。

 

【例】  A M64 M127:2 c1 M64               // モジュレーションを少しずつかける

 

 M127:2 の部分が徐々に変化する場合の指定のしかたです。 この例では2分音符分の長さの時間をかけて M64 から M127 まで徐々に変化していきます。 アトリビュートコマンドは音符の間隔にあたる長さが0であることに注意してください。

 

 

 

アトリビュートの定義

 

 大文字系のアトリビュートは基本的にはコントロールチェンジ番号を割り当ててから使います。 これをアトリビュートの定義と言います。

 

【例】  A E=11

 

 このように、大文字で始まるコマンド名の後に = を書いてコントロールチェンジ番号を指定します。 この例の場合はコントロールチェンジの11番(エクスプレッション)が E コマンドとして定義されたことになります。そして、

 

【例】  A E100

 

のように、普通の大文字系アトリビュートとして使うことができるようになります。

 アトリビュートの名は大文字で始まる32文字以内の英字列です。名前に数字を含めることはできません。また、すでに使われているアトリビュート名を再定義しようとすると警告が出ます。定義はトラックを超えて有効なので、A トラックの最初にまとめて書いておくと良いでしょう。

 

 

エクスクルーシブ

 

 Annex MIDI には{ }でくくって数値を並べるとそれをそのまま MIDI 信号として送信する機能があります。例えば次のように記述します。

 

【例】  A { $f0 $7e $7f $09 $01 $f7 } r8 // GMシステム・オン

 

 (GM 規格に準拠している音源では、上のメッセージを受信すると「GM システム・オン」となり、GM の初期状態にリセットして GM スコアを正しく受信する状態となります)

 値と値の間はスペースで区切ります。一度に 255 バイトまで記述できます。値には 10 進数だけでなく、$ をつけた 16 進数を扱うこともできます。16 進数で使う文字 AF は、小文字(af)でも構いません。

 一般にエクスクルーシブコマンドの送信やその解釈には少々時間がかかるので、上の例のように送信後に適当な休符をいれるようにすると良いでしょう。

 エクスクルーシブメッセージを送信するときは、最初の $f0 (システム・エクスクルーシブ・メッセージ)と、最後の $f7 (エンド・オブ・エクスクルーシブ)を忘れずに指定してください。

 指定した値が16進数で 80 から ef までの場合は、下位の4ビットがch で指定した値から 1 を引いた値に置き換えられて出力されます。 例えば ch3 { $9f $3e $5f } では $92 $3e $5f の3バイトが出力されます。

 

 

エクスクルーシブ(チェックサム)

 

 機種によってはエクスクルーシブメッセージの中にチェックサムを必要とするものもあります。 そんな場合には Annex MIDI のチェックサムを計算する機能を使うと便利です。

 例えばマスターボリュームを 100 にするには次のようにします。

 

【例】  { $f0 $41 $10 $42 $12 | $40 $00 $04 100 s $f7 }

 

| はチェックサムを取りはじめる場所、 s はチェックサムの入る場所です。

 なお、マスターボリュームのようにパラメータを含むものは後に出てくる 拡張アトリビュート定義を使うか、引き数付きマクロを使う方がいいでしょう。

 例えば、マクロを使ったマスターボリュームの設定(GS規格)は次のようにします。

 

【例】  %MasterV { $f0 $41 $10 $42 $12 | $40 $00 $04 %1 s $f7 }

              A %MasterV( 100 )       // マスターボリュームを 100 にする

 

 

アトリビュートの拡張定義

 

エクスクルーシブを使用したアトリビュートを定義することができます。

例えば、マスターボリューム(GS規格)は次のように作って使います。

 

【例】  A MasterV = { $f0 $41 $10 $42 $12 | $40 $00 $04 v s $f7 }

              A MasterV 100               // マスターボリュームを 100 にする

              A MasterV 0:1^1                         // これも可能(あまりおすすめしません)

 

 定義の部分の v はパラメータの入る場所を示します。最後の例はフェードアウトをねらったものですが、大量のエクスクルーシブメッセージが 発生するのであまりおすすめしません。

(※)マスターボリュームは次のようにすると汎用性が高まり、 送信バイト数も少なくなっていいでしょう(GM規格)

 

【例】  MasterV = { $f0 $7f $7f $04 $01 0 v $f7 }           //マスターボリューム(GM規格)

 

 

 

文法の経緯

 

 Annex MIDI が作られて以来、何回か細かな文法の変更が行われています。

そのあたりの事情をここにまとめてみました。

 

 

音符の間隔のデフォルト値

 

 Annex MIDI ができてからずっと w コマンドのデフォルト値は w4 でした。

 めったに使われないので知られていないコマンドなのですが、w コマンドは音符の後に間隔の指定として : だけが書いてあったときの長さを設定するものです。つまり w コマンドのデフォルト値が w4 ということは、 : だけを書いた場合、デフォルトでは :4 と解釈されていた、ということです。

 w4 というデフォルト値は特に深く考えてのことではありませんでした。 Annex MIDI を作った当初は音符の間隔を指定する : にどういう機能を持たせたら便利なのかさっぱり分からなかったので、とりあえず l のデフォルトと同じ4分音符の長さを与えておいたのです。

 しかし使っているうちに、音符の間隔は「音長と同じか0」がほとんどであることが分かってきました。音符の間隔が音長と同じということは : を書かないということであり、 間隔が0ということは & または :0 を書くということです。つまり、: を書いたら、その後には 0 が続くことが圧倒的に多いことが分かったのです。それならば : だけを書いた場合には間隔0となるように w0 をデフォルトにすると便利です。ふう。ややこしい。

 

 こうして、 w コマンドのデフォルト値が w0 となりました。

 

 互換性についてはほとんどの場合影響ないと思いますが、過去のMMLを鳴らすときにタイミングがずれる部分があるかもしれません。 この変更点を気に留めておいてください。

 

 

& について

 

 いままでは & には2つの役割がありました。 一つは音符の間隔(以前はウェイト長と呼んでいたもの)を0にする役割、もう一つは発音のタイミングをずらして鳴り終わるタイミングをそろえる場合に 簡単に書き表せるようにする役割です。

 ところがこの第二の役割ですが、機能が複雑すぎるためか使われた例は皆無に近く、無くても困らないくらい影の薄い機能というのが実情でした。そして、ここへきて第一の役割が前述のように : にとってかわられることとなり、 & はその存在が必須ではなくなりました。

 そこで、これを機に & はなるべく使わない方向で進めていく方針としました。

 ただし間隔を0にする記号(第一の役割)としての & は、これまでマニュアルでも積極的に使用を薦めたため広く使われており、当面はノーエラー扱いとしてサポートを続けます。第二の機能は積極的に削ることはしませんが、サポートの継続はしません。 バージョンアップの際に無くなるかもしれません。

 

 

キーシフト

 

 いままでは音符別のキーシフトは \ というコマンドでしたが、これを k に変更しました。 \ という文字は \n \t などのように制御文字を表すエスケープ記号として使われることが多いので使用を避けました。また、ks コマンドを楽譜の入力が便利になるよう追加しました。

 当面は従来の \ コマンドはエラーとせず警告扱いとするつもりです。

 

 

音色マクロ

 

 これは % @ に代わっただけで、 % を使ったマクロと全く同じです。 内部での扱いも全く同じで、例えば %name @name は区別されません。

 

【例】  @Piano1 @0 v80            // @ の後ろに数字があると従来のプログラム・チェンジになる

              @Organ1 @16 v%1                                    // ベロシティを引数として定義

              A @Piano1 cde @Organ( 60 ) efg           // 音色マクロ使用

 

 ちなみにマクロ名は数字で始まることはできないので、%16 と書くのはエラーとなりますが、 @16 は上の例にもあるようにエラーとならずに従来のプログラムチェンジコマンドとして機能します。MIDI機器毎に良く使う音色を登録しておいて、数字でなくわかりやすい名前で呼び出して使うという場面を想定しています。

 使用例はあまりないのですが、当分の間存続させてみる方針です。

 

 

ループ内での設定変更

 

 ほとんどのコマンドがそのコマンドを書いた直後から有効となり、 次にそれを変更するコマンドが現れるまで効力が続きます。これがループ機能と絡むと複雑な問題となります。

 

【例】  A l4 [cc l8 dd]2                // ループの途中で l コマンドを使う

 

 上の例ではループ1回目の cc c4c4 と解釈されそうですが(実際そう解釈される)、 2回目はどうなるでしょうか? 現在の仕様では、この例の l コマンドの場合はループを展開する前に評価されて [c4c4 d8d8]2 となり、 最終的には c4c4 d8d8 c4c4 d8d8 となります。 l コマンドのほか、o, <, > のオクターブもこれと同じ扱いで、 評価されてから展開されます。

 これとは異なるのが次の例です。

 

【例】  A D64 [cc D100 dd]2 D64           // ループの途中でアトリビュートを変える

 

 この例の場合は D64 cc D100 dd cc D100 dd D64 と、 ループと一緒に展開されてから評価されます。

 アトリビュートは小文字系も大文字系も全てこれと同じ扱いです。q コマンドもこれと同じくループの展開後に評価されます。

 どれをループの展開前に評価するかは MMLを設計する側にとってものすごく悩ましい問題です。 アトリビュートの一つであるベロシティ( v )をループ展開前に評価していたこともありました(現在は展開後に評価) q コマンド(展開後に評価)も両者の境界線上にあって、設計の悩みのタネです。

 現在のところ仕様を変更する予定はありませんが、 この仕様に寄りかからない書き方をしておくことをお勧めします。例えば、ループ内でアトリビュートを変更する時には ループの先頭に元のアトリビュートを書くようにすると確実です。

 

 

ループ内での設定変更(2)

 

 Annex MIDI を設計した当初はループ内でオクターブを変えたり l, q コマンドを使用した場合には、それはループ内でのみ有効で、ループを出ると元に戻るようになっていました。 これは一時的にオクターブを変えたい場合などに [ ] でくくって1回ループとすれば、 前後に影響を与えずに済むので便利だとの発想からです。しかし、過去の曲データが正常に鳴らない、 想定したようなニーズがない、などの事情があり、 この仕様はだいぶ揺れました。

 現在では l コマンドのみこの機能がはたらくようになっています。当面は現状固定としますが、将来この機能が無くなっても困らないように、こまめに l コマンドを書くなどの対策をとってください。一般に、こまめに書いておくとあとでソースが見やすくなるので、その意味からもおすすめします。 「あちこちで設定変更があって後で値を調整するときに大変だ」という場合には マクロをおすすめします。

 

【例】  %full l4

              %half l8

              A %full ccc< ccc >  %half crcrcr< crcrcr >

 

上の例では %full %half の定義を変更すれば 全体をいっぺんに変えることができます。

 

 

共通トラック

 

 従来は共通トラックとして次のような複雑な指定もできるようになっていました。

 

【例】  *~A-G  // A から G 以外の文字で始まる名前を持つトラック

【例】  *A-Q~I-K         // A から Q で始まる名前を持つトラック。ただし I から K をのぞく。

 

 このように、X, X-Y, ~X, ~X-Y のいずれかの形を並べて書きます。 スペースはトラック指定の終わりとみなされるので、スペースをはさまずに並べる必要があります。評価は素直に左から右へと行われます。例えば、*A-Q~I-KIJ 一旦除かれた I J が復活して A から Q ただし K を除く」となります。

 しかし、複雑な割にはメリットがなく、全然使われていません。今後、共通トラックの機能は残しますが、除外の表記についてはサポートしません。

 

 

行内コメント

 

 いまのところ、C / C++ 言語と同じように /* */ で行内にコメントが書けるようになっていますが、ほとんど使用例がなく、廃止の方向で検討中です。

 

 

チャンネル指定

 

 MS-DOS版の Annex MIDI MIDI ドライバの役割もあわせもっていて、 MPUボードとRS−232Cの両方から出力できる機能が特徴となっていました。 この2系統の出力を切り替えるために chm che という2つの チャンネル設定コマンドがありました。

 これらは Windows 版になったときに MIDI 出力が1系統となり、 複数のチャンネル設定コマンドが不要になって、 ch に一本化されました。が、 現在でも互換性維持のため使えるようになっています。 (警告を出したうえ ch と同じ意味に解釈します。)

 あくまで互換性維持のために残してあるだけなので 見つけしだい ch に直してください。

 

1999.12 のバージョンから系統切り替えが使えるようになりました。今度は ch1.2 のように . を付けて系統を数値で表現するようになっています。