FPGA 版 FM 音源 (5) -- EG (2)

前回の記事で述べた、

  • Windows 98MS-DOS コマンド・プロンプト上の DOS 版 FM 音色エディタで操作
  • S/PDIF 経由で別 PC で波形キャプチャ
  • 時間軸反転および処理

という手順で求めた、RR (Release Rate) を 1 から 3 まで変えてプロットした結果を下に示します。

縦軸には (→こちら) で勝手に定義した「lb」(エルビー) 値をとっています。
最大振幅で 0 (0 dB) となり、lb が 1 増えるごとに振幅は半分 (-6 dB) になります。
dB 単位での値に変換するには、lb 値に -6 を掛けます。 たとえば、lb = 8 なら、
  -6 [dB] x 8 = -48 [dB]
となります。
リリース・エンベロープはエクスポネンシャルでの減衰ですから、グラフは直線状になります。
横軸には、サンプリング周波数 fs = 48 kHz でキャプチャしたインデクスを、FM 音源部の fs = 49.516 kHz でのサンプル・インデクスの表現に変換し、さらに 1/256 にしたものを表示しています。
1/256 にするのは、そのままでは数値の桁数が多くなりすぎるためです。
lb 値が 6 を超えるあたりから、グラフが直線状ではなく湾曲してくるのは、残留ノイズの影響と思われます。
本来は無音であるべき状態でも、ピーク値で ±4 程度の残留ノイズが常時乗っているのが見られます。
FM 音源出力部から S/PDIF 出力部までの間には、サンプリング・レート変換や、ディジタル・ミキサなどが介在しており、何が原因かは良く分かりません。
また、lb 値が大きい部分で、グラフが階段状になっているのは、最終的な出力フォーマットは 16 ビット・リニア PCM ですから、信号の振幅が小さくなってくると、下位ビットが切り捨てられ、実効的な「分解能」が減少するためです。
上のグラフのスケールでは分かりませんが、lb 値の小さい部分でも細かい階段状になっています。
なお、キー・レイト・スケーリング (KSR) による Rof の値がゼロになるようなキーの値を選んでいます。
RR = 1 の場合について、lb の値の小さな部分のデータに対して回帰直線をあてはめた結果を次に示します。

lb 値が 0 から 1 の範囲について拡大して表示したグラフを下に示します。

数えてみれば分かりますが、lb = 0 から 1 の間に 32 ステップあり、その 1 ステップ分を dB 表示すると、
  6 [dB] x 1/32 = 0.1875 [dB]
となり、「OPL4 YMF289D APPLICATION MANUAL」の 54 ページの

This envelop has a dynamic range of 96dB (resolution: 0.1875dB) and is expressed by damping amount.

という記述の中の「0.1875 dB 分解能」と、当然ですが一致しています。
ひとつ前のグラフの回帰直線の傾きの計算値は約 -1/512 になっています。
上のグラフでも横軸の 512 の変化に対して、縦軸の lb は 0 から 1 までの変化をしています。
測定結果のグラフでは、残留ノイズに紛れてしまうため、 lb 値 9 程度までしか表示していませんが、回帰直線によって -96 dB (lb = 16) までを外挿すると、
  16 = -x / 512

  x = -16 x 512 = -8192
となります。
横軸の「1」は、すでに 1/256 されたサンプル・インデクスですから、本来のサンプル・インデクス数を求めると、
  256 x 8192 = 2097152
となります。
これをサンプリング周波数 fs = 49.516 kHz で割ればリリース時間が求まりますから、
  2097152 / 49.516 kHz] = 42353.20 [ms]
となります。
「OPL4 YMF289D APPLICATION MANUAL」の 56 ページのディケイ/リリース・レートの表では、RATE = 4 に対しては、39280.64 ms となっており、約 8 % の微妙な違いがあります。
同様に、RR = 3 の場合の lb の小さい部分のグラフを下に示します。

RR = 1 の場合のグラフと、ほとんど変わりがないように見えますが、横軸の目盛りの数値は 1/4 になっています。
つまり、エンベロープは、より少ないサンプル・インデクス間隔で変化していることになります。
同様にしてリリースレートを上げていくと、 RR = 7 では、fs = 49.516 kHz の実サンプル・インデクスの値で「32」ごと、RR = 8 では、なんとか、ぎりぎり「16」ごとに変化しているようにも見えます。
それよりリリースが速い設定ではキャリアの正弦波周波数を 4 kHz 程度に上げても「分解能」が十分ではなく、「16」サンプルより短い間隔でエンベロープが更新されているのかどうかは判別がつきません。
これ以上詳しく見るには、前回示したような YMF262 (OPL3) ネイティブの実験回路を作成し、fs = 49.716 kHz のリアル・サンプリング・レートでのキャプチャを実行する必要があると思います。
次に、AR = 1 でのアタックのグラフを下に示します。

アタックは、ディケイやリリースの逆変化ではないので、直線的な変化はしていません。
「刻み」は粗く、たぶん全体で 32 ステップであろうと思います。
上のグラフの縦軸を対数目盛りにして表示したのが下のグラフです。

これを見ると、lb 値の大きい部分で直線に近くなっていることが分かります。
対数である lb 値の、そのまた対数表示で直線的ということは、実際のリニア値のエンベロープとしては、直線変化の指数の指数を取ったものに相当し、つまり、それはゴンペルツ曲線に近いものとなっています。
ゴンペルツ曲線は、32 ビット RISC 版の FM 音源プログラムのアタックのカーブに使用しており、 (→こちら) に記事を書きました。
(リニアな振幅で見た) アタック波形を下に再掲しますが、lb 値の小さい部分、つまり、アタックのピークに近い部分は直線的に見えます。

刻みが約 32 ステップと粗いこともあり、おそらくアタックのエンベロープは小容量の ROM を使って発生させているものと思われますが、何か簡単な回路で発生できる方法があるのかも知れません。