BBD コーラス (1)
「エフェクト」としての「コーラス」とは、原音のタイミングから少し遅延させた上で、そのピッチを周期的に変化させたエフェクト音を生成し、原音とミックスすることによって、原音が単一の楽器の音であっても、複数の楽器でユニゾンで演奏しているかのように聞こえる効果を得る方法のことです。
信号処理方法としては、「ディレイ・ライン」を用意しておき、その遅延量を変調することで実現します。
遅延量が時間とともに減少するように変調を掛ければ、エフェクト音のピッチが上がり、反対に、遅延量が増加するような変調ではエフェクト音のピッチが下がる方向になります。
入力 A/D サンプリング、出力 D/A サンプリング、および信号処理を、常に一定のサンプリング周波数で行うディジタル信号処理では、「出力タップ位置」が可変なディレイ・シフトレジスタを使います。
信号は時間方向に「離散化」されているので、各サンプリング・タイミング間の時刻の信号の値は、理論的には sin(x)/x (sinc 関数) を用いて補間して求める必要があります。
これを本格的なフィルタで行えば手間がかかりますが、隣接サンプル間の線形補間を取る程度で妥協するならば、処理自体は単純なものになります。
一方、純粋な「アナログ」、つまり、時間方向も連続、振幅方向も連続な可変遅延線は容易に得られないので、振幅方向は連続で、時間方向に離散化した「サンプル値」系として BBD (Bucket-brigade Device) を使ったコーラスが、いわゆる「アナログ・コーラス」として良く使われていました。
BBD では、遅延段数は固定で可変できない構造なので、「ピッチ・シフト」効果を得るためには、BBD サンプリング・クロック自体の周波数を変調する必要があります。
信号が BBD に取り込まれた時点でのクロック周波数より、信号が BBD から出力される時点でのクロック周波数が高ければ信号のピッチは上がり、反対に出力時点でのクロック周波数が低ければピッチは下がります。
フル・ディジタルでの実現では、前述のように処理を端折れば単純なものとなり、「面白味」に欠けるので、ちょっと寄り道して、「BBD コーラス」を作ってみることにしました。
と言っても、本格的に「エフェクタ」を作ろうというわけではなく、単に回路的な興味に基づくもので、電池動作、音質、ノイズ、操作性などは考慮せず、一応の動作が確認できれば満足というレベルのものです。
また、現在ではリアルな BBD IC は割高なので、実際のチップは使用せず、手持ちのマイコンでエミュレートすることにしました。
CPU の処理能力は要求されないので、クロック周波数が 24 MHz と低い STM32 Value Line Discovery (CPU は STM32F100) を選びました。
RAM は 8 K バイトあるので、16 ビット・データを最大 4096 段遅延させることができます。 実際はスタック領域などが必要なので、実現可能な段数はこの値よりも減少します。
A/D、D/A はそれぞれ 12 ビット分解能であり、外部トリガに同期して更新させることができるので、BBD クロックでトリガ入力を駆動する構成にできるのも好都合です。
また、DMA も内蔵しているので、A/D、D/A とディレイ・メモリ間の転送に CPU が関与しなくてすみ、実際に、周辺モジュールの初期化のあとは、何もしない無限ループを実行するだけというプログラムになりました。
プログラムは後の記事で示す予定です。
メイン・プログラムの本体は「空」になるので、BBD クロックをディジタル的に発生させるプログラムを組み込んでみましたが、クロック周波数が低いためか変調の条件によっては滑らかにピッチが変化しない傾向が見られましたので、クロックはアナログで発生させることにしました。
BBD クロック発生には、直線的に変化する入力電圧に対して、周波数の逆数 (つまり「周期」) が直線的に変化する VCO が必要になります。
そのような特性が得られる「定番」の回路がありますが、ここでは、CMOS タイマ IC の LMC555 を使った回路で、比較的に良い精度が得られたので、次回の記事で紹介します。