FPGA 版 FM 音源 (4) -- EG (1)

FM 音源プログラムでの EG (Envelope Generator) の処理は、処理量をなるべく減らすことに重点を置いていて、オリジナルの再現という点に関してはあまり考慮していませんでした。
そのため、現実の OPL3 チップ (YMF262) の特性の測定などは行っておらず。MA-2 オーサリング・ツールの出力を観測するにとどまっていました。
今回、FPGA 版を作るにあたり、なるべくオリジナルに近いものを再現したいので、現実のチップの出力波形を測定することにしました。
オペレータのサイン波形発生部については、大体のところで方針は決まっていますが、EG 部分は、まだ具体的なプランはないので、EG 関係の測定を最初に行うことにしました。
出力波形のディジタル値を、1 ビットも漏らさずにキャプチャしたいので、下の図のような構成を考えています。

基本的に、

  • PC からシリアル・インターフェースなどを通じて YMF262 のレジスタに値を書き込めるようにしておき、
  • 出力サンプリング周波数がオリジナルの 49.7 kHz ではなく、48 kHz になるようなマスタークロック周波数を選び、
  • fs = 48 kHz の S/PDIF 信号として出力波形を PC 側に送出し、
  • PC 側のサウンドカードなどで S/PDIF 信号をキャプチャして wave ファイル化する

ことを考えています。
OPL3 では、マスタークロック周波数の 1/288 が出力サンプリング周波数となりますから、fs = 48 kHz にするためには、マスタークロック周波数を
48 [kHz] x 288 = 13.824 [MHz]
に選ぶ必要があります。
この周波数の HC49US タイプの水晶振動子は、サトー電気で単価 126 円で購入できますが、それだけでは済まずに、S/PDIF トランスミッタ用の 128 fs 〜 384 fs 程度の位相関係の安定したクロックも同時に必要となります。
そのため、S/PDIF 用の fs = 48 kHz に対する 384 fs クロックである 18.432 MHz をマスターにして、YMF262 のクロックとしては、これを PLL などで 3/4 倍した 13.824 MHz を作りだして供給することにします。
まだ具体的な構成方法を決めていないので、実現するのは先の話となりますから、まずは、手っ取り早く、 S/PDIF 出力を持つ YMF724 (DS1) を使って測定を始めることにしました。
YMF724 は AC'97 コーデックと組み合わせて使うため、fs = 48 kHz が基本であり、クロック入力は 24.576 MHz 一本です。
しかし、データシートには内部で PLL により 33.8688 MHz を発生させていることが明記されており、FM 音源部の構成については YMF715x (OPL3-SA3) 世代と同等と思われます。 (ただし、データシートの記述は「33.87 MHz」となっているが、これは 33.8688 MHz を四捨五入したものと思われる)
したがって、マスタークロック周波数 14.31818 MHz の YMF262 (OPL3) とは一部で相違があるかも知れませんが、「OPL4 YMF289D APPLICATION MANUAL」などの記述とは良く一致するはずです。
とは言っても、YMF724 でも十分古いチップで、すでに現役ではなく、再び動かすまでに少し苦労しました。
440BX 時代の PC/PCI (いわゆる「SBLINK」) などの、PCI から ISA バスの IRQ / DMA を使うためのハードウェア・メカニズムがない最近のチップセットを使った PC で、Windows 2000 から動かそうとするとトラブルになる可能性が考えられたので、Windows 98 上で動かすことにしました。
Windows ドライバ上で S/PDIF 出力が有効になるように設定しておき、MS-DOS コマンド・プロンプトで DOS 時代の FM 音色エディタを動かして、各種 EG パラメータを操作しました。
そのようにして、別の PC 上で S/PDIF 信号をキャプチャして wave ファイル化したのが次のような波形です。

信号自体は約 1 kHz の正弦波なので、画面表示では塗りつぶされたようになって、エンベロープが見えています。

AR = 15 (最速)、DR = 15 (最速)、SL = 0 (最大)

と設定して、エンベロープの「前半」は真四角の「豆腐」状にして、リリースのエンベロープだけを観測対象にしています。
「ディケイ」と「リリース」の変化の様子は同等なので、どちらを対象にしても良いのですが、「ディケイ」を対象にすると、エンベロープの最大値がアタックの終了とディケイの開始の境界の一瞬しかないので、最大レベルを正確に捉えることが難しくなります。
そのため、EG タイプ (EGT) をサステイン系とし、サステイン・レベル (SL) を最大 (0dB) の 0 に選び、しばらくの間キーオン状態を維持して、エンベロープの最大レベルが続くようにしています。
さらに、波形編集ソフトで、時間軸方向を反転して下のような波形にしています。

この状態では、エンベロープは「単調増加」になるので、波形の「ピーク・ホールド」をするだけで、エンベロープのトラッキングができます。
具体的には、サンプル値を読み込み、それを 2 乗して全て正の値として「全波整流」に相当する操作を行います。
その値を現在までの最大値と比較し、最大値が更新されたなら、サンプル番号と、その最大値との組を記録しておきます。
あとは記録された最大値の対数を取ってグラフ表示をします。
アタックを対象にキャプチャした波形を下に示します。

アタックはもともと単調増加なので、時間反転の必要はありません。
エンベロープがステップ状になっているのが見えますが、これは全部で 32 段あります。
ディケイやリリースと比べると、かなり粗いエンベロープです。
長くなってきたので、結果のグラフは次回の記事で示します。