MML reference: Envelope block

定義(Define)

Envelop(n){
	define
}
E(n){
	define
}

引数(Inputs)

n

エンベロープ番号を指定します。

define

エンベロープのパターンです。
エンベロープパターンの定義は、フレーム毎の推移を数値で指定します。
以下表のコマンドを記述して下さい。

CommandContens
nエンベロープ値
Dn前回のエンベロープ値をn+1フレーム間維持します。
LエンベロープパターンがRコマンド、又はパターン最後まで行った時の戻り先を指定します。
Rコマンドの後に書かれた場合は、キーオフ後のパターンにおける戻り先となります。
Rコマンド前でLコマンドを省略した場合、Rコマンドの直前のコマンドを繰り返します。
Rコマンド後でLコマンドを省略した場合、エンベロープ定義最後のコマンドを繰り返します。
R以後を、キーオフ後のエンベロープパターンとします。
リリースのパターンを指定しない場合、キーオフ後もそのままエンベロープが継続されます(音量エンベロープも含め)。
(start,end,length)startからendまでlengthフレームで変化します。

内容(Contents)

音色、音量、周波数、音程の推移パターンを定義します。
エンベロープ値の設定範囲は以下の通りです。

音色

APU パルス波
0~3 (0=12.5% / 1=25% / 2=50% / 3=75%)
APU 三角波
音色エンベロープはありません。
APU ノイズ
0~1 (0=長周期 / 1=短周期)
APU ⊿PCM
音色エンベロープはありません。
FDS
0~63 モジュレータのゲイン(LFOの振幅)
VRC6 パルス波
0~7 (0=6.25% ~ 7=50%)
VRC6 SAW
音色エンベロープはありません。
VRC7
0~15 … 音色選択
32~47 … ユーザ音色ML(M) (32を減算した値)
48~63 … ユーザ音色ML(C) (48を減算した値)
64~127 … ユーザ音色TL (64を減算した値)
MMC5
0~3 (0=12.5% / 1=25% / 2=50% / 3=75%)
N168
0~63 (指定数値の2倍のアドレスを音色波形にします。)
Sunsoft 5B
0~31 … ノイズ(値はノイズの周期です)
32~63 … トーン&ノイズ(値はノイズの周期です)
64 … トーン
96 … 無音

音量

APU パルス波
0~15
APU 三角波
0~4 リニアカウンター(音量vコマンド値との乗算は行いません)。
(0:発音停止 / 1=4.17[msec] / 2=8.33[msec] / 3=12.5[msec] / 4=当該フレーム間(16.7[msec])は常に発音)
※音色エンベロープがoffの場合は、sコマンドによりリニアカウンタが制御されます。
APU ノイズ
0~15
APU ⊿PCM
音量エンベロープはありません。
FDS
0~63 キャリアのゲイン(音量)
VRC6 パルス波
0~15
VRC6 SAW
0~63
VRC7
0~15
MMC5
0~15
N168
0~15
Sunsoft 5B
0~15

周波数(ピッチ)

-64~63の範囲で指定してください。
数値は、現在発音している音階を基準とした値で、16が100cent(半音)に相当します。

APU及びMMC5で音程を変化させる場合、レジスターのMSBが更新されると位相がリセットされプチノイズが発生します。
レジスターのMSBの更新が近い音程としては以下です。
エンベロープの数値とディチューンの数値の総和を以下表の許容幅の範囲内に留めると、音程レジスタMSB更新によるプチノイズを回避できます。
(ただし、数値の絶対値が16を越える場合は、音程レジスタMSBが更新される場合があります。)

音程許容幅
o1b1 ~
o2d ~ -2
o2f ~ 0
o2a ~ -2
o3d ~ -2
o3a ~ -2
o4a ~ -4

音程(ノート)

-64~63の範囲で指定してください。
数値は、現在発音している音階を基準とした値で、1が100cent(半音)に相当します。

注意(Notes)

MMLコンパイラは、各エンベロープ(音色、音量、周波数、音程)のパターンを一元管理します。
特定の1つのパターンを、どのエンベロープでも使用可能ですが、設定範囲は留意して下さい。

例(Sample)

// frequency envelop "Volume table"
Envelop(0){	15 D10 14 13 12  L 11 11 10 10 9 9 10 10 R 9 8 7 6 5 L 4 4 3 3 2 2 3 3	}
Envelop(1){	(8,15,3),(15,8,100) L 8 R (8,0,3) L 0	}