シーケンス - 一般
l
デフォルト音長を設定します。範囲は1以上で最大値はテンポ数により変化します。テンポ一覧表をご覧下さい。
o
オクターブを指定します。範囲は1〜8です。
v
v-3
そのチャンネルのボリュームを設定します。範囲はY8950では0~63、ADPCMでは0~255、その他は0〜15。OPLLのリズムチャンネルでは、バスドラム、スネアドラム、ハイハット、シンバル、タムの全てのリズム音を設定します。
相対指定ではvの後に+、-を指定し+,-記号を重ねてどれだけ変化させるかと言う記述と+,-記号の後に数字で指定する記述方法があります。
例:
v15
v-
v--
v---
v+6
(これでv15に戻っています)
vm
Y8950のこのMMLを記述したチャンネルのモジュレータの音量を設定します。指定方法はvコマンドと同じですが音量値の範囲が0~63となっています。
最大音量63を設定すると、レジスタに書き込まれる値は音色設定時のトータルレベルの値となり、音量値が1低くなると音色データからトータルレベルの値が1上がり、上限は63となります。
vc
Y8950のこのMMLを記述したチャンネルのモジュレータの音量を設定します。指定方法はvコマンドと同じですが音量値の範囲が0~63となっています。
vcに0を設定するとトータルレベル63、vcに63を設定するとトータルレベル0がキャリアのトータルレベルに書き込まれます。
vmc
Y8950のこのMMLを記述したチャンネルのモジュレータの音量を設定します。指定方法はvコマンドと同じですが音量値の範囲が0~63となっています。
このコマンドはvcとvmコマンドを同時に指定します。
>
オクターブを1つ上げます。
<
オクターブを1つ下げます。
t
テンポを設定します。そのチャンネルのみ有効です。範囲は30〜225で、テンポにより使用可能な最短音長が決まります。詳細はテンポ一覧表をご覧下さい。
q
発音時間中q1時間の割合を指定します。単位は発音時間を8等分した指定です。範囲は1〜8。8にするとq2時間へは移行しません。
注意しなければならないのは、1音での8等分の値になることで、例えば、q4 c8^c8^c8^c8^c8^c8^c8^c8とタイで繋げた場合本来ならばq4に相当する時間は、L2です。しかしドライバは先読み機能がありませんので、最初のc8で判断しq4の時間をL16として算出し、あっという間にq2に移行してしまいます。
こういう場合表記としてq4 c1 とするかqx、qlコマンドを利用します。
qx
qコマンドのクロック指定版です。
クロック指定なのでどの音長も固定時間でq2に移行してしまい個別に変化させたい場合は大変ですが、 詳細なq1時間を指定できます。
音長のクロック数よりqxコマンド指定値の方が長い場合は、q2へは移行しません。範囲は1〜65535。
ql
qコマンドの対象が発音する音の長さではなく、設定する長さに変更したコマンドです。
音長フォーマットは2^4..^16..の様にタイで繋げることが可能で、付点も使用できます。ただし、音長を省略してデフォルト音長を使うことはできません。使用可能な音長範囲は、テンポ値により決定されます。q値はqコマンドと同様1〜8の割合で示します。
qコマンドはタイを含む合計音長を取得できません。q4c2^4とすると、最初のL2の音長に対してのq4になり、タイで繋がれた音長のq4を指定するには、q4c2.のように記述を変更する必要があります。
しかしそれでも、c2^8のような場合は無理なのでqxコマンドで直接指定するしか無いのですが、クロックを手作業で計算するのは面倒です。
そこでqlコマンドを使えば、与えられた音長とq値からqxコマンドに内部で変換することができます。実質qxコマンドなので、必要な発音が終わったら(必要であれば)qコマンドで指定し直す必要があります
変換されたqx値は16ビット幅なのでタイで繋げて長いクロック値にしても、1〜65535の範囲に補正されます。またテンポタイプがtableタイプの場合、少しクロック計算に誤差が出る可能性があります。
p
ポルタメントコマンドです。このコマンドを使用すると、一つ前に発音した音階を基準音とします。一つ前に発音した音階が無い場合はo4cになります。その後音階を発音すると、基準音からクロック値ごとに周波数値分、発音音階に近づいてきます。以降は新しい音階を追従するように周波数が変動します。
周波数値の単位は半音1/256単位で固定です。その為音の高低により追従速度が変わることはありません。周波数値の範囲は0〜32767、クロック値は1〜255です。
例:
o5c p10,1 <c p10,1 d
このコマンドは最初の発音周波数を前の音階周波数にリセットします。
上記例の場合、最初のpコマンドの時、前の音はo5cなのでo5cからo4cへのポルタメントとなります。しかし、o4cにポルタメントが到達する前にpコマンドが実行されます。その時ポルタメント途中の周波数を発音していますが、pコマンドより、前の音o4cの周波数に切り替わり、そこからo4dへのポルタメントとなり、滑らかにo5c、o4c、o4dと発音しないことになります。
pi
ポルタメントのパラメータのみを変更します。
pコマンドとの違いは、ポルタメント中の周波数をリセットしないことで、o5cからo4cのポルタメント途中、変化が遅くてo4cまで変化しなかった場合にpiコマンドを使用しても、現在発音している周波数からのポルタメントになります。ポルタメントでない時にこのコマンドを使用してもポルタメントにはなりません。
例:
o5c p10,1 <c pi5,1 d
pn
ポルタメント基準音変更コマンドです。pコマンドを使用するとき自動的に一つ前の音を基準音にしますが、基準音を別に指定したいときに使用します。このコマンドの性質上、次にpコマンドがこないと意味がありません(次に音階がきてしまうと、pnで設定した音階が上書きされるため)。
_
音階1_音階2
その2:
音階1_音階2_音階3_音階4…
数値を直接指定しないタイプのポルタメントコマンドです。音階1から音階2にかけて、音階2の発音時間でポルタメントします。音階の差と、音長クロックからポルタメント周波数値(移動量)を算出し、1クロックごとに変化します。移動量の誤差は四捨五入され僅かなずれが発生しますが、実用的には問題ないかと思います。
コンパイラ内部で、pn音階1 p○○,1 音階2に変換されます。
音階1には音長を指定することができますが、無視されます。この音階1は音程を指定する役目のみなので注意して下さい。
例:
a a_>c
この場合鳴るのはa>cだけです。aの音が鳴り終わると、cの音が鳴りますがポルタメントになっていて、開始音階はaです。aから>cへcの鳴っている時間を掛けて変化します。
px50 a c_>c
この場合もa>cと鳴りますが、cのポルタメントはcから始まります。px50を指定しているので、cから>cの変化をcの発声時間の半分で行います。
音階1の直後に_コマンドが来る必要があります。音階1の後にv15等と書くとフォーマットエラーになります(直接SDTデータに出力されないコマンド(<,>,o,l,等)は挿入できます)。
音階2の前にはポルタメントオフ(poff)コマンド以外なら記述可能です。
音階1と2はセットで記述して下さい。c_(cde)や、c_[de]2や、マクロを跨ぐようには記述できません。フォーマットエラーになります。
書式その2は_音階を加えていく記述で、音階1から2、2から3、3から4…というようにポルタメントが継続します。 音階1は音程の指定用なので、発声するのは音階2、3、4…となります。 コンパイラ内部では、pn音階1 p○○,1 音階2 pi○○,1 音階3 pi○○,1 音階4…と変換されています。
音階3からは、piコマンドになりますので周波数の変化は繋がります。移動量の誤差は蓄積されていきますので、長く繋げると少し変化量にずれが出てくるかも知れません。
移動量は音長クロックを参照しますが、タイで繋がれた部分までは参照できません(qコマンドの制限と同じです)。c_b4^2^8としても音長はc_b4として計算されてしまいます。
デフォルトの移動量は、その音長時間を掛けて、前の音階から指定した音階まで移動できる量になりますが、 pxコマンドを使用するとその割合を変えることができます。
注意点として内部でpコマンドに変換されていますから、コマンドを抜けてもポルタメントは継続しています。 完全にポルタメントを終了させるためにはpoffコマンドを使う必要があります。
例: c_>d poff efg
c_>^g_<^f_>^e_^b poff edc
px
_コマンドで算出されるポルタメントの移動量の割合を指定します。
単位は%でデフォルトで100となっていて、1〜1000の範囲で指定可能です。
- px100 g_c4の場合、gからcへL4の時間を掛けてポルタメントします。
- px50 g_c4の場合、gからcへL8の時間を掛けてポルタメントします。
- px200 g_c4の場合、gからcへL2の時間を掛けてポルタメントします。
px200の場合はcまで周波数が変化しきれない設定になります。
poff
ポルタメントをオフにします。
a-g
ドレミファソラシの音階です。
- c=ド
- d=レ
- e=ミ
- f=ファ
- g=ソ
- a=ラ
- b=シ
シャープ(+)の項目も参照して下さい。
+
シャープ、半音上がります。
MML的な解釈として、まず音階を決定してから音長を決定する流れになります(a-gでドレミの音階を決定、その後シャープフラットで半音移動するか決定、そして音長で音の長さを決定)。
最小の構成はa-gの音階名だけになります。音長を省略した場合、lで指定したデフォルト音長になります。
音長は数字指定と付点指定(ピリオド)になり、数字を省略(デフォルト音長)して付点を付けることも可能です。
例:
a
a+
a+4
a+4.
a+.
a.
SCMDのMMLは調の指定等ができますので、この音階指定の後に調の指定等の影響を受けます。
例:
@k-1 gabag
(実際の演奏ではgab-agとなります)
k2 cde
(実際の演奏ではdef+となります)
@k-1 k2 ab>c
(実際の演奏ではbc>dとなります)
-
フラット、半音下がります。
シャープ(+)の項目も参照して下さい。
.
付点コマンドで、音長の半分を追加します。2つ付けると更に半分、3つ付けるとまた更に半分…となります。最短音長を下回らない所までならいくらでも付加できます。
例:
a4....
(L4+L8+L16+L32+L64の長さになります。)
r
休符コマンドです。SCC、PSGは強制消音、OPLLはキーオフとなります。
rronコマンドを使用している場合、rコマンドでq2時間に移行し発音し続けることが可能です。音長は省略可能で、省略した場合はlで指定したデフォルト音長となります。
^
タイコマンドです。次の音とエンベロープ変化を共有します。 次の音が違う音階の場合はスラー的表現になります。 次の音が同音階の場合は音長指定だけでOKです。
PCMのマッピング使用時のタイは、MMLと実際の発音する音階が違うということに注意して下さい。
マッピングが無い状態ではc^dとするとド、レと発音しエンベロープは同じ物が続くのでスラー表現が可能です。PCMのマッピングではc^dとしても実際の発音は、@w"s0"o8b ^ @w"s1"o8bとなるかも知れません。この場合同じ音階がタイで繋がれているので一つ前の音を継続し、PCMデータも切り換えられることはありません。その結果、MMLではc^cと同等の動作になってしまいます。
またPCMを変更したときもタイを使ってスラー表現することはできません。@w"s0"o8b ^ @w"s1"a はb、aと発音しますが、音色は@w"s0"のまま変更されません。
PCMでは実際の発音が@w"s0"o8b^aのように音色変更を跨がないときに限り、スラー表現が可能です。
z
デチューンコマンドです。MMLで指定した音階の周波数からどれだけずらすかを指定します。周波数値は-32768〜32767で、レジスタ直接値か、半音1/256値で意味合いが変わります。
[:]
ループコマンドです。ループ回数で指定された数だけループし、記号:で終了します。
[cdefg]2
cdefg cdefgと演奏されます。
[cde:fg]2
cdefg cdeと演奏されます。
[cde:fg]1
cdefgと演奏されます。
このコマンドは、チャンネル間をまたぐことができません。
不可:
p1=[cde
p2=aa
p1=fg]3
@k
そのチャンネルに調を設定します。調の値は-7〜7です。
プラスはシャープの数、マイナスはフラットの数を表し、0はシャープ、フラットとも付きません。適用後にo1c〜o8bを外れた場合エラーとなります。いちいち-や+を書くのを省くためのコマンドです。
例:
@k1 defg
def+gと演奏されます。
@k1 def-g
defgと演奏されます。
k
移調コマンドです。移調値は-95〜95で単位は半音となります。適用後にo1c〜o8bを外れた場合エラーとなります。
例:
k2 ceg
df+aと演奏されます。
@all_k
@kコマンドの全チャンネル設定版です。
このコマンドを実行した瞬間、全てのチャンネルに適用されるのでソースに書かれている最初のチャンネルの冒頭に書くことを推奨します。
*
ミュージックループコマンドです。その曲中で各チャンネル一カ所だけ指定でき、曲が終わりに達すると、そのポイントにループします。
このコマンドは旧バージョンとの互換性のために残しています。
このコマンドのループは最初の演奏と、1回目のループ時とで僅かなテンポずれが発生する可能性があります(初回ループ以降は変化しません)。
その為、このコマンドより**コマンドを利用することを推奨します。ミュージックループコマンドを設置した後、1音は発声する必要があります。
**
ミュージックループコマンドです。*コマンドとの違いはこのコマンドを設置するとループ地点直前にテンポ合わせコマンドが自動で挿入される点にあります。
SCMDは曲の終わりに達するとテンポ合わせを行ってから、ループ先にジャンプします。ループ先では全チャンネル同時スタートになるわけですが、初回演奏時はループ地点で 同時スタートにはなっていません。そのせいで初回演奏時と1ループ目でずれが生じる可能性があり、ループ地点前にテンポ合わせを挿入することで、その食い違いを解消します。
曲のループにはこちらを使用することを推奨します。
w
ウエイトコマンド、ダミー音符です。この後に続く音長、無ければデフォルト音長を経過します。
通常の発音と違うのは、前に鳴っていた音の消音を行わないので、直前に音が鳴っていれば鳴りっぱなしとなります。
yコマンドで設定した値が、音階発音で上書きされてしまい有効にならない場合などに、このコマンドを使用します。
エンベロープ処理は通常通り行われます。
ちょっとした実験の為に用意したもので、通常は使う必要は無いかと思います。
@clk
音長単位切り換えコマンドです。MMLで入力する音長モードを切り換えます。
通常はx分音符入力モードですが、そのときに@clkを使うとクロック値入力モードになります。
もう一度@clkで戻ります。@clkの初期デフォルト値は30で、クロック値入力モード時に再設定されます。また、音長(クロック)を指定したときにそれがクロック省略時のデフォルト値になります。
例:
@clk cd1ef3gab@clk c4 @clk g
上記の例ではc30d1e1f3g3a3b3のクロック数で発音し、c4を4分音符、最後のgは30クロックとなります。
クロック指定を使った場合は、コンパイラは音長の端数計算をしませんので、クロック指定から戻った場合にずれる可能性があり、テンポ合わせコマンド%を行う必要があるかも知れません。
どちらかというと、クロック指定で任意のクロック数にするより、%のオフセットコマンドで、コンパイラの出力したクロック数をプラスマイナスして調節し、また%のオフセットコマンドで元に戻しておく方が良いかと思います。こちらの方はきちんと戻しておけば、コンパイラ管理の端数調整に影響はありません。
例:
%-1c %-1d %-1e %3f
y
音源に直接データを書き込みます。各音源でレジスタアドレスや有効なデータ値の範囲が変わります。MML上のデータ範囲は0〜255です。
PSG……アドレス範囲 0-13
OPLL……アドレス範囲 0-56
Y8950……アドレス範囲 0-200
アドレス範囲には無効なアドレスや演奏には関係ないアドレスがあります。詳細は各音源のデータシートを参照して下さい。
yコマンドのみ、16進数、2進数表記を受け付けます。BASICのように&h,&bを頭に付けて下さい。16進数で記述し後に音階が続く時は、どこまでが数値か判別不能になるので空白を挟んで下さい。
(:|)
MMLエンベロープを指定します。()の中のMMLを全て1クロックで指定された音長になるまで繰り返します。
例:
(ceg)4
cegをL4の時間まで繰り返します。音長省略時はデフォルト音長になります。
()の中は全てタイで繋がる処理がされるので、()で1音として扱えます。
MMLエンベロープ中に使用できるコマンドは、a-g、v、>、<、o、y、@rv(特殊)、@ro(特殊)となっています。
o4(>ceg)4a とすれば、o5でcegと繰り返します。SCMDではオクターブは直接値として扱っているので、o5cego6ceg…と上がっていくことはありません。また、MMLエンベロープ中のオクターブやボリューム変化はローカル変化となり、()を抜けると元の数値に戻ります。ですからその後のaはo4aを発声します。
MMLエンベロープ中はマクロや通常のメモリ、リストアは使用できませんが、特殊なリストアが使用できます。
それが@rvと@roで、@rvはMMLエンベロープに入って来た時のボリューム、@roはMMLエンベロープに入って来た時のオクターブを記憶し、パラーメータをその状態に戻せます。スタック式ではありませんので、何回でも使用可能です。
o4v15 (ce v2o1c @ro@rv g)とすれば、v15o4でce、v2o1でc、その後またv15o4でgと繰り返し演奏されます。
MMLエンベロープ中、最初の1クロックだけ高音を鳴らし後はcegを鳴らしたいと言う場合、ループコマンド:を使うことで可能です。
(o8b : @roceg)とすると、最初はo8bで1クロックなった後、元のオクターブでcegと演奏し、ループポイントへジャンプ、cegと演奏を繰り返す処理になります。
MMLエンベロープでは1クロック固定で音長分繰り返すため、最後がどのような音で終わるか計算をしないと知ることはできず、またテンポを変えるだけでその結果も変わります。
最初の音だけ指定したい状況があったとすれば、最後の音を指定したいと言う状況もあるだろうと言うことで(最後の音の指定を末尾指定、先ほどの指定を先頭指定と呼ぶことにして)、末尾指定コマンド|が使用できます。
(ceg|ag)とすれば、ceg、cegと繰り返し演奏し必ず最後にagと演奏されます。 先頭指定も組み合わせれば、 (ce:gab|dc)の様に記述できます。
rron rroff
rronはrリリースオンコマンドです。 ボリュームエンベロープのq2を設定をしている時、休符でq2に移行します。
rroffでは通常通り、休符でq2には移行しません。
@rlpon @rlpoff
ピッチエンベロープ時の周波数値の単位を変更します。
@rlponでは半音1/256単位に、@rlpoffではレジスタ値単位になります。
@rlzon @rlzoff
zコマンドの周波数値の単位を変更します。
@rlzonでは半音1/256単位に、@rlzoffではレジスタ値単位になります。
@rlhon @rlhoff
高速ピッチエンベロープ時の周波数値の単位を変更します。
@rlhonでは半音1/256単位に、@rlhoffではレジスタ値単位になります。