FPGA 版 FM 音源 (20) -- YMF262 測定 (12)

アタックやディケイ/リリース・レートが「13」以上の場合を「ハイ・レート」、「12」以下の場合を「ロー・レート」と呼ぶことにします。 ハイ/ローにより、エンベロープの計算方法が変わります。
ハイ・レートでのアタック計算回路の概念図を下に示します。
1 月 26 日付けのロー・レート用の回路では、アキュムレータからフィードバックするシフト量は固定でしたが、ハイ・レート用では、バレル・シフタによりシフト量を 3 段階変えることができるようになっています。
そして、そのシフト量のコントロールを「レート・マルチプライア」の内部から信号を取り出して行っています。

レート・マルチプライアのクロックには、サンプリング・クロックをレートの値によってプリスケールしたものを与えますが、レートが 12 以上の場合はサンプリング・クロックそのものを供給します。 したがって、ハイ・レートでは常にサンプリング・レートでのクロッキングになります。
「部品」として売られているレート・マルチプライアは、74 シリーズのロジック IC では 7497 (6-bit Synchronous Binary Rate Multipliers)、標準メタルゲート CMOS では 4527 (BCD Rate Multiplier) があります。
いずれもあまり一般的な IC ではなく、「LS」タイプや「74HC」タイプはありませんが、「スタンダード」品なら現在でも購入することができます。
この部品となっている IC では、入力クロックそのもの (のコピー) を間引いて出力していますが、ここでの回路は、FPGA などの同期回路での使用を念頭において、クロックそのものを出力するのではなく、「クロック・イネーブル」信号を出力して、後続の回路には、クロックそのものは連続で入力しておき、クロック・イネーブルで動作を行うかどうかを決定するものとしています。
上の回路のレート・マルチプライア部の真理値表を下に示します。

















Rof= 0 1 2 3 0 1 2 3
  SFT_SEL CLK_EN
カウント (bin)
0 000 0 0 1 1 1 1 1 1
1 001 0 0 1 1 0 0 1 1
2 010 0 0 0 0 1 1 1 1
3 011 0 0 0 0 0 0 0 0
4 100 0 0 1 1 1 1 1 1
5 101 0 0 1 1 0 0 1 1
6 110 0 1 0 1 1 1 1 1
7 111 0 1 0 1 0 1 0 1


「SFT_SEL」信号がバレル・シフタのシフト量を決定する信号で、「0」のとき AR = 13 では 1/8、AR = 14 では 1/4、「1」のとき AR = 13 では 1/4、AR = 14 では 1/2 に相当するシフト量となります。


Rof = 0 では SFT_SEL は常に「0」で変化しません。


Rof = 1 ではオクタル (3 ビット・バイナリ) カウンタの 8 カウントのうち 2 カウント分だけ SFT_SEL が「1」となり、Rof = 2 では 8 カウント中 4 カウント、Rof = 3 では 8 カウント中 6 カウントが「1」となります。


ちなみに、ロー・レート用の「CLK_EN」信号では、レート・マルチプライアとしては、Rof の「見えないビット 2」が常に「1」(Rof[2] = 1) と見なして、オクタル・カウンタの Q0 反転出力を OR して、Rof = 0、1、2、3 に応じて 4/8、5/8、6/8、7/8 のレートで「CLK_EN」が出るようにしています。


1 月 17 日付けの記事での、ハイ・レートでの周期が「最適」な 4 や 2 ではなく、8 や 4 になっているのはなぜかと言う疑問は、このように、ロー・レート用の回路と「共用」しているためだと考えると納得できます。


このオクタル・カウンタは、アタック開始や、リリース終了などの「イベント」でリセットされずに、「フリーラン」で回っているようです。


AR/DR = 14、Rof = 3 の設定で、キーオン間隔が「63」サンプルの場合のエンベロープ波形をキャプチャしたものを下に示します。

ここでは 3 波分を示してありますが、それぞれ、微妙に「波形」が異なっていることが分かります。


「63」と「8」は「互いに素」ですから、キーオンごとにオクタル・カウンタの「初期位相」は変化し、全 8 種類を渡ることになります。
ここでは示してありませんが、実際、8 種類の「波形」が周期 8 で繰り返していることが確認できます。


次はキーオン間隔が「64」サンプルの場合です。



「64」は「8」の倍数なので、「初期位相」はひとつしか存在せず、すべて同じ「波形」となっています。


最初の回路図では簡単のため示してありませんが、EG アキュムレータ内容のフィードバックではなく、バレル・シフト後のアキュムレータ更新値が「+1」、「+2」、「+4」の固定パターンになるように変えるだけで、ディケイ/リリースを発生させることができます。


最後に、このアルゴリズムを C プログラムで書いて、エンベロープを発生させた結果のグラフを示します。