4オペレータFM vs 2オペレータ|アルゴリズムとは何かを理解する
はじめに
第2回では、モジュレータとキャリアを直列に繋いだ2オペレータFMで1音を鳴らしました。あのときは接続の繋ぎ方が1通りしかなかったので、アルゴリズムという言葉を一度も使いませんでした。
今回はオペレータを4個に増やします。すると「どれをどれに繋ぐか」の組み合わせが一気に増え、その繋ぎ方のパターンがFM音源の表現力の本体になります。これがアルゴリズムです。この記事は概念回なので、フルコードは出しません。フルコードは最終回でPICOMの実装として一気に書きます。ここでは「なぜ4オペレータが必要か」「アルゴリズムとは何か」を、図と比較で理解することに集中します。
2オペレータの接続は「モジュレータ→キャリア」の直列1通りしかなく、出せる音の方向性が限られます。オペレータを4個に増やすと、直列・並列・その混合という多様な繋ぎ方が可能になります。この繋ぎ方の選択肢がアルゴリズムで、PICOMはOPNA(YM2608)準拠のAlg0〜7の8種類を持ちます。直列寄りのアルゴリズムは倍音が深く歪んだ複雑な音に、並列寄りは複数のサイン波を足すオルガン的な加算合成になります。
2オペレータの限界
2オペレータでできるのは、1つのモジュレータで1つのキャリアを揺さぶることだけです。これでもエレピやベルなど多くの音は作れますが、限界もはっきりしています。
ひとつは倍音の作り込みの浅さです。揺さぶる側(モジュレータ)が1段しかないので、複雑な倍音の塊を作ろうとすると変調指数を上げるしかなく、音が単調にジリジリと濁る方向にしか動きません。
もうひとつは音の重ね合わせができないことです。たとえば「芯のあるエレピの音」に「キラキラした金属的なアタック」を別系統で混ぜたい、といった音作りは、独立した2つの発音系統が要るので2オペレータでは表現できません。
この2つの限界を超えるために、オペレータを増やし、繋ぎ方を選べるようにします。
アルゴリズム = オペレータの繋ぎ方の地図
4つのオペレータ(OP1〜OP4と呼びます)をどう繋ぐかには、いくつもの定番パターンがあります。PICOMはOPNA(YM2608)と同じ8種類を採用していて、FMAlgorithm というenumで Alg0〜Alg7 として定義されています。
繋ぎ方を読むコツは2つです。矢印 → は「変調する」(左が右を揺さぶる)を表し、最終的に音として出てくるオペレータをキャリアと呼びます。直列に深く繋ぐほど倍音が複雑になり、並列に並べて足すほど純粋なサイン波の足し算(加算合成)に近づきます。
両極端の2つを図で見てみます。まず、4つすべてを1本に繋いだ最も直列的な Alg0 です。
Alg0 : OP1 → OP2 → OP3 → OP4 →(出力)
[OP1]→[OP2]→[OP3]→[OP4]→ out
mod mod mod carrier
OP1がOP2を、OP2がOP3を、OP3がOP4を揺さぶり、最後のOP4だけが音になります。変調が3段重なるので倍音が深く、歪んだ・金属的な・激しい音になりやすい構成です。
対して、4つを一切繋がず全部そのまま足すのが Alg7 です。
Alg7 : OP1 + OP2 + OP3 + OP4 →(出力)
[OP1]─┐
[OP2]─┤
[OP3]─┼→ out (4本のサイン波の単純な和)
[OP4]─┘
これは変調がまったく無く、4本のサイン波を足しているだけです。倍音をサイン波の重ね合わせで作る加算合成そのもので、オルガンのような澄んだ音になります。FMでありながらFM変調を使わないという、両極のもう一方です。
PICOMの既定値である Alg4 は、その中間にあるバランス型です。
Alg4 : (OP1 → OP2) + (OP3 → OP4) →(出力)
[OP1]→[OP2]─┐
├→ out
[OP3]→[OP4]─┘
「モジュレータ→キャリア」の2オペレータのペアが2組あり、その2つの音を足し合わせます。つまり第2回で作った2オペレータFMを2つ並列に鳴らしているのと同じで、独立した2系統を混ぜられます。先ほど挙げた「エレピの芯+別系統のアタック」のような音作りが、ここで初めて可能になります。
Alg0〜7 の全体像
残りも含めた8種類は、直列の深さと並列の数のグラデーションとして並びます。表記の → は変調、+ は加算(出力での足し合わせ)です。
| アルゴリズム | 接続 | 性格 |
|---|---|---|
| Alg0 | OP1→OP2→OP3→OP4 | 最も直列。倍音が深く歪んだ複雑な音 |
| Alg1 | (OP1+OP2)→OP3→OP4 | 2つのモジュレータで深く変調する直列寄り |
| Alg2 | OP1+(OP2→OP3)→OP4 | 直列の枝と単独モジュレータを合流 |
| Alg3 | (OP1→OP2)+OP3→OP4 | 変調済みの枝と素のオペレータを合流 |
| Alg4 | (OP1→OP2)+(OP3→OP4) | 2オペレータのペア×2。バランス型(PICOM既定) |
| Alg5 | OP1→(OP2+OP3+OP4) | 1つのモジュレータで3つのキャリアを揺さぶる |
| Alg6 | (OP1→OP2)+OP3+OP4 | 1組だけ変調、残り2つは素のサイン波を加算 |
| Alg7 | OP1+OP2+OP3+OP4 | 最も並列。加算合成でオルガン的な澄んだ音 |
上から下へ向かうほど、直列の支配から並列の支配へと移っていきます。Alg0付近は変調段が深く倍音リッチで攻撃的、Alg7付近はサイン波の足し算に近く澄んだ音、という地図として捉えておくと、最終回で実際のコードを読むときに見通しが効きます。
3軸で比較する:2op vs 4op
2オペレータと4オペレータの違いを、接続の自由度・倍音の複雑さ・計算コストの3軸で整理します。
| 観点 | 2オペレータ | 4オペレータ |
|---|---|---|
| 接続の自由度 | 直列1通りのみ(アルゴリズムの概念が不要) | Alg0〜7の8通り。直列・並列・混合を選べる |
| 倍音の複雑さ | モジュレータ1段ぶん。変調指数で調整するのが主 | 変調を多段に重ねたり、複数系統を加算したりできる |
| 計算コスト | sin計算2回/サンプル | sin計算4回/サンプル(おおむね2倍) |
要点は、4オペレータの価値は単に「オペレータが2倍になった」ことではなく、「繋ぎ方を選べるようになった」ことにある、という点です。計算コストはおよそ2倍で済むのに、表現できる音の幅は接続の自由度のぶん桁違いに広がります。これが、当時の音源チップが2オペレータではなく4オペレータを主流にした理由でもあります。
オペレータを増やすほど良い、という単純な話ではありません。並列のキャリアが増えると出力の振幅が単純な和で大きくなり、そのままでは音が割れます。PICOMの実装でも、複数キャリアを足したあとに出力を -1, 1 にクリップする処理が入っています。この振幅管理を含めた実際のコードは、次の最終回で扱います。
まとめ
- 2オペレータは「モジュレータ→キャリア」の直列1通りで、倍音の作り込みも音の重ね合わせも限界がある
- オペレータを4個に増やすと繋ぎ方の選択肢が生まれ、その繋ぎ方のパターンがアルゴリズム
- PICOMはOPNA準拠のAlg0〜7を持ち、直列寄りは歪んだ複雑な音、並列寄りは加算合成的な澄んだ音になる
- 既定のAlg4は2オペレータFMのペアを2組並列にした構成で、独立した2系統を混ぜられる
- 4オペレータの本質的な価値は接続の自由度にあり、計算コストはおよそ2倍に収まる
次回はいよいよ最終回。この8アルゴリズムとフィードバック、ADSRエンベロープを全部コードにして、PICOMの動く4オペレータFM音源を実装します。





