ボリュームエンベロープ

ボリュームエンベロープには4つの状態があります。
ADSRに相当するようにも思いますが、少し違うような気もするので頭の方からタイプA,B,C,Dとしました。
少しややこしいので、先に種類をざっと紹介し後で細かい説明をすることにします。
このエンベロープは、基本的にABCDの順に移行しますが、タイプBから開始されたり、タイプDの条件に当てはまるといかなる状態であってもタイプDに移行したりします。
またワークエリアに関しては、同じアドレスの値をタイプ別で異なる動作に使用していたりして少々ややこしくなっております。
タイプA
タイプAには2種類のパターンがあります。
タイプA-0
(+25H)[開始音量]から(+12H)[チャンネルボリューム]まで+1ずつ増加するエンベロープです。

タイプA-1
更に動作が分割され、前半部と後半部で動作が異なります。
前半部では音量が減衰し、後半部では増加します。

タイプB
音量値が-1ずつ減少する減衰エンベロープです。

タイプC
減衰という点ではタイプBと同じですが、減衰速度をコントロールできる点が異なり、これも2種類のパターンがあります。
タイプC,スロー減衰
-1ずつ減衰し、音量が変化しないクロックを伸ばすことができます。※下限チェックはあります。

タイプC,急峻減衰
毎クロック音量は減衰し、その減衰量を設定できます。

タイプD
タイプDの期間かどうかを判定する場合、音長の最後から見て判定します。
タイプDの期間に入ると音量は-1ずつ減衰します。

コマンド
EBH
エンベロープ設定コマンドです。データが2バイトあり、計3バイトのデータとなります。
データ | オフセット | 内容 |
---|---|---|
EBH | +0 | ボリュームエンベロープ設定 |
+1 |
b0 - b2: (+22H)[タイプC減算維持カウント/減算値]へ+1して保存.0-7b3: どちらのタイプCを選択するか。0=スロー減衰 1=急峻減衰 b4 - b6: (+21H)[タイプB維持カウント]へ+1して保存.0-7 b7: 開始エンベロープタイプ 0=タイプB 1=タイプA-0 |
|
+2 |
b0 - b3: (+24H)[タイプD維持カウント] 0-15 b4 - b7: (+23H)[タイプC減算回数/タイプC維持カウント] 1-15 |
EAH
音量設定コマンドであり、エンベロープにも関連するコマンドです。
上位4bitが0の場合は、単に(+15H)[マスターボリューム]への設定で(+36H)[タイプA-1後半音量差分]が0設定ではなく未設定扱いとなります。
データ | オフセット | 内容 |
---|---|---|
EAH | +0 | ボリューム設定 |
+1 |
b0 - b3: (+15H)[マスターボリューム] 0-15 b4 - b7: (+36H)[タイプA-1後半音量差分] 0-15 |
EDH
(+25H)[開始音量]、または(+25H)[タイプA維持カウント]及び(+35H)[タイプA-1後半減衰値]の設定です。
上位4bitが0の場合は、(+25H)[開始音量]への設定で、上位4bitが設定されると(+35H)[タイプA-1後半音量差分]及び(+25H)[タイプA維持カウント]への設定となります。
これもEAHと同じく、上位4bitが0のときは(+35H)が0設定ではなく未設定ということになります。
データ | オフセット | 内容 |
---|---|---|
EDH | +0 | 開始音量もしくは減衰値,維持カウントの設定 |
+1 |
b0 - b3: (+25H)[タイプA維持カウント/開始音量] 0-15 b4 - b7: (+35H)[タイプA-1前半減衰値] 0-15 |
(+35H)、または(+36H)を設定すると、(+30H)b0[A-1パラメータ設定フラグ]が1となります。発音初期設定時にエンベロープAが選択されている場合、A-1のエンベロープになります。
(+35H)、または(+36H)を未設定にした場合、(+30H)b0が0となり、発音初期設定時にエンベロープAが選択されている場合、A-0のエンベロープで(+0CH)[音量データ]に(+25H)[開始音量]がセットされます。
ECH
エンベロープフラグ0クリア。(+0FH)[ボリュームエンベロープフラグ1]を波形転送フラグ以外全て0にします。
ボリュームエンベロープ、トレモロエンベロープのoffです。
データ | オフセット | 内容 |
---|---|---|
ECH | +0 | エンベロープoff |
DBH
(+34H)[エンベロープ下限値]を設定します。
この下限値はデフォルトで0です。
データ | オフセット | 内容 |
---|---|---|
DBH | +0 | エンベロープ下限設定 |
+1 | 下限値 |
DCH
(+34H)[エンベロープ下限値]を0にします。
データ | オフセット | 内容 |
---|---|---|
DCH | +0 | エンベロープ下限0クリア |
サンプル
実際のデータで動きを見てみます。
データ | 意味 |
---|---|
FEH 01H | (+09H)を01Hにセットする。音名音長のデータ形式指定 |
E9H 1EH | 基本音長30 |
EAH 0DH | v13 |
D0H | o6 |
F8H 05H | 波形転送5番(sin波) |
EBH 73H 30H | ボリュームエンベロープ設定 開始タイプB タイプB維持カウント7 タイプC,スロー減衰 タイプC減算維持カウント3(+1された値がセットされます) タイプC減算回数3 タイプD維持カウント0 |
00H 00H 00H | 音長30クロックでo6c c c |
FFH | 曲データ終了 |

タイプBの維持カウントとタイプCの減算維持カウントは+1が実際の維持クロックになっています。
減算回数はタイプDに移行したところまでの回数です。
タイプCの期間からタイプDの期間に移行しますが、タイプDの維持カウントは0のため音長が終わるまでタイプDの変化処理は行われず、タイプCの終了音量で変化が止まります。
今度はエンベロープ設定部分のみ変更して、タイプD期間が有効になるように維持カウントを8にしてみます。
また音量が小さくなりすぎないようにタイプBの維持カウントを1に減らします。
データ | 意味 |
---|---|
EBH 13H 38H |
開始タイプB タイプB維持カウント1 タイプC,スロー減衰 タイプC減算維持カウント3 タイプC減算回数3 タイプD維持カウント8 |

タイプDは音長の終わりから維持カウントの範囲に入ると動作することが分かります。
次にタイプDの維持カウントをもっと大きくして、タイプDの期間を伸ばしてみます。
タイプCの期間が長くなるようにこちらも変更します。
データ | 意味 |
---|---|
EBH 17H 5FH |
開始タイプB タイプB維持カウント1 タイプC,スロー減衰 タイプC減算維持カウント7 タイプC減算回数5 タイプD維持カウント15 |

タイプCの期間が途中で終了し、タイプDの期間に移行しています。
このように、タイプDの維持カウント内になると、どのようなタイプの期間でもタイプDに移行することになります。
下限の働き
エンベロープは同じパラメータで、下限を5に設定してみます。
データ | 意味 |
---|---|
EBH 17H 5FH |
開始タイプB タイプB維持カウント1 タイプC,スロー減衰 タイプC減算維持カウント7 タイプC減算回数5 タイプD維持カウント15 |
DBH 05H | 下限を5に設定する |

タイプDの変化途中で下限に到達し、以降変化は停止しました。
下限を11という大きな値にしてみると、
データ | 意味 |
---|---|
EBH 17H 5FH |
開始タイプB タイプB維持カウント1 タイプC,スロー減衰 タイプC減算維持カウント7 タイプC減算回数5 タイプD維持カウント15 |
DBH 0BH | 下限を11に設定する |

v11になった時点で変化が止まり、タイプC、Dの区別も分からなくなりました。
v13で鳴らしていますが、下限を15としてみるとどうなるでしょうか。

最初のクロックはv13で鳴りますが、次のクロックでは下限チェックによりv15となってしまい、データ上で指定したv13を超えてしまいました。
こうなると、音量設定が無茶苦茶になるので、下限は音量設定以下で使う必要があります。
また、それを守るのはデータ側でということも分かりました。
タイプC急峻減衰
データ | 意味 |
---|---|
EBH 1BH F0H |
開始タイプB タイプB維持カウント1 タイプC,急速減衰 タイプC減算値3(+1された値がセットされます) タイプC維持カウント15 タイプD維持カウント0 |

このタイプC減算値も+1された値が実際に減算される値になっています。
減衰量が大きいため、3回目は-4できずに0に到達しています。
タイプA-0
データ | 意味 |
---|---|
EBH C0H 60H |
開始タイプA-0 タイプB維持カウント4 タイプC,スロー減衰 タイプC減算維持カウント0 タイプC減算回数6 タイプD維持カウント0 |

開始音量を指定しない場合の初期値は0なので、0から(+12H)[チャンネルボリューム]まで音量が上がって、タイプBに移行します。
開始音量を大きくすることで、タイプA-0の期間の長さは変化しますが、+1ずつ変化することにはかわりありません。
データ | 意味 |
---|---|
EBH C0H 60H |
開始タイプA-0 タイプB維持カウント4 タイプC,スロー減衰 タイプC減算維持カウント0 タイプC減算回数6 タイプD維持カウント0 |
EDH 0AH | 開始音量10設定 |

こういう仕様なので、ゆっくり音が大きくなるものはエンベロープで対応できません。
MMLで表現すればv9cv10cv11cv12cv13cv14cv15cのような手法で演奏することになります。
以下のような箇所です。
タイプA-1
開始タイプがA-0の時、A-1用のパラメータを設定することでタイプA-1が選択されます。
また、開始音を設定するとA-0が選択されます。
データ | 意味 |
---|---|
EBH C0H 60H |
開始タイプA-0 タイプB維持カウント4 タイプC,スロー減衰 タイプC減算維持カウント0 タイプC減算回数6 タイプD維持カウント0 |
EDH 18H |
(+35H)[タイプA-1前半減衰値]1設定 タイプA前半維持カウント8設定 |
EAH 4DH |
(+36H)[タイプA-1後半音量差分]4設定 音量13設定 |
タイプA-1パラメータ設定時に、EAH、EDHの上位4bitでパラメータを0設定することはできませんが、EAH、EDHの片方だけを設定することで、もう片方のパラメータを0としておくことができます。
ただこれは、ワークエリア初期データ0を利用していて、一度他の値を設定したら曲を変更するまで0にすることができなくなります。
そういう使い方は正しくないのかも知れません。

タイプCの変化中に音量が0に到達してしまいました。