※このブログは、今は亡き「はてなダイアリー」で公開していた日記を移行したものです。

  • はてなハイク方面から来られた方へ
    • ハイク的なノリはあまり期待しないでください。。
  • WAKWAK方面から手繰って来た方へ
    • ここには USB 関係の情報はありません。
    • ここには Expat 関係の情報はありません。
    • 今のところ X68000 PRO/XVI とも復活の予定はありません。

MML記法についてまとめてみる

何となく自分用に欲しくなったので、はてなMML記法(と言うか FlMML の記法)についてまとめてみる試み。他にもっとまともなものを作ってる人がいそうな気がするけど気にしない方向で。ついでに、作者のページに書いてないことが書いてあったりもするけど、そっちも気にしない方向で(汗)。

※以下、 という風に < > で英大文字を囲ったところには
※ユーザーが指定した数値が入ると思って読むべし。
※また、{N} という風に { } で英大文字を囲ったところには
※1つ以上の音が連なったものが入ると思って読むべし。

(最終更新: 2007.11.11)

音(音階)

音名
cdefgab で、それぞれハ長調のドレミファソラシを表現。
例: ceg = ドミソ, cdefedc = ドレミファミレド
変化記号
音名の直後に + もしくは # を付けると半音上げ(♯に相当)、- を付けると半音下げ(♭に相当)になる。
一般的な楽典の♯や♭と違い、付けた音だけに働く。
例: g+g# = ソ♯ソ♯, aa-a = ララ♭ラ
オクターブ
o (0 ≦ ≦ 8) で指定。初期状態では多分 4。
相対指定として < でオクターブ 1 上げ、 > でオクターブ 1 下げ。*1
例: o4cder o5cdero4cder < cder は同じ。
休符
r で表現。

音価(音の長さ)

音長
音階や休符の後に数値を付けることで、音価を指定できる。4 は四分音符、8 は八分音符を表し、数値が大きいほど短くなる。基本的には 2 の累乗 (1, 2, 4, 8, 16,...) が入る。省略した場合はデフォルト値(後述)が使われる。
例: c4 = 四分音符のド
付点音符
音長の後ろに . (ピリオド)を置くと付点音符となり、音長が 1.5倍になる。
複付点(1.75倍)もいちおうできるっぽい。← やっぱダメかも。
例: a8. = 付点八分音符のラ
デフォルト値
l を置くと、以降音長の数値指定のない音の音価 と見なされる。付点を付けても無視される模様。
l もない場合(=初期状態)は多分 4。
例: e8e8e8e8l8 eeee は同じ。
タイ
同じ音階の音の間に & を置くことで表現。前後の音の音長を足した長さの音として音を鳴らす。
例: c2&c8 = 二分音符+八分音符の長さのド
連符
等分される音価の値を 3倍することで三連符は表現可能。
理屈では五連符などもできそうな気がするが、どうだろうか。
例: l12cde = 四分音符長を 3等分したドレミ (4 x 3 = 12)

表現

スラー
異なる音階の音の間に & を置くことで表現。
例: c&a = ドとラを滑らかに繋げる
ゲートタイム
q で指定。指定した音長に対して、実際に音を鳴らす時間を /16 にする。スタッカートなどの表現に使う。初期状態では多分 15。

その他基本

テンポ
t で指定。BPM で、省略時は多分 120。
ベロシティ(音量)
v (0 ≦ ≦ 15) で指定。数値が大きいほど音量も大きくなる。初期状態では多分 12 くらい。

音色

波形
@ で指定。
= 0 : サイン波
= 1 : ノコギリ波
= 2 : 三角波
= 3 : パルス波
= 4 : ホワイトノイズ
ノコギリ波には 2種類あるが、どちらかは未確認。
パルス幅(デューティ比)
@w (0 ≦ ≦ 100) で指定。波形が = 3 の場合に、パルス幅を指定する。初期状態は 50 で、所謂「矩形波」になる。
ノイズ
@n (0 ≦ ≦ 127) で指定。波形が = 4 の場合に周波数を指定する。値が大きいほど低い感じの音になる。無指定では 0 扱いだと思うけど自信なし。
エンベロープ
@E1,<A>,,<S>, で指定。(0 ≦ <A>,,<S>, ≦ 127)
音の音量の変化を指定する。各パラメタの一般的な意味は以下の通りだが、MML記法でも同じかは未確認。
<A> : アタック = 音が鳴り始めてから最大音量に達するまでの時間。
: ディケイ = 音量がサスティン値まで下がるまでの時間。
<S> : サスティン = 持続音の音量。この音量を、鳴り始めから音長分の時間が経つまで維持する。
: リリース = サスティンの維持時間が終わった後、実際に音が消えるまでの時間。

パート

トラック
{A} ; {B} と記述。{A} の後に {B} を演奏するのではなく、{A} と {B} を同時に演奏する。 {A} ; {B} ; {C} ; ... と複数連ねることは可能だが、制限があるかは未確認。
多分、最後のトラックの後には ; は入れない方がいいと思う。それと、l や q などは ; を越えて次のトラックに影響するっぽい。(その割に、むしろ影響してほしい t は越えない。) ということもあるので、この辺りの設定は各トラックの頭で必ずやっておくのが吉か。

便利系

繰り返し
/: {A} :/ あるいは /: {A} / {B} :/ と記述。
前者は {A} を 回繰り返して演奏する。後者は {A} {B} を 回繰り返すが、 回目の繰り返しでは {B} を演奏しない。 を省略すると 2 が指定されたと見なされる。
いちおう繰り返しの中に繰り返しを入れても大丈夫のはず。
マクロ
${マクロ名}={A}; と書かれたトラックはマクロ定義と見なされ、MML中で ${マクロ名} と記述すると {A} が書かれたものと見なされる。
{マクロ名} は正規表現[a-zA-Z_][a-zA-Z_0-9#\+\(\)]* にマッチすることが必須。
マクロ定義は、実際に使用するトラックよりも前に置かれている必要がある。(必ずしも先頭である必要はない。)

*1:OPMDRV / Z-MUSIC 方面の人は問題ないと思うけど、PMD系の人は上げ下げが逆になるのでやりづらいだろう。