さて、まただいぶ間があいてしまいましたが久しぶりに更新。
今回はFMP7の音量調整に関することです。

どうも「FMP7は音量の調整が大変…」という声を良く耳にするので、そのあたりの話しをまとめてみます。

まずは、基本的なことから始めましょうか。FM音源のパラメータの話などしますので、ちょっとプログラム的な話となりますが音量調整で悩んでいる方にとっては朝飯前ですよね^^
これからお話することはFMPで言えばDOS版のFMPv4が該当します。FMP7では当てはまりませんので。FMP7での制御についてはもっと後ろで話します。

YAMAHA社製の4opFM音源チップである「YM2203/YM2608」はFM音源部の音量を調整するための専用の機能を持っていません。実際に音量調整は出来ているので「持っていないはおかしいだろう」という意見はありそうですが、あくまでも私の意見としては「持っていない」と判断しています。
理由はSSG音源部、リズム音源部、ADPCM音源部とそれぞれには音量指定のパラメータが存在するのにFM音源部だけはこのようなパラメータが「ない」というのは「持っていない」と判断してもいいんじゃないかと思うのです。
これらの音源を積んだNEC PC-98用の音源ボードにはプログラムではFM音源部の音量調整を行うことは出来ません。(X1やX68000で使われていたYM2151も同様です)

実際には音量調整は出来ているんですが、これはFM音源の音色パラメータの1つであるトータルレベル(以下TL)を変更することで実現していました。
これが、実は結構面倒な処理だったりします。

例を出しましょう
トータルレベル


これはFM音源の音色定義をFMP7のMML形式で表現したものです。多少の違いはあると思いますが、FM音源を使ったことがある方であれば意味はわかりますよね。
この中の赤で示したパラメータがTLです。これが音量の調整を行うための音色パラメータです。このパラメータを変えて音量の調整を行うのですが、TLというパラメータは0~127の範囲で指定を行います。
そう、FM音源ドライバの多くが0~127で音量の指定を行う仕様はこのパラメータの仕様から来ています。そして、このパラメータでの音量調整を行う際には以下の様なルールになります。

一番音量が大きい
127 一番音量が小さい

人間の感覚とは逆なんですよねぇ。少なくとも、私の感性とは合いません(笑)
なので、多くの音源ドライバではコンパイル時か演奏時に指定された音量値を逆転して指定を行うものがほとんです。FMPv4でもそうなっています。

「あれ、俺の音源ドライバは0~15で指定したんだけど…」
はいはい。FM音源内部では0~127なんですが、多くの音源ドライバでは0~15で音量の調整を行うことが可能でした。理由を想像すると、

  • BASICの仕様に合わせた
  • SSG音源部に合わせた
  • 128段階もあっても大変。1変えても違いがわかりにくい。

などなど考えられますが、はっきりとした理由は私にもわかりません。かくいうFMPv4でもそのような指定も可能でした。
これはFM音源ドライバ内部で変換テーブルを持つなどして対応していたと思われます。
例えばこんな感じ(※あくまでも説明用です。この値ではバランス的にきれいな音量となりません)

音量(0~15) 実際の値
16
64
14 112
15 120

話が脱線仕掛けているので戻しましょう。音量調整を行うにはTLをいじればいいことはここまでで理解出来たと思います。ここでもう1つ大事なことがありまして、TLを全部変えてしまってはだめということです。
TLパラメータのうち、音量に関係するパラメータは「キャリア」として働くもののみです。(音量に関わらないTLパラメータはモジュレータと呼ばれます)
4つオペレータのうちどれがキャリアであるか判断するにはアルゴリズム(以下AL)で判断出来ます。逆に言えば、ALが異なればキャリアであるオペレータも変わってくるということです。どうです、面倒でしょう?

ALはどこかというと以下の通り音色定義中に存在します。
アルゴリズム


緑で示したパラメータがALです。

ALパラメータについての詳細は今回は割愛しますが、ALは0~7まで指定が可能でオペレータの接続を指定するパラメータです。
この例の場合はALは2ですので、キャリアはオペレータ4だけです。
よって、音量の調整を行うにはオペレータ4のTLを変更すれば良いとなります。
ようやく音量の調整が出来るようになりました!
いや、ここまで長かった。

音量調整の基本をお話したので、ここから応用です。

先ほどの例では対象のオペレータは1つでした。では、複数の場合はどうしましょう?
アルゴリズム4


この音色ではALは緑で示した通りで4番です。この場合のキャリアはオペレータ2と4になり、赤のTLが対象となります。
さて、ここから先の動作は音源ドライバによって異なります。TLを50にするという前提で説明します。

1つ目は音色パラメータ値をなるべく反映させて動作させる仕様。
動作1


こんな感じで、オペレータ2に指定されていた「27」が生かされています。

2つ目は「気にせず2つとも書き換える」という動作のもの。音色パラメータに指定された値は音量調整には利用されません。
動作2


このとおり、見事に上書きです(笑)

FMPv4ではデフォルトでは「動作1」となり、MMLデータ中に埋め込みオプション「/v」をつけると「動作2」となります。

と、ここまでがFM音源での音量調整の方法です。アルゴリズムによってはオペレータが4つとも対象となることもあり、処理はかなり複雑です。また、「動作1」の場合には値がオーバーフローすることもあると思いますが、そのあたりの処理もドライバ依存になります。FMPv4では最小、最大値でクリップしていました。多分、他のドライバも同じような動作じゃないかと思います。
「動作2」は音色のバランスに影響が出るんですが、元々をそのバランスで曲を書いていたので問題なかったんではないでしょうかね。どんな音色を定義しても出音はTLのバランスが定義したものと違った音になるわけなんで。あと、動作1よりも若干処理が軽くなるというのもあると思います。特にゲームのBGMではメインの処理にいかに負荷を与えないかも大事だと思うので。

さて、ここでようやくFMP7の音量調整のお話です(笑)
FMP7ではここまで説明したような処理は一切行なっていません。音色パラメータについては変更は行わず、FM音源コアから生成された生データに対して音量調整の処理を行なっているだけです。
実音源チップを扱うドライバでは、音量の調整を行えば必ず定義した音色に手が加えられていました。ところが、FMP7では元の音色に対しては一切手が加わらないのです。
FMP7で音量調整が以前と同じようにならない場合があるのはこの処理方法にあります。
音色データを定義する段階で「音量」も込みで調整を行わないと、以前に鳴らしていた音量指定(vコマンド)数値では思った大きさにならないことがあるということです。逆に、それだけ音色定義が重要になり、定義されたパラメータが常に反映された状態で鳴るという利点でもあります。
FMP7での音量調整は元の音をどの程度絞るか(小さくするか)という処理になっています。v127で音色で定義された音量です。よって、元の音色パラメータで定義された以上の大きさの音量を出すことは「v」コマンドでは出来ないのです。

過去のデータを移植するときにはこのことを頭に入れて作業してみて下さい。MML中の「v」を調整することも大事なことですが、まずは音色定義の「TLパラメータ」の調整をしてみて下さい。実は思ったよりも簡単に最初の調整が出来るかもしれませんよ!
あと、過去のデータとの柵があってデフォルトではないのですが、MMLのコンパイルオプションで「音量テーブル指定(VolumeExtend=1)」を行うと音量変化が扱いやすいと思いますので併せてお試しください。
え?FMP7でも昔と同じように処理するオプションをつけろって?まあ、そのあたりはどうするか未定です。書いた通り、処理大変なんですよ^^

ということで、FMP7で音量調整に苦しんでいる方の参考になれば幸いです。