V3MMLmanual

1.5 数値の記述(計算式記述)

← 目次

MMLコマンドやメタデータを記述する際、数値を指定する箇所が多数あります。V3MMLでは、一部の例外を除き、数値の指定を行う場所では計算式でも記述することが出来ます。

計算機能

演算 記述 効果
加算 v13+2 →v15相当
減算 v15-2 →v13相当
乗算 v5*3 →v15相当
除算 v10/2 →v5相当
冪乗 v2^3 →v8相当
剰余 v13%2 →v1相当

以上、vコマンドの数値記述を計算式にした場合です。
加算減算は同レベル、乗算除算剰余は同レベルで加算減算より優先、冪乗は乗算除算剰余より優先です。
冪乗が続く場合の計算方法は、エクセル同様の左結合です。

v2^3^2      →v64相当

右結合で計算させたい場合はカッコを使います。

v"2^(3^2)"  →v512相当

カッコの扱い

MMLコマンドでは、小カッコ ( ) は、相対音量に使われているので、区別するために、数値指定の部分を “” で括った場合にのみ、小カッコを使うことが出来ます。

メタデータ定義における数値指定では、”” で括らずに小カッコを使用できます。

計算式記述が出来ない箇所

MMLコマンドにおける、音符の音長指定、休符長指定の部分には計算式記述が使えません。音長の加算は & 、減算は ^ を使用します。

数値の表現

これらはいずれも正負(+-)記号をつけることが出来ます。
また、いずれも内部的には 64bit浮動小数点数で扱われます。記述できる有効な桁数は 64bit浮動小数点数に収まる範囲になります。

整数で数値を扱う場所は、最終的に整数に四捨五入されて利用されます。

16進数の小数表現は対応していません。

「#」の記述

【記述例】

v13 cde v#-2 edc v#-2 ccc

以上の場合、cdeはv13、edcはv11、cccはv9で演奏されます。

【解説】

数値の代わりに # を記述すると、前回指定した値(前回が無ければ初期値)として解釈されます。(相対表現サポート)

多くのMMLコマンドは、!sコマンドによるステータス表示の都合上、初期値や前回指定した値を記憶しています。計算式内でそれを利用することが出来ます。

メタデータ定義では、原則的に # は0として解釈されます。ただし、次の場合は、# 記述は前回値(初回の場合は0)として機能します。

【相対表現サポート状況】

コマンド 「#」の評価
abcdefg 使用不可。
k[1],[2] 使用不可。
key[1] 「#」は前回の値。初期値=-1
#MB:KEY_ASSIGN 「#」は常に0。
n[1],[2] 使用不可。
u[1],[2] 使用不可。
r 使用不可。
o[1] 「#」は前回の値。初期値=4
> < 「#」は常に1。ただし数値の1文字目に「#」は使えない
ps[1] 「#」は前回の値。初期値=-1
#MB:PITCH_SCALE 「#」は常に0。
ns[1] 「#」は前回の値。初期値=0
nt[1] 「#」は前回の値。初期値=0
@d[1] 「#」は前回の値。初期値=0
l[1] 使用不可。
q[1],[2] 「#」は前回の値。[1]初期値=16。[2]初期値=16
qr[1] 「#」は前回の値。初期値=0
q%[1] 「#」は前回の値。初期値=0
@q[1] 「#」は前回の値。初期値=0
mv[1] 「#」は前回の値。初期値=-1
#MB:MIXING_VOL 「#」は常に0。
@p[1] 「#」は前回の値。初期値=0
p[1] 「#」は前回の値。初期値=0
vs[1] 「#」は前回の値。初期値=-1
#MB:VOLUME_SCALE 「#」は常に0。
v[1] 「#」は前回の値。初期値=13
) ( 「#」は常に1。
vl[1] 「#」は前回の値。初期値=15
vf[1],[2] 「#」は常に0。
@fo[1],[2] 「#」は常に0。
@fi[1],[2] 「#」は常に0。
t[1] 「#」は前回の値。初期値=120
; 「#」利用箇所なし。
/* ... */ 「#」利用箇所なし。
// 「#」利用箇所なし。
|:[1] ... | 使用不可。
@rp 「#」利用箇所なし。
#MB:CONFIG 「#」は常に0。
#ML:INCLUDE 「#」利用箇所なし。
!n[1] 「#」は常に-1。
!r[1] 「#」は常に-1。
!s[str] 「#」利用箇所なし。
!c[1],[str] 「#」は常に0。
!m[1] 「#」は常に0。
!d[1],[2] 「#」は常に0。
![str] 「#」利用箇所なし。
! 「#」利用箇所なし。
@dsp[1],[2],[3] [1]の「#」は常に0。[2]と[3]の「#」は前回の値。[2]初期値=1。[3]初期値=1
$名前=内容; マクロの名前部分には「#」利用箇所なし。内容部分は最終的にMML解釈されるため記述内容に依存。
#ML:REPORT_TICKS 「#」利用箇所なし。
@@[str] 「#」利用箇所なし。
@[1] 「#」は前回の値。初期値=0前回の値は、@@[str]による音源ごとに保存される。
@mh[1],[2],[3],[4],[5],[6],[7] [1]…[7]全て:「#」は前回の値。初期値=0
@mha[1],[2],[3],[4] [1]…[4]全て:「#」は前回の値。初期値=0
@mhz 「#」利用箇所なし。
@mr[1] 「#」は前回の値。初期値=-1
@mz[1] 「#」は前回の値。初期値=0
@mze[1] 「#」は前回の値。初期値=0
@ph[1],[2] [1]の「#」は前回の値。初期値=0[2]の「#」は前回の値。初期値=-1
@w[1],[2] [1]の「#」は前回の値。初期値=4。[2]の「#」は前回の値。初期値=8
@n[1] 「#」は前回の値。初期値=1
@nr[1] 「#」は前回の値。初期値=1
y[str],[1] 「#」は常に0。
ym[str1],[str2],[1] 「#」は常に0。
yp[1] 「#」は前回の値。初期値=0
#MB:Y_PACK 「#」は常に0。
@dl[1] 「#」は前回の値。初期値=-1
#MB:DELAY 「#」は常に0。
@dlz 「#」利用箇所なし。
@fd[1] 「#」は前回の値。初期値=-1
#MB:FILTER_D 「#」は常に0。
@fdz 「#」利用箇所なし。
@fs[1] 「#」は前回の値。初期値=-1
#MB:FILTER_S 「#」は常に0。
@fsz 「#」利用箇所なし。
#MB:WVM_WAVE 波形csv表現の箇所:「#」は前回の値。初期値=0。それ以外の箇所:「#」は0。
#MB:FMS_6OP 「#」は常に0。
#MB:FMS_4OP 「#」は常に0。
#MB:FMS_2OP 「#」は常に0。
#MB:FMS_OPM 「#」は常に0。
#MB:FMS_OPNA 「#」は常に0。
#MB:FMS_OPN 「#」は常に0。
#MB:LOAD_SAMPLING 「#」は常に0。
@eoc[str],[1] 「#」は常に0。
@eor[str],[1] 「#」は常に0。
@ea[1] 「#」は前回の値。初期値=-1
#MB:ENV_A 「#」は常に0。
@ef[1] 「#」は前回の値。初期値=-1
#MB:ENV_F 「#」は常に0。
@zr[str],[1] 「#」は常に-1。
z 「#」利用箇所なし。
@az[1] 「#」は前回の値。初期値=0
@loc[str],[1] 「#」は常に0。
@lor[str],[1] 「#」は常に0。
@lp[1] 「#」は前回の値。初期値=-1
@la[1] 「#」は前回の値。初期値=-1
@lb[1] 「#」は前回の値。初期値=-1
@lf[1] 「#」は前回の値。初期値=-1
@ly[1] 「#」は前回の値。初期値=-1
@l*z 「#」利用箇所なし。
@l*r 「#」利用箇所なし。
@l*t[1],[2] [1]の「#」は0。[2]の「#」は前回の値。[1]が1のとき初期値=0。[1]が2のとき初期値=-1
#MB:LFO_P 「#」は常に0。
#MB:LFO_A 「#」は常に0。
#MB:LFO_B 「#」は常に0。
#MB:LFO_F 「#」は常に0。
#MB:LFO_Y 「#」は常に0。
#MB:LFOTBL_ATK テーブル値csv表現の箇所:「#」は前回の値。初期値=0。それ以外の箇所:「#」は0。
#MB:LFOTBL_REL テーブル値csv表現の箇所:「#」は前回の値。初期値=0。それ以外の箇所:「#」は0。
@pl[1],[2] [1]の「#」は前回の値。初期値=1[2]の「#」は前回の値。初期値=0
xa[str],[1] 「#」は常に0。
xm[str],[1] 「#」は常に0。
@kt[1] 「#」は前回の値。初期値=-1
@kc[1] 「#」は前回の値。初期値=-1
@kl[1] 「#」は前回の値。初期値=-1
#MB:KEYEVENT_TRG テーブル値csv表現の箇所:「#」は前回の値。初期値=0。それ以外の箇所:「#」は0。
#MB:KEYEVENT_CODE テーブル値csv表現の箇所:「#」は前回の値。初期値=0。それ以外の箇所:「#」は0。
#MB:KEYEVENT_LEN 「#」は常に0。
#ML:TITLE 「#」利用箇所なし。
#ML:ARTIST 「#」利用箇所なし。
#ML:COMMENT 「#」利用箇所なし。
#ML:CODING 「#」利用箇所なし。

「?」の記述

【記述例】

@@"pls" @w0.005+?*0.495,1 cdef;

以上の場合、演奏の都度、「cdef」のデューティ比が、0.005〜0.5 の範囲で、ランダムに変わります。

@@"nzp" @n64 p1  @nr?1 ccc;
@@"nzp" @n64 p-1 @nr?1 ccc;

以上の場合、ランダム値パレットの1番でシフトレジスタ値を設定したノイズを、別トラックで左右に振って鳴らしていますが、モノラルに聞こえます。
@nrコマンドが無い(シフトレジスタ値が違う)と、ステレオに聞こえます。

【解説】

? の記述は、0.0 〜 1.0 の範囲のランダム値(浮動小数点数)として解釈されます。

?数値 と記述した場合は、数値による番号のランダム値パレット配列から読み出した値として解釈されます。

ランダム値パレットとは、0.0 〜 1.0 の範囲の浮動少数点数のランダム値を格納する配列です。配列の要素は 0番〜99番の100個が用意されていて、MMLコンパイル開始時に、その都度、値が生成されます。

ランダム値パレット参照に、整数 0〜99 以外の値を指定した場合は、エラーになります。