FPGA 版 FM 音源 (15) -- YMF262 測定 (7)
ディケイ/リリースのエンベロープのカーブは DR/RR の値が大きくなると水平方向のステップ幅が狭くなる形となり、RR = 12、Rof = 3 では、水平方向に 1 ステップ幅と 2 ステップ幅とが混在する形となります。
この組み合わせまでは、2 種類の水平方向のステップ幅の混合比率を調節することにより、Rof で指定されるレートを実現します。
RR = 13、Rof = 0 ですべての水平方向のステップ幅が 1 となり、すべてのサンプリング・タイミングでエンベロープ値が変化することになります。
RR = 13、Rof = 1 からは、振幅方向のステップ幅が 2 となるステップが出現してきます。
この組み合わせからは、振幅方向のステップ幅の混合比率の調節で、Rof で指定されるレートを実現します。
RR = 13、Rof = 0 から RR = 14、Rof = 0 までの 5 種のエンベロープをキャプチャした結果のグラフを下に示します。
キャプチャした wav ファイルを波形編集ソフトで表示させると、各サンプリング・ポイントの間を滑らかに補間するグラフが描かれて、振幅方向のステップ幅が不均一なことが感じにくくなります。
そのため、wav ファイルをプログラムで処理してデータ・ファイル化したものを gnuplot の 'steps' スタイルでプロットして、「ギザギザ」した感じを残してあります。
赤色の線の RR = 13、Rof = 0 では、すべてのサンプリング・ポイントで振幅方向のステップ幅が 1 であり、灰色の線の RR = 14、Rof = 0 では、すべてのサンプリング・ポイントで振幅方向のステップ幅が 2 となり、両者ともエンベロープは階段状ではあるものの、滑らかな変化をしています。
それに比べて、Rof = 1、2、3 では、エンベロープの変化が「ガタガタ」しています。
もうちょっと変化を「粗く」して見やすくするために、RR=14 の場合のグラフを下に示します。
青色の線の Rof = 1 では、振幅方向のステップ幅が、
..., 2, 2, 2, 2, 2, 2, 4, 4, ...
の繰り返しとなっています。
また、緑色の線の Rof = 2 では、振幅方向のステップ幅が、
..., 2, 2, 4, 4, 2, 2, 4, 4, ...
の繰り返しとなっています。
さらに、マゼンタの線の Rof = 3 では、振幅方向のステップ幅が、
..., 2, 2, 4, 4, 4, 4, 4, 4, ...
の繰り返しとなっています。
結局、Rof = 1, 3 では、周期 8、Rof = 2 では周期 4 となっています。
振幅方向のステップ幅に 2 と 4 の 2 種しか使わないとしても、「最適」な場合を考えると、たとえば、Rof = 1 では、
..., 2, 2, 2, 4, 2, 2, 2, 4, ...
の周期 4、Rof = 2 では、
..., 2, 4, 2, 4, 2, 4, 2, 4, ...
の 周期 2 で実現できるはずです。
つまり、なぜか、「最適」ではない「ブサイク」なエンベロープの形状となるハードウェアとなっています。
前回の最後に下のようなブロック図を示しました。
RR の値により、「時間」方向のステップ幅を変化させるモードと、「振幅」方向のステップ幅を変化させるモードとの間で、「モード切替」をすることなく、「自動的」に対応するように、サンプリング・クロックの「4 倍速」クロックを使って構成しています。
この回路を実現する C プログラムの出力で検証すると、「時間方向モード」の領域ではキャプチャ結果と一致します。
しかし「振幅方向モード」の領域の、たとえば RR = 14、Rof = 2 では、振幅方向のステップ幅が全て「3」となり、「良すぎる」方向で一致しない結果となります。
実際は上に示したように、「ブサイク」な結果なので、「モード切替」+「サンプリング・クロック・レートでの演算」による回路で実現するように考え直そうと思っています。