Lost Technology

レトロPC、レトロゲーム、チップチューン等の主に技術的な雑記

FM音源のEG波形

FM音源のEGパラメータは、多くの場合「感覚的に」設定され、その正確な技術的情報や物理的挙動についてはあまり知られていなかったり間違って伝わっている場合がある。というか、YAMAHAから詳細な情報が提供されてこなかった。

ここらで、「EGの実際の挙動」と、流布されてきた情報との違いについて整理しておく。*1

Envelope Generator(EG)の基本

一般的なFM音源のEGは、アタックレイト、ディケイレイト、サスティンレベル、サスティンレイト、リリースレイトの5つのパラメータで挙動が定義される。*2
EGの挙動には、4つのフェーズがあり、それぞれの移行契機は以下の通り。

  • アタックフェーズ

Key-Off状態からKey-On状態になった瞬間にアタックフェーズが始まり、アタックレイトの値に従って発音レベルが増大する。

  • ディケイフェーズ

音量レベルがTLで指定された最大レベルに到達した瞬間にディケイフェーズに移行し、ディケイレイトの値に従って発音レベルが減衰する。

  • サスティンフェーズ

音量レベルがサスティンレベルで指定されたレベルに到達した瞬間にサスティンフェーズに移行し、サスティンレイトの値に従って発音レベルが減衰する。

  • リリースフェーズ

Key-On状態からKey-Off状態になった瞬間にリリースフェーズに移行し、リリースレイトの値に従って発音レベルが減衰する。

OPM/OPN系でのEGの実装

OPN/OPM系のFM音源では、それらのパラメータに、AR/DR/SL/SR/RRというレジスタを1対1で割り当てている。(下図参照)
f:id:madscient:20140223155313p:plain

OPL系でのEGの実装

OPL系ではAR/DR/SL/RRの4つのレジスタと、EGTという減衰音か持続音かを指定する1bitのフラグで5つのパラメータを指定する。

ところが、YAMAHAから提供されているOPL系のドキュメントには、これに関して正確な説明が書かれているものが皆無に等しい。
OPL系のEG波形として、もっとも有名な図がYM3526(OPL)のアプリケーションマニュアルに書かれている。(下図)
f:id:madscient:20140223200318p:plain

ところが、この図は重要な情報が欠落しているうえに、そのことについての説明もないので、大変誤読を誘いやすい。この図の正しい読み方は、「EGT=1のとき、サスティンレイトはゼロに固定される」「EGT=0のとき、サスティンレイトとしてRRレジスタ値が使用される」ということのみである。

これを元にした雑誌記事や解説書で「EGT=0のときはサスティンレベルに達したらKey-Offしなくてもリリースフェーズに移行する」のような説明が書かれていることがあるが、全くの早トチリである。実際には、出力レベルがゼロになってても一度Key-Offを発行しないと次のKey-Onを受け付けないので、「リリースされる」というのは間違いであることは明らか。
出力レベルがゼロになるまでKey-Offしなかったらサスティンレイトだけで減衰するのは当たり前だし、サスティンレイトがゼロならサスティンフェーズで減衰しないのも当たり前。この図では「EGT=0のときにKey-Offしたらどうなるか」が書かれていないので、左右の図は実は対比してないのである。
正しい図はYM2413(OPLL)のアプリケーションマニュアルに載っている。(下図)
f:id:madscient:20140223200356p:plain

この図では、EGT=0のときにKey-Offすると、その時点からリリースフェーズに移行することが読み取れる。リリースレイトにもRRレジスタの設定値が使用されることもわかる。つまり、EGT=0の場合、RRレジスタはサスティンレイトとリリースレイトを兼用する。
ところが、EGパラメータを設定するレジスタはいつでも変更可能で、変更した瞬間にEGの挙動に影響するので、Key-Offの直前にEGTおよびRRレジスタを書き換えることで、「サスティンレイトとして使用されるRRレジスタ値」と「リリースレイトとして使用されるRRレジスタ値」を別の値にすることができる。決してサスティンレイトがないわけでもサスティンレイトを指定できないわけでもない。

つまり、レジスタのビット幅の違いがあるので完全ではないが、制御手順によってはOPL系もOPN/OPM系もほぼ同様のEG波形を出力することができるのである。*3

ちなみに、この「不完全なEG波形図」はYM3526(OPL)のアプリケーションマニュアルに載って以来、OPL系アプリケーションマニュアルで繰り返し使用されている。*4

あれ?DPって何?

ところで、「正解のEG波形図」を見ると、EGの挙動には出てこない見慣れないパラメータ?が書かれていることに気付くと思う。(下図)
f:id:madscient:20140223210933p:plain

さて、DPとは何ぞや、と思ってYM2413アプリケーションマニュアルを見てもいっさい何も書かれていない。
特に、Key-Onしてから実際にアタック波形が始まるまでに有意な遅延が図示されているにもかかわらず説明がないのは、マニュアルとして不親切極まりないが、まあ実際に音を出してみればすぐにわかるだろう。
結論から言うと、OPLL系*5では、前の音のリリースフェイズ中にKey-Onを発行すると、その時の発音レベルからゼロレベルに強制的に減衰(Force Damp)してから次の音のアタックフェーズが始まるのである。図示されている遅延は強制減衰にかかる時間を示す。
この挙動が見られるFM音源はOPLL系および携帯電話向けMA系*6、いずれも音色テーブル方式のため、原則として特定のエンベロープパラメータのみを書き換えることができないためではないかと思う。

じゃあOPN/OPM/OPLではどうなのよ

OPN/OPM/OPL系には、発音開始時に前の音を自動的に強制減衰する機能は無い。前の音のリリースが完了しないうちにKey-Onすると、「ゼロレベルから立ち上がった場合のアタック波形と、現在の出力レベルの交点を始点」としてアタックを開始する。つまり、出力レベルがゼロでない場合、本来そのレベルに達するまでの波形と時間が省略される。(下図)
f:id:madscient:20140224004427p:plain

上図の「2回目のキーオン」を拡大すると以下のようになる。こうなると、本来のアタック波形よりも強いアタックとして聴こえることになる。
f:id:madscient:20140224015048p:plain

これを避けるためには、OPLL系が自動でやっている強制減衰を手動で制御する。具体的には「Key-On発行直前にRRレジスタに最大値(=15)を設定して少し待つ」と、OPLL系の強制減衰と同様の効果を得ることができる。

「OPN/OPM系でフォースダンプ制御」を実装するFM音源ドライバはいくつか例がある*7が、「OPLでサスティンレイト制御」を実装したドライバは寡聞にして知らない。*8

というわけで、98用マルチ音源ドライバ(仮)の次のリリースには「OPN/OPM系でフォースダンプ制御」と「OPLでサスティンレイト制御」の両方が実装されることになったのであったw
2020/8/7 追記:元記事書いた甲斐あって、OPL系でもSR/RRの個別指定を実装したソフトが増えてきたので、無駄な煽りを削除しておく。

*1:ここではいわゆるADSRのみ取り上げる。音源ごとのオプショナルな機能(KSR/KSLとかEG-BIASとかSSG-EGとかLFOとか)については稿を改める。

*2:ここでは、「EGの挙動を決定する抽象パラメータ」をカタカナ(アタックレイトとか)で、それを実装した音源チップのレジスタ名を英字略語(ARとかDRとか)で書き分けている。

*3:OPL系では、AR/DRレジスタのビット幅が4bitだが、内部的には5bitの領域を持っていて、KSR/KSLによるレイト補正は内部5bit値に作用するため、Key-OnするごとにKSR/KSLを細かく制御して5bitフルに指定することもできないではないが、制御のめんどくささに比して得られるメリットは少ない。

*4:OPLLのアプリケーションマニュアルに正解が載った後でも、なぜかOPL3/4とその派生品でOPL由来の「Key-Offの無い」EG波形図が使われ続けている。OPL2ではKey-On/Offまで省略されててもっとひどい。

*5:2020/8/7改訂:当初「OPL系」としていたが、強制ダンプはOPLL系のみでOPL系もKey-On発生時のレベルからエンベロープが開始する挙動は同じであることがわかった。https://twitter.com/ym2413/status/1286537539478671361

*6:他にもあるかも知れない。未確認。

*7:ナムコのシステムIとか。http://www42.tok2.com/home/acsound/ja/namco/system1/system1.html

*8:俺が知らないだけかも知れないので、知ってたら教えて。