MIDI to CV (5) -- SCF VCF (2)

SCF クロック生成部

MF10 は中心周波数 f0 が SCF クロックの 1/100 になるモードを選びます。
中心周波数が MIDI ノート番号 0 (C0) の約 8 Hz から、実際には存在しないノート番号 131 (B10) の約 16 kHz までを可変範囲とすると、SCF クロック周波数は約 0.8 KHz から約 1.6 MHz となります。
この SCF クロックは 5V TTL レベルですから、マイコン内蔵タイマを使って発生させます。
使用するマイコンとしては、ATtiny2313 (Atmel 製) を選びました。
最高 20 MHz クロックで動作できますから、CPU クロックとしては、8 MHz 〜 16 MHz を供給します。
そして、オクターブの指定に応じて、タイマ 0 を使って CPU クロックの 1/10、1/20、1/40、... を SCF クロックとして 発生させます。
タイマ 0 は 8 ビットですから、タイマレジスタだけでは不足するので、プリスケーラを併用して、目的の分周比を得ています。
この SCF クロック生成部のブロックダイアグラムを下に示します。

PLL を使って、リファレンス周波数の F-Number 倍のクロックを発生させます。
ピッチ情報は、SPI 経由で F-Number 12 ビット、オクターブ・コード 4 ビットの計 16 ビット (2 バイト) データとして渡します。
実際には、上のブロックダイアグラムとは違って、SPI のスレーブ・セレクトあるいはチップ・セレクト信号は使っていません。
16 ビット F-Number テーブルは、その値が 0x8000 〜 0xFFFF の間にあり、常に MSB (b15) が 1 です。
この F-Number の下位 4 ビットをマスクし、オクターブ・コードで置き換えています。
バイトの区切りが正しくないと、F-Number の b8 の値が b15 として読まれることになります。
b8 の値が 1 である確率は 50 % ですから、1 であるはずの b15 の値が 0 だったら、バイト区切りの同期エラーとして区切り方を変えます。
たまたま、b8 の値が 1 であるデータが続くと、区切り間違いが修正されない状態が続くことになりますが、いつかは正しい同期状態に修正されることが期待されます。
上のブロックダイアグラムの、PLL の 1/N で表されるプログラマブル分周器は、タイマ 1 を使って実現しています。
12 ビット F-Number を、さらに 2 ビット削って、10 ビットとし、fast PWM モードに設定したタイマ 1 の「TOP」値 *1 として使い、CPU クロックの 1/1023 〜 1/512 の周波数を PLL の位相比較器に戻しています。

  • SCF クロック生成部の回路図

*1:実際には F-Number から 1 引いた値を OCR1A レジスタに設定する。 たとえば、F-Number = 512 = 0x200 なら、511 = 0x1FF を設定する。