V3MMLmanual

5.7 @rp:無限リピートエントリ

← 目次

【記述例】

cegec
@rp
dfafd dfafd;

上記の場合、「dfafd dfafd」が無限リピート演奏されます。

【解説】

無限リピートエントリを登録します。

このコマンドを記述したトラックでは、演奏がトラック終端に達したら、@rp を記述した時点に演奏ポイントが無条件ジャンプします。そのため、結果的に無限リピートになります。

無限リピートコマンドを使用する場合は、対象となるトラック内で「1回だけ」記述してください。

無限リピートコマンドは、テンポコマンドの使用状況と大きく関わっています。
理由は、各トラック間でのテンポ同期を確保するためです。
テンポ同期の都合、無限リピートの処理モードを、テンポコマンドの配置の仕方によって変えています。


規制緩和モード

このモードは、テンポコマンドが、演奏先頭(0 tick時点)にのみ存在する場合に該当します。

規制緩和モード の場合の @rp 使用条件:

以上により、無限リピートの自由度が高まりますが、音楽的におかしなリピートも可能になるため、ユーザー側でリピート状況を確認する必要があります。


厳密モード

このモードは、テンポコマンドが、演奏先頭だけでなく、それ以外の時点にも存在する場合に該当します。 厳密モードでは、テンポ同期を厳守する目的で、無限リピートに関する制限を厳しくしています。

厳密モード の場合の @rp 使用条件:

厳密モードによる制限の理由:

テンポの変更は、演奏サンプリング周波数(384kHz)に依存した、内部音長である「絶対tickカウント数」の設定変更により実装されています。絶対tickカウント数の操作は、テンポ計算にのみ任されているので、ユーザーは普段意識する必要はありません。

複数回テンポ変更する無限リピート対象トラックで、厳密モードによって制限しないと、見かけ上テンポのつじつまを合わせたとしても、使用する音長の種類と個数の違いによって、簡単に内部音長である絶対tickカウント数が合わなくなって、テンポを同期させることができなくなります。(システム都合のテンポ非同期が発生します)

そのため、厳密モードでは、無限リピートで何周したとしても同期するよう、テンポ変更のタイミング、無限リピートエントリの位置、トラックの演奏tickカウント数の合計を合わせることを条件にしています。

(※1)の制限は、2周目以降のリピートに対応する同期が、無限リピートしないトラックに対して行えないために設けています。


【備考1】@rpの優先配置

@rp コマンドは、MMLコンパイル時、同時点(演奏開始からの累積tickカウント数が同じ時点)に存在する他のコマンドより前に配置されます。

@@"pls" v8 cdefg @@"saw" v12 @rp gfedc;

例えば、上記の記述の場合、見た目では
@@"saw" v12
が無限リピート開始時に実行されないように見えます。しかし、内部的には次のようになります。

@@"pls" v8 cdefg @rp @@"saw" v12 gfedc;

上記のように、@rp が同時点コマンド群の先頭に自動配置されるため、同時点のコマンドは すべて無限リピートエントリ時に実行の対象になります。

この自動配置の目的は、テンポコマンドの実行もれ防止です。@rp と同時点にテンポコマンドが存在した場合の、実行もれを防止することで、テンポ同期が取れない状況が発生しないようにしています。


【備考2】2周目以降に向けたMML擬似コマンドは無効

無限リピート開始時点において、MML擬似コマンドによる演奏設定は、常に無限リピート初回演奏の条件での適用になります。
MML擬似コマンドとは、例えば l4 などです。

【例1】音長指定

l4 cdef @rp gab>c l1;

上記の場合、リピート始めの g は、常に l4 で演奏されてしまいます。
これは、MMLコンパイル時点で g が l4 でコンパイルされて音長が確定していて、トラック終端に l1 指定があったとしても、無限リピートでジャンプした先にある、既に生成済みの音符の音長に作用できないためです。

同様に、他のMML擬似コマンドも作用できない性質を持っています。これは無限リピート機能特有の問題です。


【例2】相対ボリューム

v13 l4 cdef @rp gab>c (2;

上記の場合、相対ボリューム(小かっこ)は、vコマンドの固定値に変換されているため、トラック終端に置いて無限リピートする場合、置いた1回分のみ有効です。

この例では記述上、繰り返すたびにボリュームが小さくなっていくかのように見えますが、実際には、次のように記述したのと同様の動作になります。

v13 l4 cdef @rp gab>c v11;

【例3】音程の補助指定

これら音程関連のコマンドは、音符生成時に参照され、音程番号に変換されて演奏データになるため、トラック終端に置いても、音長指定同様、リピート開始時の音符に作用できません。


【例4】指定値の分母設定関連

これらの分母指定も、トラック終端で分母を設定変更しても無限リピート開始時に作用できません。