t[1]:テンポt100 cdefg;
上記では、通常のテンポ指定(BPM=100)を行っています。
t3600/28 cdefg;
上記では、除算表記によるテンポ指定(BPM=128.5714…)を行っています。
この計算に辿り着く流れは次の通りです。
1 あたり 1/60秒の前提16分音符の tickカウントが 7 になるようなテンポにしたい場合、1ビートである 4分音符は 28ticks になる28 * 1/60BPM = 60 / (28/60) = 3600/28l4 t120 cde t#-20 def t#-20 efg t#+40 c1;
上記では、だんだんゆっくりにするテンポ指定(1)を行っています。
t120 で開始しているので、
t#-20 def は、この場合 t100 で演奏、
t#-20 efg は、この場合 t80 で演奏、
t#+40 c1 は、この場合 t120 で演奏されます。
#」は前回 t に設定した値として解釈されます。トラック先頭で「#」を使用した場合は、初期設定値になります。#」は他のトラックで指定したテンポ値を参照出来ないので注意してくださいl4 t120 cde t#*0.5 def t#*0.5 efg t#*4 c1;
上記では、だんだんゆっくりにするテンポ指定(2)を行っています。
t120 で開始しているので、
t#*0.5 def は、この場合 t60 で演奏、
t#*0.5 efg は、この場合 t30 で演奏、
t#*4 c1 は、この場合 t120 で演奏されます。
テンポを設定します。
引数[1]には、1分間のビート数(BPM)を指定します。小数以下の指定も受け付けます。
トラック先頭における初期設定は「t120」、1ビートは4分音符です。
1ビートの音長設定は、次の設定(beat_length)に従います。
#MB:CONFIG {
tempo_unit: note_ticks=[]: beat_length=[],
}
また、前回テンポ設定値に対する相対指定を行いたい場合は、数式解釈機能における「#」コマンドを利用します。
ただし、この相対指定における「前回」とは同一トラック内での指定値を指します。MMLコンパイラの都合、他のトラックにおける過去指定を認識できないので、利用シーンは同一トラック内で徐々にゆっくりさせる指定を行う場合などです。
テンポコマンドでは、同時点の全てのトラックに対し影響します。
テンポ同期の内部手順は次の通りです。
MMLコンパイル中に受け取ったテンポコマンドは、テンポ専用のシステム管理トラックに、一旦全て記録します(全トラック分を集約)。
全てのトラックのMMLコンパイルが終わった後、テンポ専用トラックを読み、各トラックの同時点に対し、テンポコマンドを挿入する。
以上です。
同時点かどうかの管理には、再生開始からの累積tickカウント数を使用しています。
テンポの精度は、内部におけるtickカウント数あたりの再生サンプル数(整数)をいくつとするかの計算に依存しています。(再生サンプリング周波数が上がるとテンポ精度も上がります)
複数トラックで、同時点に、指定値の違うテンポコマンドを記述した場合、後のトラックに記述したテンポコマンドが使われます。
内部的に、同時点のテンポコマンドは、先に定義されたトラックのものから順に各トラックに配信されるため、結果的に最後のトラックに記述したテンポコマンドが有効になります。
トラックごとにテンポの同期を厳守しようとする設計思想になっています。この設計は、無限リピートの仕様にも影響しています。