カープラス・ストロングの回 では、ノイズを輪に閉じ込めて回すだけで弦が鳴るという話をしました。今回はもっと欲張って、ベル、金属、エレクトリックピアノ、木管——と、まるで性格の違う音色をひとつの式から取り出します。使うのはサイン波の発振器(オシレータ)2つと、こんな式だけです。

$$y(t) = \sin\big(2\pi f_c t + I \cdot \sin(2\pi f_m t)\big)$$

sin の中に、もうひとつの sin が入っている。たったこれだけの仕掛けが FM合成(周波数変調合成)で、1983年のヤマハ DX7——世界でいちばん売れたシンセサイザーのひとつで、80年代ポップスのあのエレピやベルの音源——の心臓部でもあります。この記事では、この入れ子の sin が何をしているのか、そしてつまみ2つでなぜ音色の地図を旅できるのかを、音の出るデモで確かめていきます。

DX7の音を実際の曲で聴く

DX7の話をするときは、実際の曲を横に置いたほうが一気に分かりやすくなります。個々の曲で鳴っている音がすべてDX7という意味ではありませんが、80年代ポップスでFM音源がどう聞こえていたかをつかむ入口として、よく名前が挙がる曲を並べます。

a-ha『Hunting High and Low』のアルバムジャケット

a-ha / Hunting High and Low

Take On Me

DX7のシンセベース系プリセットの例として語られることが多い曲です。歌メロの印象が強いですが、下で細かく動く硬めのベースに耳を向けると、FMらしい輪郭の速さが分かります。

Whitney Houston『Whitney Houston』のアルバムジャケット

Whitney Houston / Whitney Houston

Greatest Love of All

DX7の代表的なエレピ音を聴くなら、まずこの系統のバラードが分かりやすいです。アコースティックピアノより硬く、ベルよりは丸い、あの透明なエレピの質感です。

『Top Gun: Original Motion Picture Soundtrack』のアルバムジャケット

Berlin / Top Gun soundtrack

Take My Breath Away

『トップガン』の主題歌として有名ですが、冒頭から支えるシンセベースの質感もDX7の文脈でよく取り上げられます。エレピだけでなく、低音でもFMの硬い輪郭が出ます。

ジャケット画像はMusicBrainz / Cover Art Archive由来の画像を記事内に同梱して配信しています。

機材そのものに興味が出た方は、現行機・中古・関連書籍をまとめて ヤマハ DX7 でAmazon検索 してみると、FM音源がどんな文脈で語られているかも見えてきます。

倍音を「積む」か、「生やす」か

楽器の音色の違いは、突き詰めると倍音——基音の2倍、3倍……の高さで同時に鳴っている成分——の配合の違いです。だから音色をプログラムで作る素直な方法は、サイン波を1本ずつ、欲しい倍音の高さと大きさで用意して足し合わせることです。確実ですが、倍音を10本欲しければオシレータが10本要る、少々骨の折れる道でもあります。

倍音の森を作る2つの道の比較図。左は加算合成でサイン波を1本ずつ足す。右はsinの中にsinを入れるFMで、2つだけで倍音が一気に生える

FM合成は、これとはまったく違う道を行きます。サイン波を積み上げるのではなく、1本のサイン波の周波数を、もう1本のサイン波で揺さぶるのです。すると足し算では1本ずつしか増やせなかった倍音が、ひと森ぶん、一気に生えてきます。オシレータは2つ。増えるのは倍音のほうです。

音で音の周波数を揺らす

「周波数を揺らす」こと自体は、実はおなじみの現象です。歌手が声の高さを小刻みに揺らすビブラート——あれは声の周波数を1秒に数回のゆっくりしたペースで上下させています。シンセサイザーでも、音程のつまみを低い周波数の波でゆっくり揺らせばビブラートがかかります。ここで、揺らされる側のサイン波をキャリア(搬送波)、揺らす側のサイン波をモジュレータ(変調波)と呼びます。冒頭の式なら $f_c$ がキャリアの、$f_m$ がモジュレータの周波数です。

では、揺らす速さをどんどん上げていったらどうなるでしょう。毎秒5回が50回になり、やがてモジュレータ自身が音の高さ(可聴域)に達すると、不思議なことが起きます。耳はもう「高さが揺れている」とは聞き取れなくなり、代わりに音色そのものが変わって聞こえるのです。

ビブラートとFMの比較図。ゆっくり揺らすと音の高さのゆらぎに聞こえるが、音の速さで揺らすと波形そのものが変形して新しい倍音が生まれる

波形を見ると、何が起きたかがわかります。ゆっくり揺らしたときは、サイン波が詰まったり伸びたりを繰り返すだけで、波の形そのものはサイン波のままです。ところが音の速さで揺らすと、詰まり・伸びが1周期の中で起きるため、波形そのものがひしゃげた別の形になります。そして波形が変わるということは、倍音の構成が変わるということ。揺らしたことで新しく生まれた成分は側帯波と呼ばれ、キャリアの周波数 $f_c$ の左右に、モジュレータの周波数 $f_m$ の間隔でずらりと並びます。つまり $f_c \pm f_m,\ f_c \pm 2f_m,\ f_c \pm 3f_m, \dots$ という等間隔の行列です。これがFMで生える「倍音の森」の正体です。

つまみ① I ── 森の広がり(明るさ)

冒頭の式に残っていた $I$ は変調指数と呼ばれる数で、揺らしの深さ、つまりどれだけ大胆に周波数を揺さぶるかを表します。この $I$ が、森の広がりを一手に握っています。

変調指数Iを0、1、4と上げるとキャリアの左右に側帯波が広がっていくスペクトラム模式図

$I = 0$ なら揺らしていないので、ただのサイン波。澄んだ「ピー」です。$I = 1$ あたりで両どなりに側帯波が顔を出し、音に少し色がつきます。$I = 4$ まで深くすると側帯波は遠くまで育ち、ギラギラと明るい音になります。高い成分が多いほど音は明るく聞こえる——フィルタの回 で「削ると音がこもる」として出てきた関係の、ちょうど裏返しです。つまり $I$ のつまみは実質「明るさ」のつまみとして機能します。

つまみ② C:M 比 ── 森の並び方(性格)

もうひとつのつまみが、キャリアとモジュレータの周波数の比、C:M 比です。側帯波は $f_c \pm k f_m$ に並ぶのですから、$f_m$ を $f_c$ の何倍にするかで、森の木々がどこに立つかが決まります。

C:M比が1:1だと倍音が整数倍に整列して楽音になり、1:1.41だと並びがずれてベル・金属の響きになる比較図

比が 1:1 や 1:2 のような整数比なら、側帯波はすべて基音の整数倍の位置に着地します。倍音が整数倍にきれいに整列した音を、耳はひとつの音程を持った「楽音」として聞きます。ちなみに 1:2 にすると、生える位置の関係で奇数次の倍音が主役になり、クラリネットのような木管系の音になります。

面白いのは比を半端にしたときです。1:1.41 のような非整数比にすると、側帯波は整数倍の位置から外れてばらばらに立ちます。倍音が整数倍に並ばない音——それはまさに、鐘や金属板を叩いたときの響きです。教会の鐘の音がどこか「高さの焦点が合わない」ように聞こえるのは、実物の鐘の部分音が整数倍に並んでいないからで、FMなら比のつまみをひとつ半端にするだけでその性格が手に入ります。倍音がきれいな整数比に乗ると澄んで響くという話は、平均律と純正律の回 でうなりの消える和音として聴いたのと同じ地続きの現象です。

まとめると、こうなります。$I$ が森の広がり(明るさ)を、C:M 比が森の並び方(楽音か、ベル・金属か)を決める。たった2つのつまみが、それぞれ音色の別の性格を受け持っているのです。

触ってみる

その2つのつまみだけを並べたデモを用意しました。プリセットをエレピ→ベル→金属→木管と切り替えると、同じ sin 2つの式から別世界の音が出てくるのを聴けます。スペクトラム表示には、式から予測される側帯波の位置($f_c \pm k f_m$)を▽印で重ねてあるので、実際に生えた倍音の森が理論どおりの場所に立つのも見えます。音が鳴っている最中に index を上げれば森がそのまま外へ広がり、ratio を動かせば木の間隔が変わります。

うまく表示されないときは、デモを別タブで開く

エレピのプリセットは、整数比 1:1 に控えめな index という組み合わせです。ここで効いているのが、index にもエンベロープが掛かっていることです。鳴った瞬間だけ index が高く(=倍音が多く明るく)、減衰とともに index が下がって丸い音に落ち着く。エンベロープの回 では音量の輪郭が楽器の顔を決めるという話をしましたが、FMでは同じ輪郭を明るさに掛けられるわけです。あの「コロン」としたエレピらしさは、音量と明るさが一緒に減衰していく、この二重の輪郭から来ています。

ここで宣伝をひとつ。筆者が個人開発している音感トレーニングアプリ Harmonize のエレクトリックピアノも、まさにこの2オペレータFMで鳴っています。整数比(ratio=1.0)の楽音成分に、大きく外れた比(ratio=14.0)のきらついた成分を薄く重ねた作りで、「エレピっぽさ」の正体はこの式そのものです。

どう実現するか

プログラムに落とすと、FMは拍子抜けするほど短く書けます。キャリアとモジュレータの位相をそれぞれ回し、sin の中に sin を入れるだけです。

/* 2オペレータFM(C風の擬似コード) */
double pc = 0.0, pm = 0.0;                      /* キャリアとモジュレータの位相 */
for (n = 0; n < length; n++) {
    output[n] = amp * sin(pc + I * sin(pm));    /* sin の中に sin */
    pc += 2.0 * M_PI * fc / fs;
    pm += 2.0 * M_PI * fm / fs;
}

厳密に言うとこれは位相を直接揺らす位相変調(PM)ですが、周波数は位相の変化率なので、サイン波どうしなら周波数変調と実質同じ音になります。DX7 の中身も実はこの位相変調方式で、世間の呼び名だけが「FM音源」として定着しました。各側帯波の大きさはベッセル関数という関数で正確に計算できるのですが、音作りでそこまで立ち入る必要はまずありません。$I$ を上げれば森が広がる、比を変えれば並びが変わる、という手触りを覚えるほうがよほど実用的です。

ブラウザの Web Audio API なら、オシレータの周波数パラメータが外部からの信号入力を受け付けるので、配線だけでFMが組めます。

const carrier = ac.createOscillator();   // 揺らされる側
const mod     = ac.createOscillator();   // 揺らす側
carrier.frequency.value = fc;
mod.frequency.value     = fm;
const depth = ac.createGain();
depth.gain.value = I * fm;               // 揺らし幅 Δf = I × fm
mod.connect(depth);
depth.connect(carrier.frequency);        // 周波数入力へ流し込む=FM

ひとつだけ換算に注意が要ります。変調指数 $I$ は「位相をどれだけ深く揺らすか」の値なので、周波数のほうを揺らす配線では、揺らし幅(周波数の振れ幅 $\Delta f$)を $I \times f_m$ に設定します。上のデモも、この数行にエンベロープを足しただけで動いています。

このFM合成、発見されたのは1960年代末のスタンフォード大学で、作曲家ジョン・チャウニングがビブラートの実験中に「揺らす速さを上げすぎたら音色が変わった」ことに気づいたのが始まりと言われます。当時、このFM合成技術はスタンフォード大学によって特許化され、ヤマハがライセンスを受けて商用化を進めました。なお、この米国特許 US4018121A は1994年に期限満了しています。デジタルらしい澄んだエレピ、ガラスのようなベル——アナログシンセには出せなかったあの音色群は、sin の中に sin を入れるという一行の発見から生まれたものです。

参考文献

  • J. M. Chowning, “The Synthesis of Complex Audio Spectra by Means of Frequency Modulation,” Journal of the Audio Engineering Society, vol. 21, no. 7 (1973), pp. 526–534。FM合成を音楽に持ち込んだ原論文。側帯波とベッセル関数の関係もここで示されています。
  • 青木直史『サウンドプログラミング入門――音響合成の基本とC言語による実装 』技術評論社(2013)。FM音源を含む音響合成の各方式をC言語の実装つきで解説する、数少ない日本語の定番書。
  • Google Patents, “US4018121A - Method of synthesizing a musical sound "。FM合成に関する Chowning / Stanford の米国特許。ステータスは期限満了。
  • Jazz Monroe, “John Chowning, godfather of digital pop ,” The Guardian (2024)。DX7が80年代ポップスに広がった文脈と代表曲の例がまとまっています。
  • Neil Crossley, “The genius of Giorgio Moroder in an ’80s classic ,” MusicRadar (2026)。Berlin「Take My Breath Away」のシンセベースとDX7プリセットに触れた解説。
  • デモの実装には Web Audio API を使用。モジュレータの出力を AudioParam (OscillatorNode.frequency)へ接続してFMを組んでいます。

sin 2つとつまみ2つで、エレピからベルまで地続きです。まずはデモで、音を鳴らしながら ratio と index の地図を旅してみてください。