FPGA 版 FM 音源 (47) -- YMF297 (OPN3/OPL3) 測定 (12) -- サステイン・レベル

今回は、OPL3 の音色パラメタの「SL」(Sustain Level) と実際の EG 出力のサステイン・レベルの不一致についての話です。
音色パラメタの SL は 4 ビットの値で、dB 単位の出力レベルと各ビットとが下の表のように対応づけられています。

b3 : -24 dB
b2 : -12 dB
b1 : -6 dB
b0 : -3 dB

たとえば、SL = 1 では出力レベル = -3 dB、SL = 14 では出力レベル = -42 dB の指定となります。
EG アキュムレータがこの値に等しくなった場合に、EGT = 1 では (KON = 1 である限り) サステイン・レベルを維持する状態となり、EGT = 0 では、ではディケイ・レート (DR) での減衰からリリース・レート (RR) での減衰に切り替わります。
9 ビットの EG アキュムレータとアライメントを合わせると、

EG_ACC[8] : 0
EG_ACC[7] : SL[3]
EG_ACC[6] : SL[2]
EG_ACC[5] : SL[1]
EG_ACC[4] : SL[0]

という対応関係で数値を比較することになります。
EG アキュムレータの最上位ビット EG_ACC[8] に対しては、「定数」のゼロと比較します。
DR = 13, Rof = 0 以下では、EG アキュムレータは fs クロックごとに高々 1 増加するだけです。
その場合、上記の 5 ビットの値が最初に一致するのは EG アキュムレータに 1 を足した結果、EG_ACC[3:0] がゼロになって EG_ACC[4] に向かってキャリーが発生し、Verilog 風に表現すれば、

EG_ACC[8:4] == {1'b0, SL[3:0]} 

となる場合に限られます。
したがって、下位 4 ビットは全く考慮することなく、上位 5 ビットだけを見ていれば SL パラメタで指定されたサステイン・レベルに達したことが検出できます。
一方、DR = 13, Rof = 1 以上では、 fs クロックごとに EG アキュムレータの値が 2 あるいは 4 変化する可能性があります。 その場合には上位 5 ビットが一致した時点で下位 4 ビットがゼロになるとは限りません。
下にそのような例を図で示します。

(a) の図は、EG アキュムレータの増分が 1 / 2 / 4 の固定値で、上位の一致を見るだけで n サンプル目で下位ビットまで一致する場合です。
(b) の図は、EG アキュムレータの増分が 1 / 2 / 4 が混在する場合で、n-1 サンプル目まで上位ビットが一致せず、n サンプル目で上位ビットが一致しますが、下位ビットはゼロとならず、サステイン・レベル・パラメタ (SL) で指定される値を行過ぎる場合です。 EG の値としては過剰に減衰して出力されることになります。
(b) の場合、過剰に減衰する形となった EG 出力値を SL で指定される値に置き換えることも回路的には可能ですが、実チップを測定すると、出力値の置き換えは行なわれていません。
キャプチャした結果の図を下に示します。

EG 関係のパラメタを

Rof = 3
AR = 13
DR = 14
SL = 1 (-3 dB)

として、KON の間隔を奇数に選んで繰り返したものです。 この設定では、ディケイにおける EG アキュムレータの増分は 2 と 4 の混在となります。
上の図で青色のトレースで示されているのが、SL パラメタで指定されるサステイン・レベルのリニア値に等しい 2888 となる場合です。 (EG アキュムレータ値としては 9'b000010000 )
赤色のトレースで示されているのが過剰に減衰してサステイン・レベルのリニア値が 2766 となる場合です。 (EG アキュムレータ値としては 9'b000010010 )
SL で指定した通りのサステイン・レベルになるか、過剰に減衰したレベルになるかは、レート・マルチプライアの位相によって決まり、8 回の繰り返しの中で SL 通りの出力値 2888 が 7 回、過剰な減衰の 2766 が 1 回表れます。
これがモジュレータ出力の EG 波形とすると、タイミングによっては、サステイン時の変調レベルに 0.375 dB の変動が生じることになり、厳密には音色にわずかな変化が生じることになります。