MIDI to CV (9) -- まとめ

今回の実験の、

  • のこぎり波 VCO
  • SCF VCF
  • CPLD による VCO

では、いずれの場合もオクターブ境界でノイズが発生していました。
オクターブ・コード + F-Number (D-Number) という構成では、回路動作が理想的でない限り、現実的には避けることのできない現象です。
その中でも、次の2つが大きな要因です。

  • PLL や、周波数ロックループ応答時間
  • オクターブ・コードと、F-Number (D-Number) の切り替えタイミングのずれ

のこぎり波 VCO の例では、F-Number はアナログ電圧として供給していましたから、リニアリティの良い高周波 VCO を使用できれば、かなり改善できます。
フィードバックによってリニアリティを改善している現在の構成では、DA コンバータへの LRCK (約67 〜 134 kHz) で F-V コンバータであるモノマルチをトリガしています。
ATtiny2313 に 2 個内蔵されているタイマは両方とも使っているので、新たに外部にカウンタを設けて高い比較周波数を得ることができれば、ループフィルタの自然周波数を上げることができ、ループの応答時間の短縮が可能です。
SCF クロックの PLL では、現在の構成では、比較周波数 (約 16 kHz) 自体を上げることは難しいですが、ループフィルタを調整すれば、少し改善できると思います。
CPLD によるのこぎり波発生では、フィードバックループを持たないので、高速な応答が可能ですが、実際にはノイズを生じています。
これは、オクターブ・コードによる分周の切り替えのタイミングと、D-Number による分周の切り替えのタイミングが一致していないことによるものです。
オクターブ・コードの方は即時に値の変化が反映しますが、D-Number 分周の方は、現在のカウント値がターミナル・カウントに達し、リロードするまで、プリセット値である D-Number は一切参照されないことによるものです。
回路を変更して、D-Number 分周でリロードが発生するタイミングで、同時にオクターブ・コードを反映させるようにすれば解決できます。
しかし、この分周方式では、別の問題も発生します。
それは、現在カウント中の D-Number 分周のサイクル終了まで、次のピッチ情報が反映されるのが遅れるということです。
現在の CPLD の構成では「オクターブ分周」→「D-Number 分周」という順番ですから、D-Number 分周では目的の MIDI ノートの周波数そのものを発生しています。
MIDI ノートの最低音 は約 8 Hz ですから、その場合、最長で 1/8 = 125 ms 経過しないと次の音のピッチに移行しないことになってしまします。
同様の現象は、F-Number を 1/N に使っている SCF クロック発生用 PLL の場合も発生しますが、その場合、1/N カウンタが発生する周波数は約 16 kHz ですから、遅延は 63 us 程度であり、問題にはなりません。
CPLD の構成を「D-Number 分周」→「オクターブ分周」という順番に変え、オクターブ分周部の出力を DAC に出力して得た階段波と、D-Number 分周部の出力を DAC に出力して得たのこぎり波を加算して、目的の周波数の、のこぎり波を合成する方法にすれば遅延の問題は解消できます。
ただし、ピッチの切り替わり部分で波形の加算がうまく行かず、ノイズを生じてしまう可能性はあります。

モノシンセでも 2 VCO、3 VCO 構成で使う場合や、ポリフォニック化して VCO が多数必要な場合への対応を考えると、今回の方法よりも、オーソドックスな DDS 方式 (フェーズ・ジェネレータ方式) の方が良いように感じます。
ATmega168 上に実現したFM音源プログラム「TGmega」では、16 kHz サンプリングで 2 オペレータ音色が 2 音発音できましたから*1、32 kHz サンプリングで考えると、

  • MIDI to CV 機能
  • のこぎり波 VCO 2 個
  • EG 2 個

を実現できることになります。
そこで、次の段階として、ATmega168 上に、上の機能を組み込み、前に「ディジタル・リワインド方式」と名付けた、意図的に1サンプル分の立下り部分を付加する方式の検証をしてみたいと考えています。

*1:ただし CPU クロックを規格外の 24 MHz にしている。