前回のFM合成 では、サイン波の周波数を別のサイン波で揺さぶると倍音の森が生えるという話をしました。あのとき揺らしたのは音の高さです。では、もうひとつの素朴なつまみ——音量のほうを別の波で揺らしたら、何が起きるでしょうか。
式で書けば、やることは掛け算ひとつです。元の音 $x(t)$ に、揺れを表す波 $m(t)$ を掛ける。
$$y(t) = x(t) \cdot m(t)$$
周波数を揺らすのがFM(周波数変調)だったのに対し、振幅(音の大きさ)を揺らすこちらはAM(振幅変調)と呼ばれます。ラジオのAM・FMと同じ言葉で、電波の世界で搬送波に音声を乗せるのに使われてきた由緒正しい二兄弟です。音作りの世界でも、この2つは「揺らす先が違うだけの兄弟」の関係にあります。
FMでは波の間隔が詰まったり伸びたりしました。AMでは間隔はそのままに、波の背たけだけがふくらんだり縮んだりします。掛けた波が、そのまま音量の輪郭としてなぞられるわけです。
数Hzを掛ければトレモロ
この掛け算、ゆっくりやるぶんには何の変哲もないエフェクトです。毎秒5回ほどのペースで音量をワワワワと脈打たせる——ギターアンプに昔から付いている、あのトレモロです。ヴィンテージアンプの揺れる音、サーフミュージックのギター、エレピの左右に揺れるような効果。どれも中身は「音量のつまみを、遅い波で自動的に上下させている」だけです。
こういう用途に使う遅い波の発振器を、シンセサイザーの世界では LFO(Low Frequency Oscillator、低周波発振器)と呼びます。音として聞かせるためではなく、何かのつまみを揺らすためだけに回っている裏方のオシレータです。トレモロはLFOを音量のつまみにつないだもの、前回 の入り口に出てきたビブラートはLFOを音程のつまみにつないだもの、と整理できます。
ひとつだけ式に細工があります。音量に波を掛けるとき、実際には $x \cdot (1 + 0.5\sin)$ のように「1+」の下駄を履かせます。掛け算の相手が $0.5\sin$ だけだと音量が1秒に何度もゼロをまたいでしまうので、1を中心に上下させて「大きくなったり小さくなったりする」揺れにするためです。この何気ない「1+」が、あとで大きな意味を持ってきます。
トレモロが効いている名曲
言葉より、実際に揺れているギターを聴くのが早いです。トレモロが曲の表情そのものになっている2枚を置いておきます。

The Smiths / Hatful of Hollow
How Soon Is Now?
イントロから鳴り続ける、水面が波打つようなあのギターがトレモロです。ジョニー・マーは複数のアンプのトレモロを同期させて深く速い音量の脈を作りました。トレモロと言えばまずこの音、という一曲です。

Creedence Clearwater Revival / Bayou Country
Born on the Bayou
曲全体を通してギターに深いトレモロがかかり、湿ったうねりのような揺れが沼地の空気感を作っています。ヴィンテージアンプのトレモロが曲の土台になっている好例です。
ジャケット画像はMusicBrainz / Cover Art Archive由来の画像を記事内に同梱して配信しています。
掛ける波を、どこまでも速くしてみる
トレモロのつまみは、ふつう数Hzまでしか回りません。しかしプログラムの中では、掛ける波の速さに上限はありません。毎秒5回を50回に、500回にしたらどうなるか——前回 、ビブラートを速めたら音色に化けたのとちょうど同じ実験を、今度は音量側でやってみます。
結果はこの地図のとおりです。およそ20Hz——人の耳が音として聞き取れる周波数の下限——のあたりを境に、耳はもう音量の揺れを揺れとして追いかけられなくなります。ワワワワが速まってブルブルという濁りになり、境を越えると、揺れの感覚は消えて代わりに聞いたことのない音色が現れる。可聴域の速さで振幅を掛け算する処理には、リングモジュレーション(リング変調)という名前が付いています。名前の由来は、アナログ時代にこの掛け算を実現した回路がダイオードを環状(リング状)につないだ形をしていたことで、仕組みそのものは掛け算以上でも以下でもありません。
名前についてひとつ補足を。前回のFM回で「モジュレータ」と呼んだのは、周波数を揺らす側の波につけた役割の名前でした。こちらの「リングモジュレーター」は、波どうしを掛け算する装置そのものの名前です。同じ変調の一族ではあっても、揺らす側の波を指すのか、掛け算する装置を指すのかで、言葉が指しているものが違います。
FMのときは、速めた先で倍音の森が生えました。AMの場合に何が生まれるかは、三角関数の公式が1行で教えてくれます。
掛け算は「和と差」を作る
サイン波どうしの掛け算は、高校数学の積和公式でこう書き直せます。
$$\sin(2\pi f_1 t) \cdot \sin(2\pi f_2 t) = \tfrac{1}{2}\big[\cos(2\pi (f_1 - f_2) t) - \cos(2\pi (f_1 + f_2) t)\big]$$
左辺は「$f_1$ の音に $f_2$ の波を掛けたもの」。右辺を見ると、出てくる成分は差の周波数 $f_1 - f_2$ と和の周波数 $f_1 + f_2$ の2つだけです。そして肝心なことに、右辺のどこにも $f_1$ も $f_2$ もいません。掛け算した瞬間、元の音は消え、和と差という2つの新しい音に置き換わるのです。この新しく生まれた成分は側帯波(そくたいは)と呼ばれます。元の音の両脇に、掛けた波の速さぶんだけ離れて立つ、掛け算の子どもたちです。
実はこの側帯波、トレモロのときから生まれていました。440Hzの音に5Hzの波を掛ければ、435Hzと445Hzが立ちます。ただ、元の音から5Hzしか離れていない音は近すぎて、耳には別の音として分離できません。3つの成分がひとかたまりに干渉した結果が、あの「音量の揺れ」として聞こえていたのです。掛ける波が速くなるほど側帯波は元の音から遠ざかっていき、可聴域を越えたところでついに独立した音として聞こえはじめる——地図の境界線の正体はこれです。
もうひとつ、さきほどの「1+」の下駄がここで効いてきます。$x \cdot (1 + 0.5\sin)$ を展開すると $x + x \cdot 0.5\sin$、つまり「元の音そのまま」と「掛け算した音」の足し算です。トレモロで元の440Hzが堂々と残っているのは、この $1 \cdot x$ の項のおかげでした。リングモジュレーターはこの下駄を履きません。波をまるごと掛けるので、公式のとおり元の音が本当に消えて、和と差の2本だけが残ります。図の上下の違いは、たった「1+」があるか無いかの違いです。
では、その和と差だけの音はどう聞こえるのか。440Hzに800Hzを掛けると、出てくるのは360Hzと1240Hzです。この2つは互いに整数倍の関係になく、どちらも元の440Hzとも無関係な高さです。倍音がきれいに整数倍に並んだ音を楽音として聞く耳にとって、これは鐘や金属板を叩いたときと同じ「高さの焦点が合わない」響きに聞こえます。リングモジュレーターを通した音が金属的でロボット的と形容されるのはこのためで、1963年から続くBBCのドラマ「ドクター・フー」に出てくる悪役ダーレク (金属の胴体に眼柄をつけた、あの「エクスターミネイト!」と叫ぶロボット型の宇宙人)のしゃがれた機械声は、俳優の声に約30Hzのリングモジュレーションを掛けて作られていました。声の倍音ひとつひとつが±30Hzに割れて濁る、まさに掛け算の声です。
ところで「和と差の周波数」と聞いて、差音の回 を思い出した方がいるかもしれません。大音量の2音を耳や機器に通すと、その非線形(入出力の曲がり)の内側にこっそり掛け算が現れて、差の成分がうっすら生まれる——あの話と、数式の上ではまったく同じ現象です。違いは立場です。差音は、足し算しかしていないつもりの信号が歪みをくぐった副産物として、元の2音の陰に小さく漏れ出るもの。リングモジュレーションは、その掛け算を処理として堂々と実行し、元の音を消してまで和と差を主役に据えるもの。同じ「和と差」でも、偶然の漏れと意図した合成という関係にあります。
触ってみる
ここまでの話を1本のスライダーに畳み込んだデモを用意しました。主役は「掛ける波の速さ」のスライダーです。再生したまま、5Hzあたりのトレモロ帯域から右へ回していってください。ワワワワが速まり、ブルブルに変わり、20Hzの境界を越えたところで揺れが消えて金属的な2つの音に化ける——地図の上を、耳で連続的に旅できます。スペクトラム表示には掛け算が作るはずの側帯波の位置(元の音±掛けた波)を▽印で重ねてあるので、実際のピークが理論どおりの場所に立つのも確かめられます。
うまく表示されないときは、デモを別タブで開く 。
掛け方の切り替えも見どころです。リングモッド式にすると、スペクトラムから元の440Hzの線がすっと消えて、和と差の2本だけになります。「1+」を外すと元の音が消える、を目で見られる瞬間です。仕上げに「ダーレク声風」のプリセットをどうぞ。「あー」という声風の音に30Hzを掛けただけで、あの機械声の親戚が出てきます。
余談ですが、筆者が個人開発している音感トレーニングアプリ Harmonize でも、この回の掛け算がそのまま働いています。楽器音のトレモロはLFOで音量を揺らす実装で、リズム音源には金属的な打撃音をリングモッド系の掛け算で作った音色があります。
どう実現するか
処理の本体は文字どおり1行です。サンプルごとに、揺れの波を計算して掛けるだけ。
/* トレモロ(C風の擬似コード) */
for (n = 0; n < length; n++) {
double m = 1.0 + depth * sin(2.0 * M_PI * fm * n / fs); /* 「1+」の下駄つき */
output[n] = input[n] * m;
}
fm を数Hzにすればトレモロ、可聴域まで上げて 1.0 + を取り払えば(m = sin(...) にすれば)リングモジュレーターになります。ディレイのようなバッファも、フィルタのような過去の記憶も要らない、サウンドエフェクトの中でいちばん短い部類のコードです。
ブラウザの Web Audio API なら、音量を司る GainNode の増幅率パラメータに、LFOの出力を流し込む配線で同じことができます。
const vca = ac.createGain();
vca.gain.value = 1; // 「1+」の下駄。0 にすればリングモッド
const lfo = ac.createOscillator();
lfo.frequency.value = 5; // 掛ける波の速さ。可聴域まで上げられる
const depth = ac.createGain();
depth.gain.value = 0.5; // 揺れの深さ
lfo.connect(depth);
depth.connect(vca.gain); // 増幅率そのものを波で揺らす=掛け算
source.connect(vca);
vca.connect(ac.destination);
上のデモも、この配線に表示まわりを足しただけで動いています。FMのときは倍音の森を数えるのにベッセル関数が要りましたが、AMは積和公式1本で全部の成分が言い当てられる、いっとう見通しのよい変調です。
参考文献
- 青木直史『C言語ではじめる音のプログラミング――サウンドエフェクトの信号処理 』オーム社(2008)。ディレイ・フィルタ・歪みなど、エフェクト側の信号処理をC言語の実装つきで解説する定番書。
- リング変調の仕組みと歴史は Wikipedia: Ring modulation 、ダーレクの声の制作手法は Wikipedia: Dalek が詳しいです。
- デモの実装には Web Audio API を使用。LFOの出力を AudioParam (GainNode.gain)へ接続して掛け算を組んでいます。
掛け算ひとつ、変わるのは速さだけ。まずはデモのスライダーで、揺れが音に化ける20Hzの国境を越えてみてください。
