MMLとはMusicMacroLanguageの略で、演奏情報をテキストで表現する為の言語*1になります。
A @0o4v12l8 cdefgab>c
例えば上記はOPMのチャンネルA(8チャンネル中)で、音色番号0、オクターブ4(9段階中)、音量12(15段階中)、音長8分音符でドレミファソラシドを演奏することを表しています。
note.xにもドキュメントは付属していますが、PC-98x1系の音源ドライバと勝手が違うところもあるようなので復習も兼ねて自分用に解説をつらつらと書いていこうと思います。
ちなみにmxcのMML仕様もほぼ同じなのである程度は参考にできると思います(mxcの方は流し読み程度なので保証はできませんが)
行頭にA〜Hを記載することでOPMの8つあるチャンネルのどれに対する演奏情報なのかを定義します。チャンネル定義の後には半角スペースが必要です。
ABC @0o4v12l8 cdefgab>c
以上の様に記載することで複数のチャンネルに対して同じ演奏情報を定義することも可能です*2
※実際にはP〜Wのチャンネルもありますが、こちらはPCM用で現状のGIMICでは利用することはできません。
cから順にドレミファソラシに対応します。休符は'r'、シャープは'+'、フラットは'-'、ナチュラルは'='で表すことができます*3*4
A cdefedcr efgagfe crcrcrcr ccddeeff edcr
上記はかえるのうたをMMLで記載した物です。ドレミファミレド休符、ミファソラソファミ休符、ド休符ド休符ド休符ド休符、ドドレレミミファファミレド休符を表しています。
音長は音符の直後に記載します。1が全音符、2が2分音符…と最大で128分音符まで表現することができます。3連符を表現する時は分割したい音長に3をかけてやることで表現することができます。
例えば全音符を3分割したい時は1×3で"3"、2分音符を3分割したい時は"6"を記載します。ただし128分音符の3連符は表現することができません。64分音符の3連符"192"までです。
また音長の後に"."を付けることで付点を表現することができます。"4."は付点4分音符になります。
A c4d4e4f4e4d4c4r4 e4f4g4a4g4f4e4 c4r4c4r4c4r4c4r4 c8c8d8d8e8e8f8f8 e4d4c4r4
先ほどのかえるのうたに音長を記載したものです。
音長をいちいち記載するのは面倒なのでlコマンドを使って音長を省略することができます。
A l4 cdefedcr efgagfe crcrcrcr l8 ccddeeff e4d4c4r4
上記のかえるのうたの音長をlコマンドを使って簡略化した物です。lコマンドで音長を省略中でも音符の後に音長を記載すればその通りに演奏されます(最後のe4d4c4r4の部分)
なおlコマンドはチャンネル毎に独立していますので注意してください。
A l4
B l8
AB cdefedcr efgagfe crcrcrcr
このように記載した場合、Aチャンネルは4分音符で、Bチャンネルは8分音符で演奏されます。
基本的に各コマンドはチャンネル毎に独立しています。全チャンネルで共通なのはハードウェアLFOくらいになります(これはまた後述します)。
ステップ表現とはMXDRVが処理を行うタイミング(1ステップ)で音長を表現する手法になります。
全音符は192ステップ*5、2分音符は96ステップ、4分音符は48ステップとn分音符が進むにつれステップ数は半減していきます。
全音符(192ステップ) ÷ n分音符 = n分音符のステップ数
計算式は上記になります。なお64分音符を3等分(3連符)した192分音符が1ステップとなる為、192分音符以上を表現することはできません。
ステップ表現は演奏のモタりや先走りを表現したい時や5連符や7連符を再現したい場合に使います。
5連符の表現方法は5等分したいn分音符のステップ数を上記式から求めて5で割ります。
しかし実際には5や7で割り切ることができない為、音長を足したり削ったりして帳尻合わせをする必要があります。
例えば4分音符(48ステップ)の5連符を再現したい場合は音符1つ辺り48ステップ÷5で9ステップになりますが余りが3ステップ出てしまいます。
このような場合は以下のように余った3ステップを適当に割り当ててしまいます。
A c%10d%9e%10f%9g%10
厳密には5連符とは言えませんが聞いた感じでは5連符っぽい何かになります。余りや不足分の割り当ては自分の好みでやってみるのが良いでしょう。
上記でステップ数での連符の表現方法を記載しましたが、note.xではこれを自動で行ってくれるコマンド'{}'があります。
A {cdefg}4
上記は4分音符を'cdefg'で5等分しています。{}の中に書いた音符の数で指定した音長を等分して割り当ててくれます。
音長は加減算することが可能です。足す場合は'^'、引く場合は'˜'を使います。
A c4^8 (付点4分音符と同義)
A c%48^%24 (付点4分音符と同義)
A c4~8 (8分音符と同義)
A c%48~%24 (8分音符と同義)
A c%48~8 (n分音符表記とステップ表記を混在させることも可能)
ただし加減算した結果のステップ数は%1〜%256の範囲収まっている必要があります。
音符同士を繋ぐ時は'&'を使います。前後が同じ音階であればタイ、違う音階であればスラーとして機能します。
A c1&c1
A c1&d1
音長の加算は'^'でも行えますがステップ数が%256を超える物は表現できません(例えば上記の様に全音符同士を結ぶ場合)*6
通常、音長を加算したい場合はタイを使った方が良いでしょう。
なおMXDRVでは'&'直後の音符を省略することができません(c1&1の様な表現はできません)
オクターブを定義します。note.docには値の範囲として-2〜10と記載がありますが実際に利用できるのはo0d+〜o8dまでのようです。
また相対指定をすることも可能で'<'でオクターブを一つ下へ、'>'でオクターブを一つ上に変更することができます。
A o3cdefgab>c<bagfedc
上記はオクターブ3でドレミファソラシ(オクターブ+1)ド(オクターブ-1)シラソファミレドを意味しています。
音色番号を指定します。なおMXDRVは音色を内蔵していませんので別途定義してやる必要があります(音色定義は後述する…予定)
音量を16段階で指定します。0は無音で15が最大です。
実際の所、OPM(YM2151)は128段階の音量設定を持っていますが、大雑把に音量を指定する時に使います。*7
音量を128段階で指定します。0は無音で127が最大です。
値が1上がる毎にそのチャンネルの音量が0.5dBずつ上がります。
このコマンド直後にある音符だけを指定した音量に変更します。
'x'が'v'に相当する物で値は0〜15の範囲、'@x'が'@v'に相当する物で値は0〜127の範囲を持ちます。
A @v100 cde @x120 e f
上記の例では'cde'と'f'@v100で、'e'が@v120で演奏されます。
音量をv(@v)で指定した値から相対的に変化させます。')'で音量を増加、'('で音量を減少させることができます。
A @v100 cde )20 e (20 f
上記の例では'cde'と'f'@v100で、'e'が@v120で演奏されます(アクセントで出した例と同じ結果になります)
そのチャンネルの音声出力を左から出すか、右から出すか、両方から出すかを指定します。
値 | 音声出力 |
0 | 無音 |
1 | 左 |
2 | 右 |
3 | 左右 |