主にMSX関係のコンテンツが置いてあります。

シーケンス - 一般

l

使用場所
シーケンス:全チャンネル
書式
l音長
l4
解説

デフォルト音長を設定します。範囲は1以上で最大値はテンポ数により変化します。テンポ一覧表をご覧下さい。

o

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
oオクターブ値
o4
解説

オクターブを指定します。範囲は1〜8です。

v

使用場所
シーケンス:全チャンネル
書式
v音量値|相対指定
v15
v-3
解説

そのチャンネルのボリュームを設定します。範囲はY8950では0~63、ADPCMでは0~255、その他は0〜15。OPLLのリズムチャンネルでは、バスドラム、スネアドラム、ハイハット、シンバル、タムの全てのリズム音を設定します。

相対指定ではvの後に+、-を指定し+,-記号を重ねてどれだけ変化させるかと言う記述と+,-記号の後に数字で指定する記述方法があります。

例:
v15
v-
v--
v---
v+6
(これでv15に戻っています)

vm

使用場所
シーケンス:Y8950
書式
vm音量値|相対値
vm63
解説

Y8950のこのMMLを記述したチャンネルのモジュレータの音量を設定します。指定方法はvコマンドと同じですが音量値の範囲が0~63となっています。

最大音量63を設定すると、レジスタに書き込まれる値は音色設定時のトータルレベルの値となり、音量値が1低くなると音色データからトータルレベルの値が1上がり、上限は63となります。

vc

使用場所
シーケンス:Y8950
書式
vc音量値|相対値
vc63
解説

Y8950のこのMMLを記述したチャンネルのモジュレータの音量を設定します。指定方法はvコマンドと同じですが音量値の範囲が0~63となっています。

vcに0を設定するとトータルレベル63、vcに63を設定するとトータルレベル0がキャリアのトータルレベルに書き込まれます。

vmc

使用場所
シーケンス:Y8950
書式
vmc音量値|相対値
vmc63
解説

Y8950のこのMMLを記述したチャンネルのモジュレータの音量を設定します。指定方法はvコマンドと同じですが音量値の範囲が0~63となっています。

このコマンドはvcとvmコマンドを同時に指定します。

>

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
>
c > g
解説

オクターブを1つ上げます。

<

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
<
c < g
解説

オクターブを1つ下げます。

t

使用場所
シーケンス:全チャンネル
書式
tテンポ値
t120
解説

テンポを設定します。そのチャンネルのみ有効です。範囲は30〜225で、テンポにより使用可能な最短音長が決まります。詳細はテンポ一覧表をご覧下さい。

q

使用場所
シーケンス:全チャンネル
書式
qq値
q4
解説

発音時間中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

使用場所
シーケンス:全チャンネル
書式
qxクロック値
qx36
解説

qコマンドのクロック指定版です。

クロック指定なのでどの音長も固定時間でq2に移行してしまい個別に変化させたい場合は大変ですが、 詳細なq1時間を指定できます。

音長のクロック数よりqxコマンド指定値の方が長い場合は、q2へは移行しません。範囲は1〜65535。

ql

使用場所
シーケンス:全チャンネル
書式
ql音長,q値
q4 cde ql2^8,4 f2^8 q4 gab
解説

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

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
p周波数値,クロック値
p50,1
解説

ポルタメントコマンドです。このコマンドを使用すると、一つ前に発音した音階を基準音とします。一つ前に発音した音階が無い場合は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

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
pi周波数値,クロック値
pi50,1
解説

ポルタメントのパラメータのみを変更します。

pコマンドとの違いは、ポルタメント中の周波数をリセットしないことで、o5cからo4cのポルタメント途中、変化が遅くてo4cまで変化しなかった場合にpiコマンドを使用しても、現在発音している周波数からのポルタメントになります。ポルタメントでない時にこのコマンドを使用してもポルタメントにはなりません。

例:
o5c p10,1 <c pi5,1 d

pn

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
pnオクターブ音階
pno3g+
解説

ポルタメント基準音変更コマンドです。pコマンドを使用するとき自動的に一つ前の音を基準音にしますが、基準音を別に指定したいときに使用します。このコマンドの性質上、次にpコマンドがこないと意味がありません(次に音階がきてしまうと、pnで設定した音階が上書きされるため)。

_

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
その1:
音階1_音階2
その2:
音階1_音階2_音階3_音階4
e_a
解説

数値を直接指定しないタイプのポルタメントコマンドです。音階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

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
pxポルタメント移動割合
px120
解説

_コマンドで算出されるポルタメントの移動量の割合を指定します。

単位は%でデフォルトで100となっていて、1〜1000の範囲で指定可能です。

  • px100 g_c4の場合、gからcへL4の時間を掛けてポルタメントします。
  • px50 g_c4の場合、gからcへL8の時間を掛けてポルタメントします。
  • px200 g_c4の場合、gからcへL2の時間を掛けてポルタメントします。

px200の場合はcまで周波数が変化しきれない設定になります。

poff

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
poff
解説

ポルタメントをオフにします。

a-g

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
解説

ドレミファソラシの音階です。

  • c=ド
  • d=レ
  • e=ミ
  • f=ファ
  • g=ソ
  • a=ラ
  • b=シ

シャープ(+)の項目も参照して下さい。

+

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
音階+音長
c+
解説

シャープ、半音上がります。

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となります)

-

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
音階-音長
c-
解説

フラット、半音下がります。

シャープ(+)の項目も参照して下さい。

.

使用場所
シーケンス:全チャンネル
書式
.
c.
解説

付点コマンドで、音長の半分を追加します。2つ付けると更に半分、3つ付けるとまた更に半分…となります。最短音長を下回らない所までならいくらでも付加できます。

例:
a4....
(L4+L8+L16+L32+L64の長さになります。)

r

使用場所
シーケンス:全チャンネル
書式
r音長値
r4
解説

休符コマンドです。SCC、PSGは強制消音、OPLLはキーオフとなります。

rronコマンドを使用している場合、rコマンドでq2時間に移行し発音し続けることが可能です。音長は省略可能で、省略した場合はlで指定したデフォルト音長となります。

^

使用場所
シーケンス:全チャンネル
書式
^
c^c e^8
解説

タイコマンドです。次の音とエンベロープ変化を共有します。 次の音が違う音階の場合はスラー的表現になります。 次の音が同音階の場合は音長指定だけで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

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
z周波数値
解説

デチューンコマンドです。MMLで指定した音階の周波数からどれだけずらすかを指定します。周波数値は-32768〜32767で、レジスタ直接値か、半音1/256値で意味合いが変わります。

[:]

使用場所
シーケンス:全チャンネル
書式
[ループパートA:ループパートB]ループ回数
[cde]2
解説

ループコマンドです。ループ回数で指定された数だけループし、記号:で終了します。

[cdefg]2
cdefg cdefgと演奏されます。

[cde:fg]2
cdefg cdeと演奏されます。

[cde:fg]1
cdefgと演奏されます。

このコマンドは、チャンネル間をまたぐことができません。

不可:
p1=[cde
p2=aa
p1=fg]3

@k

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
@k調の値
@k-2
解説

そのチャンネルに調を設定します。調の値は-7〜7です。

プラスはシャープの数、マイナスはフラットの数を表し、0はシャープ、フラットとも付きません。適用後にo1c〜o8bを外れた場合エラーとなります。いちいち-や+を書くのを省くためのコマンドです。

例:
@k1 defg
def+gと演奏されます。

@k1 def-g
defgと演奏されます。

k

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
k移調値
k3
解説

移調コマンドです。移調値は-95〜95で単位は半音となります。適用後にo1c〜o8bを外れた場合エラーとなります。

例:
k2 ceg
df+aと演奏されます。

@all_k

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
@all_k調の値
@all_k3
解説

@kコマンドの全チャンネル設定版です。

このコマンドを実行した瞬間、全てのチャンネルに適用されるのでソースに書かれている最初のチャンネルの冒頭に書くことを推奨します。

*

使用場所
シーケンス:全チャンネル
書式
*
cd*efg
解説

ミュージックループコマンドです。その曲中で各チャンネル一カ所だけ指定でき、曲が終わりに達すると、そのポイントにループします。

このコマンドは旧バージョンとの互換性のために残しています。

このコマンドのループは最初の演奏と、1回目のループ時とで僅かなテンポずれが発生する可能性があります(初回ループ以降は変化しません)。

その為、このコマンドより**コマンドを利用することを推奨します。ミュージックループコマンドを設置した後、1音は発声する必要があります。

**

使用場所
シーケンス:全チャンネル
書式
**
cd**efg
解説

ミュージックループコマンドです。*コマンドとの違いはこのコマンドを設置するとループ地点直前にテンポ合わせコマンドが自動で挿入される点にあります。

SCMDは曲の終わりに達するとテンポ合わせを行ってから、ループ先にジャンプします。ループ先では全チャンネル同時スタートになるわけですが、初回演奏時はループ地点で 同時スタートにはなっていません。そのせいで初回演奏時と1ループ目でずれが生じる可能性があり、ループ地点前にテンポ合わせを挿入することで、その食い違いを解消します。

曲のループにはこちらを使用することを推奨します。

w

使用場所
シーケンス:全チャンネル
書式
w音長値
w8
解説

ウエイトコマンド、ダミー音符です。この後に続く音長、無ければデフォルト音長を経過します。

通常の発音と違うのは、前に鳴っていた音の消音を行わないので、直前に音が鳴っていれば鳴りっぱなしとなります。

yコマンドで設定した値が、音階発音で上書きされてしまい有効にならない場合などに、このコマンドを使用します。

エンベロープ処理は通常通り行われます。

ちょっとした実験の為に用意したもので、通常は使う必要は無いかと思います。

@clk

使用場所
シーケンス:全チャンネル
書式
@clk
cd @clk e
解説

音長単位切り換えコマンドです。MMLで入力する音長モードを切り換えます。

通常はx分音符入力モードですが、そのときに@clkを使うとクロック値入力モードになります。

もう一度@clkで戻ります。@clkの初期デフォルト値は30で、クロック値入力モード時に再設定されます。また、音長(クロック)を指定したときにそれがクロック省略時のデフォルト値になります。

例:
@clk cd1ef3gab@clk c4 @clk g

上記の例ではc30d1e1f3g3a3b3のクロック数で発音し、c4を4分音符、最後のgは30クロックとなります。

クロック指定を使った場合は、コンパイラは音長の端数計算をしませんので、クロック指定から戻った場合にずれる可能性があり、テンポ合わせコマンド%を行う必要があるかも知れません。

どちらかというと、クロック指定で任意のクロック数にするより、%のオフセットコマンドで、コンパイラの出力したクロック数をプラスマイナスして調節し、また%のオフセットコマンドで元に戻しておく方が良いかと思います。こちらの方はきちんと戻しておけば、コンパイラ管理の端数調整に影響はありません。

例:
%-1c %-1d %-1e %3f

y

使用場所
シーケンス:全チャンネル
書式
yレジスタアドレス,データ
y1,5
解説

音源に直接データを書き込みます。各音源でレジスタアドレスや有効なデータ値の範囲が変わります。MML上のデータ範囲は0〜255です。

SCC
アドレス(メモリ上のアドレス)
内容
有効なデータ範囲
100-131(b800-b81f)
s1の波形データ
0-255
200-231(b820-b83f)
s2の波形データ
0-255
300-331(b840-b85f)
s3の波形データ
0-255
400-431(b860-b87f)
s4の波形データ
0-255
500-531(b880-b89f)
s5の波形データ
0-255
0(b8a0)
s1分周比下位8bit
0-255
1(b8a1)
s1分周比上位4bit
0-15
2(b8a2)
s2分周比下位8bit
0-255
3(b8a3)
s2分周比上位4bit
0-15
4(b8a4)
s3分周比下位8bit
0-255
5(b8a5)
s3分周比上位4bit
0-15
6(b8a6)
s4分周比下位8bit
0-255
7(b8a7)
s4分周比上位4bit
0-15
8(b8a8)
s5分周比下位8bit
0-255
9(b8a9)
s5分周比上位4bit
0-15
10(b8aa)
s1音量
0-15
11(b8ab)
s2音量
0-15
12(b8ac)
s3音量
0-15
13(b8ad)
s4音量
0-15
14(b8ae)
s5音量
0-15
15(b8af)
キーオン
0-31
16(b8c0)
モード
0-255
17-31(b8b1-b8bf)
----
----
32-95(b8c0-b8ff)
----
----

PSG……アドレス範囲 0-13

OPLL……アドレス範囲 0-56

Y8950……アドレス範囲 0-200

アドレス範囲には無効なアドレスや演奏には関係ないアドレスがあります。詳細は各音源のデータシートを参照して下さい。

yコマンドのみ、16進数、2進数表記を受け付けます。BASICのように&h,&bを頭に付けて下さい。16進数で記述し後に音階が続く時は、どこまでが数値か判別不能になるので空白を挟んで下さい。

(:|)

使用場所
シーケンス:PSG
書式
(MML:MML|MML)音長
(ceg)4
解説

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

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
rron
書式
rroff
rron cde rroff
解説

rronはrリリースオンコマンドです。 ボリュームエンベロープのq2を設定をしている時、休符でq2に移行します。

rroffでは通常通り、休符でq2には移行しません。

@rlpon @rlpoff

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
@rlpon
書式
@rlpoff
@rlpon cde @rlpoff
解説

ピッチエンベロープ時の周波数値の単位を変更します。

@rlponでは半音1/256単位に、@rlpoffではレジスタ値単位になります。

@rlzon @rlzoff

使用場所
シーケンス:PSG,SCC,OPLL(M),Y8950,ADPCM
書式
@rlzon
書式
@rlzoff
@rlzon cde @rlzoff
解説

zコマンドの周波数値の単位を変更します。

@rlzonでは半音1/256単位に、@rlzoffではレジスタ値単位になります。

@rlhon @rlhoff

使用場所
シーケンス:PSG
書式
@rlhon
書式
@rlhoff
@rlhon cde @rlhoff
解説

高速ピッチエンベロープ時の周波数値の単位を変更します。

@rlhonでは半音1/256単位に、@rlhoffではレジスタ値単位になります。