新版FM音源プログラム (14)

プログラムを動作させるマイコン・ボードとしては、オペレータ出力波形をオシロで手軽にチェックするために、手持ちの中で DAC を内蔵するチップを搭載している次のボードを選びました。

それに加え、単体の LPC1114FN28/102 (Cortex-M0) に SPI 接続の DAC、MCP4922 をつないだものを使いました。 (2018 年 2 月 26 日追記: PSoC4 / PSoC5LP を追加しました)
開発ソフトウェアとしては、ARM/Keil の μVision V5.21.1.0 (MDK-Lite V5.21a) と、Atollic TrueSTUDIO for STM32 v9.0.0 とを使いました。
PSoC については PSoC Creator 4.0 Update 1 (gcc 4.9.3) を使いました。

続きを読む

新版FM音源プログラム (13)

これまでのFM音源プログラムでは、オペレータ (スロット) ひとつ分を実現する関数を定義し、それをオペレータの個数だけ呼び出していました。
より効率化するために、ひとつの関数内ですべてのオペレータの計算を行なうように変更することを考えています。
8 K エントリのウェーブ・テーブルを使うタイプのプログラムと、3.75 K エントリのウェーブ・テーブルを使うタイプのプログラムとで、実行サイクル数に大きな差はありませんでした。
そこで、ウェーブ・テーブル・サイズの削減効果を重視して、2016 年 8 月 16 日付けの記事 (→こちら) で示している 3.75 K (3840) エントリのウェーブ・テーブルを使うことにしました。

続きを読む

FPGA 版 FM 音源 (50) -- YMF297 (OPN3/OPL3) 測定 (15) -- EG クロック・プリスケーラ (2)

2016 月 11 月 18 日付けの記事 (→こちら) で述べた EG クロック・プリスケーラの動作は、よく考えればレート・マルチプライア (rate multiplier) そのものでした。
パイプライン方式で複数オペレータを実現する場合に各オペレータ固有の内部変数として 8 進レート・マルチプライアの状態を保持する必要があると思っていましたが、EG クロック・プリスケーラをレート・マルチプライアで実現すれば、ひとつのプリスケーラ・ハードウェアを全オペレータで共有でき、内部変数を持つ必要はなくなります。
FPGA / CPLD での RTL 記述、およびソフトウェアによる実現に適した計算方法を下に示します。 (対象はローレートのみ)

続きを読む

FPGA 版 FM 音源 (49) -- YMF297 (OPN3/OPL3) 測定 (14) -- EG ミュート状態

リニア出力のアナログ EG では、ディケイ/リリース回路に 1 次 RC 回路の放電特性のエクスポネンシャル・カーブを利用していれば、時間の経過とともに出力電圧はサステインあるいはグラウンド・レベルへ限りなく接近していきます。 
リリース状態で「放置」していても、グラウンド・レベルに貼りついたままであり、不都合を起こす心配はありません。
一方、対数ドメインで動作するディジタル EG では、ディケイ/リリースのエクスポネンシャル・カーブでの減衰は、EG アキュムレータに定数を足しこんでいって、減衰量を増やすことによって実現されています。
リリース状態を「放置」しておくと、どんどん増加する EG アキュムレータの値がいつかは最大減衰量を超えてオーバーフローし、ラップ・アラウンドして減衰量が小さな状態に突入してしまいます。
したがって、EG アキュムレータの値の更新を最大減衰量 (あるいは、その付近) で停止させる、「OFF」あるいは「ミュート」と呼ぶべき状態を設ける必要があります。
下に実チップのキャプチャではなく、アタック/ディケイのみのソフトウェア EG シミュレーション・プログラムを使って作成した、最大減衰量付近のふるまいの図を示します。

続きを読む

FPGA 版 FM 音源 (48) -- YMF297 (OPN3/OPL3) 測定 (13) -- EG パラメタ・レジスタ

今回の小ネタは、OPL3 の EG パラメタ (AR/DR/RR) の値が有効になる (参照される) タイミングについてです。
結論から言えば、アタック/ディケイ/リリースで、その状態に対応するレート・レジスタ AR/DR/RR が選択されている限り、ラッチされることはなく常に素通しで、ホスト・マイコンがそのレジスタの値を書き換えるとリアルタイムに出力に反映されます。
サステイン・レベル (SL) に関しては、サステイン状態への遷移の判断に使われるだけで、いったんサステイン状態に進むと、SL の値を変更しても EG の状態は変化しません。
EG がリリース状態になってから遂次 RR を減衰が早くなるように書き換えた場合の、実チップの EG 出力のキャプチャ結果を下に示します。

続きを読む

FPGA 版 FM 音源 (47) -- YMF297 (OPN3/OPL3) 測定 (12) -- サステイン・レベル

今回は、OPL3 の音色パラメタの「SL」(Sustain Level) と実際の EG 出力のサステイン・レベルの不一致についての話です。
音色パラメタの SL は 4 ビットの値で、dB 単位の出力レベルと各ビットとが下の表のように対応づけられています。

b3 : -24 dB
b2 : -12 dB
b1 : -6 dB
b0 : -3 dB

たとえば、SL = 1 では出力レベル = -3 dB、SL = 14 では出力レベル = -42 dB の指定となります。
EG アキュムレータがこの値に等しくなった場合に、EGT = 1 では (KON = 1 である限り) サステイン・レベルを維持する状態となり、EGT = 0 では、ではディケイ・レート (DR) での減衰からリリース・レート (RR) での減衰に切り替わります。

続きを読む

FPGA 版 FM 音源 (46) -- YMF297 (OPN3/OPL3) 測定 (11) -- EG クロック・プリスケーラ (1)

OPL3 の EG では、AR/DR/RR で指定するレートが 13 の場合に fs クロックごとに EG アキュムレータの値が変化するようになり、レートが 12 を含んでそれ以下になる場合には、EG アキュムレータを更新するクロックが fs を分周したもの (プリスケールされたもの) になります。 (キーレート・スケーリングによる Rof = 0 の場合)
レート = 12 では 2個ずつ EG の同じ値が繰り返され、レート = 11 では同じ値 4 回の繰り返し、... と続き、レート = 1 では 4096 回の繰り返しとなります。
アタック/ディケイのみをサポートする EG を Verilog で 書いた以前の記事 (→こちら) では、アタック → ディケイの遷移の度に fs プリスケーラをリセット (に相当する処理を) していましたが、OPL3 の実チップを測定すると、プリスケーラは「フリーラン」で動いているらしいことが分かりました。
下に AR = 9 (fs/16 クロック)、DR = 9 (fs/16 クロック) での、アタック → ディケイのトランジェント部分を波形編集ソフトで表示したものを示します。

続きを読む