FMシンセシスについて

FMシンセシスについてはMSPチュートリアルでも触れられていますが、ほんの少しだけ詳しく調べてみたいと思います。これは、一言で言うと「周波数変調(Frequency Modulation)」によって音を合成する方法のことです。もとになるオシレータ(発振器)からの波形(キャリアと呼ばれます)の周波数をもう一つのオシレータからの波形(モデュレータと呼ばれます)によって変化させることでいろいろな音を合成するテクニックですが、MSP的にはcycle~やphasor~などの周波数を他のシグナルで周期的に変化させることで実現できます。

FMシンセシスの特長は、少ない数のオシレータでも、多くの倍音を含む音が合成できるという点にあります。そのため、比較的マシンに対する負荷の少ない合成方法であると言えます。

その昔、YA○AHA DXシリーズで採用された当時は、随分世間を騒がせた(笑)ものですが、最近ではPCMなどのサンプリング音源に押されてしまい、商用としての「FM」は昔のように騒がれることはなくなってしまいました。しかし、楽器の模倣というより、新しい表現力を持った音を合成することにより力点を置くならば、少ないパワーで多様性をもつFMは有効な方法であることに変わりありません。

FMシンセシスによる音の合成が解りにくい理由の一つに、「結果としての「音」を想像することが難しい」という点があげられます。それ以前のアナログシンセサイザは、多くの倍音を含むノコギリ波や方形波などをフィルタに通すことで余分な倍音をカットし、音を合成する方法が主流で、リングモデュレータなどのAM(振幅変調)シンセシスも併用されていましたが、これらは比較的結果としての音がイメージしやすいものでした。
ところが、FMの場合、パラメタを少し動かしただけで含まれる倍音が大きく変化したり、思ったより変わらなかったりする場合もあり、パラメタと結果の「音」が直線的に結びつかないという難しさがあります。

加えて、今となってはこういった音づくりに言及した資料も、なかなか見つけることが困難です。(少なくとも、本屋さんの店頭にならんでいる書籍のなかでは、「コンピュータ音楽−歴史、テクノロジ、アート」(東京電気大出版)で触れられているものが最も詳しいのではないかと思います)
 ここでは、FMシンセシスの原理について簡単に振り返りながら、結果としての音をイメージすることを試みてみようと思います。簡単のために、波形はすべてサイン波であるとします。また変調をされる波、する波が共に1つずつである場合を考えることにします。

ちょっと予備知識

FMについて考える前に、いくつかの事柄について簡単に(きわめて荒っぽく(^^;))触れておきましょう。

音とスペクトル

まず、スペクトルについて少々。MSP的にはfft~の世界ですね(笑)。
すべての周期的な波形は、最も小さな周波数と整数倍の関係にある周波数を持つ複数の単純な波(サイン波、コサイン波)の合計として考えることができます。同じ振幅と周波数を持つサイン波とコサイン波は位相を変えることで完全に重ね合わせることができますので、「サイン形状波」としてまとめて考えることもできます。このように単純な波に分けることを、「フーリエ分析」といいます。波形がいろいろに変化するのは、この各々の波の振幅の違いによります。これらの波の振幅を分析する装置を「スペクトルアナライザ」といい、振幅値と周波数をグラフにしたものを「スペクトル」と呼びます(*1)。瞬間瞬間の音色はこの「スペクトル」によって左右されると考えておいても良いでしょう(*2)。下の図はコンピュータ用音源で作られた、トランペットのようなサウンドのスペクトルをとったものです。

*1 実際には、スペクトルの分析には誤差が伴います。チュートリアル24を参照して下さい。

*2 人間が「音色」として感じる場合には、スペクトルだけではなく、エンベロープ(時間上での音量の変化)やスペクトル自身の時間上での変化も影響します。例えば、同じスペクトルの音でも、エンベロープを変えるとかなり違った印象を受ける場合もあります。ただ、スペクトルが、音色を考える上で大きなウェイトを持っているということは確かです。

これらのスペクトルによって、どのような周波数の音がどれだけの強さで含まれているかを見ることができます。一般に、高い周波数の成分が多いと明るい音に聞こえるようです。また異なる周波数の音を多く含む場合は豊かな幅広い感じを、余り多く含まない場合は、透明な感じを与えるサウンドとして感じ取られる傾向があります。

負の振幅

振幅がaで、同じ位相をもつサイン波どうしを2つ足しあわせると、振幅の値は2aになります。つまり

a+a = 2a

ですよね。 ところで、サイン波の位相を波長の1/2だけ変化させると、もとのサイン波とちょうどx軸に対して対称な波になりますが、これを足しあわせるとすべて0になってしまいます。これを、

a+□=0

と考えると、□の中は-aのはずです。つまりこの位相をずらされたサイン波は負の振幅を持っていると考えることができます。(何やらダマサれたような話ですが‥)

サイン状波の負の振幅値はこのようにもとの波の位相をπだけ変化させたものと等しくなります。人間の耳は位相には鈍感なので、1つのサイン状波の位相が変化しても同じような音に聞こえます。ただし、2つのサイン波が存在する場合、お互いに打ち消し合ってしまうと音は聞こえなくなります。 音を合成する場合、計算の過程では振幅の正負はハッキリ区別しなければなりませんが、最終的な音として聞こえる波では、負の振幅も正の振幅と同じようにその絶対値で扱うことができます。

負の周波数

サイン波を考える時に、xyグラフの原点を中心とする半径1の円の上を動く点のy値として考えることができます。このとき、通常時計と逆周りの方向に正の角度を取りますから、もし逆方向に点が移動すると、負の角度となります。これを負の波と考えることができ、この周波数を負の周波数として扱います。

ところで、上の図の波形だけを見ると、サイン波の位相を周期の1/2だけずらしたモノ(つまり負の振幅と正の周波数をもつもの)と同じ形になっているのに気づくと思います。(この例では正の振幅と負の周波数を持ちますが‥)このことを後ほど利用しますので、覚えておいて下さいね。

FMシンセシス

それでは、FMシンセシスについて見ていくことにしましょう。ここでは、簡単のために2つのサイン波によるFMを考えます。

FMシンセシスの意味

まず1つのサイン波を考えます。サイン波は

y=sin(a*2πx) (aは定数) ------- (1)

で表すことができます。このときaは周波数になります(*3)aを10に設定したものが下のグラフです。

*3 2πをかけているのは、aを周波数として扱うためです。*(アスタリスク)は「×(掛ける)」の代用です。

このサイン波の周波数を周期的にわずかに変化させると、「ビブラート」効果が生まれます。 周波数を変化させるためには(1)式のsinの後の(a*2πx)の中の値を周期的に変化させる必要がありますからこの値に

b*sin(c*2πx)

を加えます。式は次のようになります。

y=sin(a*2πx+b*sin(c*2πx))

bは変化の度合いを、cは変化の周波数を表します。これがFMシンセシスの波形の式になります。 b=6,c=1に設定して書いたものが次のグラフです。

波長(周波数の逆数になります)が周期的に変化しているのがよくわかると思います。 y=sin2πaxをキャリアy=bsin2πcxをモデュレータと呼びます。 またaはキャリアの周波数、bはモデュレータの振幅、cはモデュレータの周波数になります

FMシンセシスとスペクトル

y=sin(2πax+bsin2πcx)のa,b,cの値を決めて計算することで波形の計算ができますが、これがどんな性質を持った音になるかを知るためには、スペクトルに分析する必要があります。どのようなスペクトルを生じるのかを見てみましょう。

説明の前に、記号を決めておきます。変調される音の周波数(キャリア周波数)をFc、変調する音の周波数(モデュレータ周波数)をFm.,モデュレータの振幅をAmとします。Amが大きい程キャリアの周波数は大きく変化します。

ところで、人間の耳は周波数が2倍になると1オクターブ高い音として知覚しますから、400Hzの音を上に1オクターブ変化させるためには、+400でよいのですが、800Hzの音を上に1オクターブ変化させるためには+800の値が必要です。

キャリア周波数が変化した場合でも音色を一定に保つには、Am(モデュレータ振幅)とFm(モデュレータ周波数)、およびFmとFc(キャリア周波数)の比を考えた方がうまくいきます。そこで、実際にはAm/Fmの値を変調指数と呼びで表します。またFm/Fcを周波数比 Frとして表します。 FMシンセシスで使用するパラメタは Fc(キャリア周波数) Fr(周波数比、Fm/Fc) I(変調指数、Am/Fm) の3つです。 Fm(モジュレータ周波数)はFr×Fcとして簡単に求められます。 これらを使って実際にFMシンセシスで合成される音のスペクトルを表すと

Fc, Fc+Fm, Fc-Fm,Fc+2Fm,Fc-2Fm,Fc+3Fm,Fc-3Fm,...

という周波数のサイン波による部分音を含むものになります。Fcは第0次部分音、Fc+FmとFc-Fmは第1次部分音、Fc+2Fm,Fc-2Fmは第2次部分音と呼ばれます。

上のパラメータFrを使って表すと、Fc+Fmならば、

Fc+(Fr*Fc) = (1+Fr)*Fc

となります。Fc+2Fmは(1+2Fr)*Fcです。) これらをまとめて側波帯と呼び、特に+のものを上側波帯、-のものを下側波帯と呼びます。

何やら小難しい用語や記号がならんでしまいましたが、簡単にいうと、部分音の周波数は

キャリア+(キャリア±モジュレータ)+(キャリア±モジュレータ×2) + ‥‥

というように、「キャリア周波数」と「モデュレータ周波数の整数倍(0倍を含む)の値」の和と差になると考えればよいでしょう。

スペクトル成分の振幅

ところで、それぞれの振幅はどうなるのでしょうか?この値はベッセル関数という関数で求めることができます。ベッセル関数には次数があり、0次、1次、2次?となりますが、これが対応する部分音の振幅になります。ベッセル関数の0次〜5次までのグラフは次のようなものになります。(グラフの'J0'は0次、'J1'は1次‥を表しています。)また、x軸の値は変調指数Iに対応します。ベッセル関数値については、すでにわかっているものとして考えていきます。変調指数が小さい間はJO(キャリアの振幅)が大きな影響を持ちますが、指数が大きくなると、しだいに高次の部分音が効いてくるようになり、その先は周期的に変化することが解ると思います。

スペクトル成分の振幅

実際にスペクトル成分を計算するためには、負の周波数や振幅、奇数次(1,3,5,...)の下側波帯については少々操作が必要になります。ここでは、説明は勘弁して頂いて(^^;)、実際の手順を考えてみます。次のような手順になります。

  1. まず、奇数次の下側波帯の振幅係数に-1をかけます。

  2. 負の周波数を正の周波数として扱うために-1をかけますが、そのとき振幅にも-1をかけます。負の周波数に-1をかけたものと同じ周波数の部分音がすでに存在する時は、その振幅に、負の周波数の振幅値に-1をかけたものを足しあわせます。

  3. 最後に、計算結果の振幅値をすべて絶対値(負の数->正の数)として扱います。(*4)

*4 人間の耳は、位相に関しては比較的鈍感である(ただし、全く聞き分けられないわけではないようです)という点から、このような処理が可能になります。ただし、すべての計算が終了してからこの処理を行う必要があります。



参考文献:「DXシンセサイザで学ぶーFM理論と応用」ジョン・チョウニング/デビッド・ブリストウ著,1986,YAMAHA Music Foundation