FPGA 版 FM 音源 (11) -- YMF262 測定 (3)

今回はエンベロープ・ジェネレータ関係の測定です。
「F-NUMBER」は「MULT」倍され、「BLOCK」ビット・シフトを受けてフェーズ・アキュムレータの「増分」として使われます。
ここで、F-NUMBER を「ゼロ」に選ぶと、「MULT」と「BLOCK」の設定に関わらず、「増分」は常にゼロになりますから、フェーズ・アキュムレータはキーオン時に初期位相の「ゼロ」にリセットされると、それ以降は変化しなくなります。
WS による波形選択が WS = 0 のサイン波であれば、ゼロに近い値が出るだけですが、WS = 6 の方形波を選択すると、位相「ゼロ」の状態の最大振幅の値が出続けます。
これを利用すると、「エンベロープ」を AC 波形の「包絡線」として観測するのではなく、エンベロープ値そのものを「DC 波形」として観測することができます。
そのようにしてキャプチャしたエンベロープ波形を波形編集ソフトで表示したものを下に示します。

AR / DR / RR いずれも 13 に選んであり、「減衰音」タイプのエンベロープとして、アタック完了後は一定のレートで減衰し続けます。
たて軸方向の倍率を上げて、ゼロ付近を拡大して表示したものを次に示します。

エンベロープが減衰していって最後は「ゼロ」に収束して、一見、期待通りの動作に見えますが、実は、これには、おかしな点があり、それについては後の記事で述べます。
キャプチャした振幅値から lb 値を計算し、プロットした図を下に示します。 Rof = 0 の状態です。

緑色、青色、赤色の実線が、それぞれ RR = 15 / 14 / 13 の設定での測定値に対応します。
lb 値の大きい部分で粗い階段状となっているのは、振幅が小さくなって、16 ビット整数に量子化される効果が大きく出てくるためです。
また、lb = 13 で頭打ちになっているのは、スロット (オペレータ) あたりの出力が実効的に 13 ビット幅であることに対応しています。
測定は 2 オペレータの「並列アルゴリズム」で行っていますから、振幅のピーク値は 8168 となっていますが、オペレータひとつ分の出力を 2 倍しただけであり、分解能は 13 ビット分 (符号 1 ビット + 絶対値 12 ビット) のままです。
グラフで、それぞれ点線で示してあるのは、lb 値の小さい部分のデータを使って求めた回帰直線により「外挿」して lb 値の大きい方に伸ばした推定値です。
RR = 13 の場合に 1 サンプルごとに振幅が 1 ステップずつ変化する状態となり、それより RR が 1 減るごとに変化の間隔が倍になっていきます。
たとえば、RR = 12 では 2 サンプルごと、RR = 11 では 4 サンプルごと、 RR = 1 では 4096 サンプルごとに変化します。
逆に、RR が増えていくと、1 サンプルごとに変化する振幅のステップ数が増えていき、RR = 14 では 1 サンプルごとに 2 ステップ分、RR = 15 では 1 サンプルごとに 4 ステップ分の変化をします。
回帰直線を見ると、RR = 13 では、512 サンプルで lb が 16、つまり -96 dB のレベルまで減衰することが分かります。
同様に RR = 14 では 256 サンプル、RR = 15 では 128 サンプルで -96 dB まで減衰しています。
前回の YMF724 ボードの測定 (→こちら) では、lb 値で 9 程度までの結果しか得られず、しかもグラフは曲がっていましたが、今回は限界の 13 ビット幅まで測定でき、回帰直線も予想通りの位置にぴったり合いました。
また、エンベロープ・ジェネレータは、波形生成部と同じサンプリング・レートで動作していることも分かりました。
次は RR の値は一定にしておいて、Rof の値を変化させて測定した結果です。

マゼンタ、緑、青、赤の線が、それぞれ、Rof = 3 / 2 / 1 / 0 に対応しています。
実際の楽器での音が高くなるとエンベロープが短くなる特性をシミュレートするために、音程に応じてエンベロープの変化レートを微妙に調整する「レート・キー・スケーリング」(KSR) の機能が備えられています。
音色パラメタの AR / DR / RR は、値が 1 増えるとエンベロープの時間としては 1/2 倍になりますが、この 2 倍ステップでは刻みが粗すぎるため、2 倍ステップの中を 4 分割したステップでレート・キー・スケーリングを行うようになっています。
その分割したステップのインデクスでの補正量を示すのが Rof (Rate offset) です。Rof の値は、「NTS」、「BLOCK」、「FNUM」、「KSR」の値の組み合わせで決定されます。
ここでは FNUM = 0 の設定で使っていますから、実質的に「NTS」の値は関係なくなり、「BLOCK」と「KSR」の値だけで Rof を決定できます。
「2 倍」という「比率」を 4 分割するのですから、理論的には、4 分割したステップ当たりの比率を a とすれば、各ステップは、順に 1,\, a,\, a^2,\, a^3 となり、その値は、
\qquad\qquad a^4 = 2
\qquad\qquad a = 2^{1/4} = 1.189207...
\qquad\qquad a^2 = 2^{1/2} = 1.414213...
\qquad\qquad a^3 = 2^{3/4} = 1.671792...
となります。
ちなみに、12 平均率の音程で表現すれば、a は「短三度」(300 セント)、a^2は「減五度」(600 セント、増四度)、a^3は「長六度」(900 セント)です。
しかし、実際には、YMF262 では、このような無理数の「長い」数を使ってはいません。
点線で示した回帰直線を使って、それぞれの直線の「傾き」を求めると、サンプル・インデクス = 256 の点で、lb 値は、Rof = 3, 2, 1, 0 に対してそれぞれ、14, 12, 10, 8 となっていますから、比率としては、
\qquad\qquad \frac{14}{\,256\,}\,:\,\frac{12}{\,256\,}\,:\,\frac{10}{\,256\,}\,:\,\frac{8}{\,256\,} \,=\, 7\,:\,6\,:\,5\,:\,4\,=\,1.75\,:\,1.5\,:\,1.25\,:\,1
となっています。
これは「傾き」、つまり、横軸の単位長さあたりの縦軸方向の変化量ですから、EG のアキュムレータに加算する「増分」の比率ということになります。
前の理論値と比較すると、

   1.189207 → 1.25
   1.414213 → 1.5
   1.671792 → 1.75

という簡略化が行われています。
Rof 自体の値は、KSR = 0 では「弱い」補正で 0 〜 3 の範囲ですが、 KSR = 1 では「強い」補正で、0 〜 15 まで変化します。
EG の計算としては、
   Actual_rate = Rate_value * 4 + Rof
という式で「Actual rate」を計算し、その下位 2 ビットでアキュムレータの増分を設定し、上位 4 ビットで、その増分のシフト量を決めることになります。