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」の固定パターンになるように変えるだけで、ディケイ/リリースを発生させることができます。