このページでは、実際に書かれた MML 曲を 1 つずつ読み解きながら、どのコマンドがどんな表現に使われているかを解説します。コマンド単体の仕様は MML リファレンスを参照してください。
Ubiquitous Letters
mewlist 作のデモ曲です。8 チャンネル(A〜H)を使い、ベース・リード・パッド・アルペジオが絡む構成になっています。出典: Gist
全文
# Ubiquitous Letters - mewlist
A T135
ABCDEFGH {=*} PC $glissando=32 $BendRange=2
A L16 Q1 PL64 $Accent=On V100 v60
B L16 Q8 LV12 $accent=on V60 v30
C L16 Q8 LV12 $accent=on V50 v30
D L1 Q8 V127
E L1 Q8 V100
F L1 Q8 V64
G L1 Q8 V32 K7
H L16 Q1 V127 PR64
% SeqA !Xxrx ) rxXx ) rrXr ) rxXr ( Xxrx ( rxXx ( rxxr rXxr
A o3 [C ^g >d E <E ^b >g D<]4
A o3 [C ^g >d E <E ^b >g D<]4
A o3 [C-^g >d E <E ^b >a G<]4
A o3 [C-^g >d E <E ^b >g- D<]4
B o5 !X{D} [%SeqA]4
C o5 !X{E} [%SeqA]2
C o5 !X{G} [%SeqA]1
C o5 !X{G-} [%SeqA]1
D o2 a1+1 x_4>c1+1 <b1+1 x_4>d1+1
E o3 e1+1 x_4 g1+1 g1+1 x_4 a1+1
F o4 <a2 x_4>c1+1 x_4e1+1 d1+1 ~ f#&x2
G o4 <a2 x_4>c1+1 x_4e1+1 d1+1 ~ g&x2
H o4 [ v100 [ {g^>cef#gb<}2 (50 ]2 r1 ]2
H o4 [ v100 [ {d^g>df#a>d<<}2 (50 ]2 r1 ]2
それでは、上から順番に読んでいきましょう。
1 行目: コメント
# Ubiquitous Letters - mewlist
# で始まる行は無視されます。曲のタイトルや作者名のメモに使えます。; 以降のコメントも同様です。
テンポ設定
A T135
チャンネル A に T135 でテンポ 135 BPM を指定しています。T はスタンドアローン再生時に BPM スライダを変更するコマンド。DAW の中で使うときは無視され、DAW 側のテンポが優先されます。
全チャンネル共通の初期化
ABCDEFGH {=*} PC $glissando=32 $BendRange=2
ここがポイント。チャンネル名を連結すると、その全部に同じコマンドを適用できます。ABCDEFGH の後にスペースを置いて続けるコマンドが、A〜H 全部に効きます。
| トークン | 何をしているか |
|---|---|
{=*} |
調号を全リセット(C メジャー扱い) |
PC |
パンをセンターに |
$glissando=32 |
グリッサンドのデフォルトステップを 1/32 に |
$BendRange=2 |
ピッチベンドレンジを 2 半音に |
各チャンネルの初期設定
A L16 Q1 PL64 $Accent=On V100 v60
B L16 Q8 LV12 $accent=on V60 v30
C L16 Q8 LV12 $accent=on V50 v30
D L1 Q8 V127
E L1 Q8 V100
F L1 Q8 V64
G L1 Q8 V32 K7
H L16 Q1 V127 PR64
チャンネルごとに「デフォルト長さ・ゲート・パン・ベロシティ」をまとめて設定しています。
| コマンド | 効果 |
|---|---|
L16 |
デフォルト長さ = 16 分音符 |
L1 |
デフォルト長さ = 全音符(ロングトーン用) |
Q1 |
ゲートを最短(スタッカート、1/8) |
Q8 |
ゲートを最長(フルゲート) |
PL64 |
パン 左 64(左寄り) |
PR64 |
パン 右 64(右寄り) |
$Accent=On |
アクセントモード ON → 大文字=V、小文字=v のベロシティを使い分け |
V100 v60 |
アクセント時 100、非アクセント時 60 |
LV12 |
( ) で増減するときのステップ量を 12 に(デフォルト 8) |
K7 |
キーを 7 半音上げる(G チャンネルだけ移調) |
$accent=on のように小文字で書かれている箇所もありますが、設定値は同じ意味で通ります。
マクロ(エイリアス)の定義
% SeqA !Xxrx ) rxXx ) rrXr ) rxXr ( Xxrx ( rxXx ( rxxr rXxr
% で始まる行は エイリアス(マクロ)の定義。SeqA という名前で、16 音分のリズムパターンを 1 つにまとめています。
中身を分解すると:
| トークン | 意味 |
|---|---|
!X |
変数 X を展開(後で各チャンネルで違う音名を入れる) |
x |
直前と同じ音程で再発音(小文字 x は非アクセント側) |
X |
同じく再発音(大文字 X はアクセント側) |
r |
休符(小文字 r) |
) |
ベロシティを LV 分(ここでは 12)上げる |
( |
ベロシティを LV 分下げる |
つまり「X / x / r」を組み合わせたリズムを、ベロシティを ) ) ) ( ( ( でだんだん大きく → だんだん小さくしながら鳴らす、というクレッシェンド/デクレッシェンド付きのパターンになっています。
チャンネル A: 主旋律 + スラー
A o3 [C ^g >d E <E ^b >g D<]4
A o3 [C ^g >d E <E ^b >g D<]4
A o3 [C-^g >d E <E ^b >a G<]4
A o3 [C-^g >d E <E ^b >g- D<]4
o3で開始オクターブを 3 に(小文字oでも通ります)[ ... ]4で 4 回繰り返し^は スラー:C ^gは「C を弾いて、そのままアタックなしで g に繋ぐ」イメージ><で音符ごとにオクターブを上下C-は C♭(フラット)。-は音名の後ろに付ける(g-なら g♭)- 同じパターンを少しずつ変えながら 4 行並べることで、長いフレーズの中に微妙な変化を作っています
チャンネル B, C: 変数とマクロでリズムパート
B o5 !X{D} [%SeqA]4
C o5 !X{E} [%SeqA]2
C o5 !X{G} [%SeqA]1
C o5 !X{G-} [%SeqA]1
| トークン | 意味 |
|---|---|
!X{D} |
変数 X に D を代入(インライン定義) |
%SeqA |
先ほど定義したエイリアスを展開 |
[%SeqA]4 |
SeqA を 4 回繰り返す |
これにより、SeqA 内の !X がそのチャンネルの音名(D / E / G / G♭)に置き換わって展開されます。変数はチャンネルごとに独立なので、B の X と C の X は別物として扱われます。
C チャンネルは [%SeqA]2 → [%SeqA]1 → [%SeqA]1 と、途中で変数を E → G → G♭ と入れ替えながら 4 周分のフレーズを変化させています。
チャンネル D, E: ロングトーン + ピッチベンド
D o2 a1+1 x_4>c1+1 <b1+1 x_4>d1+1
E o3 e1+1 x_4 g1+1 g1+1 x_4 a1+1
ここで初登場のトークン:
| トークン | 意味 |
|---|---|
a1+1 |
長さ 1+1 = 全音符 + 全音符(2 小節分のロングトーン) |
x |
直前と同じ音程で再発音 |
x_4>c1+1 |
x からピッチベンド開始 → 4 分音符の時間で >c1+1 へ移行(全体は 1+1 の長さ) |
つまり「2 小節伸ばす → 次の音に向かってベンド → また 2 小節伸ばす」を交互に繰り返す、ベースラインらしい動きです。
ピッチベンドの構文は 起点音(遅延) _ (遷移時間) 目標音(全体長) というルールで、ここでは:
x= 起点音(直前と同じ音程)_4= 遅延 = 4 分音符(実は「全体長 − 遷移時間」の流れで読むと、4 分の時間でベンドする、と解釈してもよい)>c1+1= 目標音
詳しい構文は MML リファレンスのピッチベンド節を参照。
チャンネル F, G: グリッサンド付きパッド
F o4 <a2 x_4>c1+1 x_4e1+1 d1+1 ~ f#&x2
G o4 <a2 x_4>c1+1 x_4e1+1 d1+1 ~ g&x2
新しい記号:
| トークン | 意味 |
|---|---|
~ |
グリッサンド。d1+1 ~ f#&x2 は「d を全音符 2 つ分鳴らした後、f# までグリッサンド」 |
& |
タイ。f#&x2 は f# と次の x を繋げる($TieMode=Slur の場合、再アタックなし) |
f# |
f+ と同じ(F シャープ) |
G チャンネルには冒頭で K7 が指定されていたので、書かれている音名から 7 半音上にシフトして鳴っています。F と G で同じ音型を書いても、結果として F は元のキー、G は完全 5 度上で重なる仕掛けです。
チャンネル H: タプレットによる高速アルペジオ
H o4 [ v100 [ {g^>cef#gb<}2 (50 ]2 r1 ]2
H o4 [ v100 [ {d^g>df#a>d<<}2 (50 ]2 r1 ]2
ここのキモは タプレット(連符) の { }。
| トークン | 意味 |
|---|---|
{g^>cef#gb<}2 |
中身の音を全部合わせて 2 分音符の長さ に押し込める |
g^>c |
g からスラーで >c に繋ぐ(タプレット内でも ^ & は機能) |
> < |
タプレット内のオクターブ変更は { } の外にも持続 |
(50 |
ベロシティを 50 下げる(その場限りの強い減算) |
r1 |
全音符の休符 |
外側の [ ... ]2 2 重ループで、「アルペジオ x2 → デクレッシェンド → 全休符」を 2 回繰り返す構造になっています。同じパターンに対して、音型を少し変えた 2 行目を書くことで、A セクション / B セクション的な切り替えが生まれます。
この曲で使われている機能の早見表
ここまで読めば、以下のコマンドは一通り体感できているはず。詳しい仕様は MML リファレンス で確認できます。
構造系
- 複数チャンネル同時記述(
ABCDEFGH ...) - 繰り返し
[...]N、入れ子可 - エイリアス
% Name 内容、%Nameで展開 - 変数
!X{値}でインライン定義、!Xで展開(チャンネル独立)
音程・長さ系
- オクターブ:
On/</> - 臨時記号:
C+C#C-C= - 長さ加減算:
1+1、4-32など - 同音再発音:
X/x(アクセント対応) - 休符:
R/r
表現系
- スラー
^— フルゲートで連結 - タイ
&—$TieModeで挙動切替 - ピッチベンド
_— 起点・遷移時間・全体長を柔軟指定 - グリッサンド
~— クロマティック補間 - タプレット
{...}N— 連符
設定系
- デフォルト長さ
L、ゲートQ、パンP/PL/PR/PC - キーシフト
K、調号{=*}{+f}{-eab} - アクセント
$Accent=On+V/vの使い分け - 増減ステップ
LV(=lv)、()で増減 - ピッチベンドレンジ
$BendRange - デフォルトグリッサンド
$glissando
次のステップ
サンプルを写経して動かしたら、以下を試してみてください。
- テンポを変える:
T135をT90やT180に - 音色を変える: ヘッダの Settings から各チャンネルの波形と ADSR を変更
- キーを変える:
K7の数値をK3やK-5にして響きの違いを楽しむ - マクロ書き換え:
% SeqA ...の中身を書き換えると 4 チャンネル分のリズムが一気に変わる
慣れてきたら、自分で短いマクロや変数を組み合わせてリズムパターンを作るところから始めると、構造化された MML が書けるようになります。