FM合成の回 では sin 2つでベルもエレピも作りましたが、それでもドラムだけは別格に思えます。太鼓の皮を叩く衝撃、響き線のざらつき、シンバルの複雑な金属の輝き——こんな音をプログラムで組み立てるのは無理筋で、ドラムばかりは本物を録音して貼りつける(サンプリングする)しかない。そう考えるのが自然です。
ところが実際は逆で、ドラムこそ手続きで作りやすい音です。キックはピッチが急降下する sin。スネアは短い sin にノイズを混ぜたもの。ハイハットは金属っぽいノイズの高い成分だけを残したもの。材料は sin とノイズの2つきりで、あとはそれぞれにエンベロープ (音量の輪郭)を掛けるだけ。録音ファイルを1つも使わずに、ドラムセットひとそろいが組み上がります。
これは机上の遊びではなく、音楽史に太い足跡を残したやり方です。1980年にローランドが発売したリズムマシン TR-808、通称「ヤオヤ」は、録音を一切使わず、全音色をアナログ回路のこの手続きで作っていました。当時はメモリが高価で録音を貼る余裕がなかったための苦肉の策でしたが、そこから出てきた「本物のドラムには全然似ていないのに、妙に気持ちいい音」は、ヒップホップやハウスの土台になり、いまも世界中の曲の低音で鳴り続けています。この記事では、その808流のレシピを1品ずつ、ブラウザで鳴らしながら見ていきます。
キック ── 音程の落下が「打撃」に聞こえる
まずはドラムセットの心臓、キック(バスドラム)からです。材料は sin が1本だけ。仕掛けは、その sin の周波数を一瞬で急降下させることです。
鳴らした瞬間は150Hzあたり、音程でいえば低めの歌声くらいの高さから出発して、0.1秒ほどで45Hz——耳というよりお腹に響くような低さ——まで一気に滑り落とします。同時に音量のほうも、叩いた瞬間を最大にしてあとは減るだけの打楽器型の輪郭を掛ける。つまり「高さ」と「大きさ」を同時に急降下させるわけです。
面白いのは、この音程の落下を、耳は音程の変化としては聞かないことです。落下があまりに速いので、メロディーがずり下がったとは感じず、「ドッ」という打撃の硬さとして知覚されます。デモで落下時間のつまみを触るとよく分かるのですが、落下を速くするとアタックの硬いタイトなキックに、遅くすると「ミョン」と沈み込むあの808らしい低音になります。音色の芯の硬さを握っていたのは、波形でもフィルタでもなく、音程の落下速度だったのです。
実物の太鼓でも似たことが起きています。叩かれた瞬間の皮はぐっと押し込まれて張りが強く、振動は高めから始まりますが、すぐに張りが戻って音が低く落ち着く。sin の急降下は、この皮の振る舞いのいちばん大事な骨組みだけを抜き出した真似だと言えます。
スネアとハイハット ── ノイズという素材
キックが sin の担当だとすると、残る2つはもうひとつの材料、ノイズの出番です。ここでいうノイズはホワイトノイズ、つまり低い成分から高い成分まで全部の高さがまんべんなく混ざった「ザーッ」という音のことです。作り方に工夫は何も要らず、サンプルごとにでたらめな数を並べるだけ。音は数の列だ という話をこの連載の最初にしましたが、その数の列をサイコロで決めれば、それがもうホワイトノイズです。
スネアの実物は、二重の構造で鳴っています。叩かれた皮と胴の「タン」という音程のある響きと、裏の皮に張られた響き線(スナッピーと呼ばれる金属のコイル線)がびりびり震える「シャッ」というざらつき。手続き合成でもそのまま二重にします。皮の担当は短い sin を2本、胴の共鳴らしく低めの音程で一瞬だけ。響き線の担当はホワイトノイズの低域を削ったものを短く。この2つをただ足し算するだけで、あのスネアになります。デモにはトーンとノイズの配合を変えるつまみを付けてあり、ノイズを絞りきると皮の音だけが残ってタムタム(音程のある太鼓)に、逆に振りきると響き線だけの「シャッ」になります。スネアとタムが同じレシピの配合違いだと分かるのは、手続き合成ならではの眺めです。
ハイハットはさらにノイズ寄りですが、ただのホワイトノイズを短く切っても「プシュッ」というエアスプレーのような音にしかなりません。シンバルらしさに足りないのは金属の質感です。FM合成の回 で、鐘や金属の響きの正体は「倍音が整数倍に並ばないこと」だという話がありました。ハイハットでも同じ手が使えて、互いに整数倍の関係にならない周波数の矩形波(真四角な形の、倍音をぎっしり含んだ波)を6本重ねると、ノイズとも楽音ともつかない金属質のじゃらつきが生まれます。これが808のハイハットとシンバルの種です。
仕上げはハイパスフィルタ。フィルタの回 では「高い成分を削ると音がこもる」ローパスを使いましたが、ハイパスはその逆で、指定した高さより下を捨てて上だけを通します。金属ノイズの低い成分をばっさり捨てて「シャリ」だけを残せば、ハイハットの完成です。あとはエンベロープの長さひとつで、0.05秒なら閉じたハイハットの「チッ」、0.3秒なら開いた「シャーン」。同じ音の長さ違いが別の奏法に聞こえます。
こうして並べてみると、3つの音色の違いは「sin とノイズをどう配合するか」「エンベロープをどれだけの長さにするか」「フィルタでどこを削るか」の3点だけです。打楽器の合成では波形の細部よりもエンベロープの設計がものを言う——ADSRの回 で「輪郭が音の顔を決める」と書いたことが、ここではほとんど音色の全部を決めています。
触ってみる
ここまでのレシピを全部詰めたドラムマシンを用意しました。4つのパッドを叩くと、その瞬間に sin とノイズから計算して鳴らします。録音は1バイトも入っていません。
うまく表示されないときは、デモを別タブで開く 。
まずはパッドを連打しながら、3本のつまみを動かしてみてください。キックの落下時間を右へ回すと打撃が「ミョン」という沈み込みに変わり、スネアのつまみは片端でタム、もう片端で響き線だけになります。ハイハットの余韻を伸ばすと、同じ音がクローズからオープンに化けます。4つめのクラップ(手拍子)はノイズだけの小ネタで、拍手は全員の手が完全には同時に鳴らないので、ノイズの立ち上がりを10ミリ秒ずつずらして3連発にしてあります。たったそれだけで「パン」が「パァン」という人の手の質感になるのが妙に可笑しいところです。
ループ欄の再生ボタンを押すと、16マス1小節のパターンが回ります。マスを押して自分のパターンに描き替えられるので、鳴らしながらつまみを触ると、ドラムマシンの音作りそのものが体験できます。スペクトラム表示では、キックが左端の低域だけ、ハイハットが右側の高域だけに山を立てる——同じ「打楽器」でも住んでいる場所がまるで違うのが見えます。
私事ですが、筆者が個人開発している音感トレーニングアプリ Harmonize のメトロノーム系のリズム音源も、キック、スネア、ハイハットからクラップまで10種類すべてをこの手続き合成で実装しています。アプリの中にドラムの録音ファイルは1つも入っていません。
どう実現するか
キックを式で書くと、周波数の時間変化が
$$f(t) = f_{\mathrm{lo}} + (f_{\mathrm{hi}} - f_{\mathrm{lo}}), e^{-t/\tau}$$
という指数カーブの落下で、この $f(t)$ で位相を回しながら sin を取り、音量のエンベロープを掛けるだけです。プログラムにするとこうなります。
/* キック:周波数エンベロープ付き sin(C風の擬似コード) */
double phase = 0.0;
for (n = 0; n < length; n++) {
double t = (double)n / fs;
double f = 45.0 + (150.0 - 45.0) * exp(-t / 0.03); /* 150→45Hz へ急降下 */
phase += 2.0 * M_PI * f / fs; /* いまの周波数で位相を回す */
output[n] = exp(-t / 0.13) * sin(phase); /* 音量エンベロープ × sin */
}
大事なのは、周波数を直接 sin の引数に入れるのではなく、位相に毎サンプル積み上げていくことです。周波数は位相の進む速さなので、こう書けば周波数がどれだけ急に変わっても波形はつながったままで、「プチッ」というつなぎ目の雑音が出ません。
ブラウザの Web Audio API なら、周波数パラメータへの予約だけで同じことができます。上のデモのキックも、実質この数行です。
const osc = ac.createOscillator();
osc.frequency.setValueAtTime(150, t0);
osc.frequency.exponentialRampToValueAtTime(45, t0 + 0.09); // 急降下の予約
const g = ac.createGain();
g.gain.setValueAtTime(1.0, t0);
g.gain.setTargetAtTime(0, t0, 0.13); // 打楽器型の減衰
osc.connect(g); g.connect(ac.destination);
osc.start(t0); osc.stop(t0 + 0.9);
スネアもハイハットも作りは同じ調子で、材料(sin かノイズか)と、フィルタのかけ方と、エンベロープの定数が違うだけです。楽器ひとつぶんのコードがそれぞれ十数行に収まってしまうあたりに、打楽器という音の正体——短い時間に押し込められた、輪郭とざらつきの設計——がよく表れています。
参考文献
- Gordon Reid, “Synth Secrets: Practical Bass Drum Synthesis ,” Sound on Sound (2002)。シンセでキック・スネア・シンバルを作る定番連載。本物の打楽器の物理から808流のレシピまで踏み込んでいます。
- Roland TR-808 (Wikipedia) 。全音色を回路の手続きで作った伝説機の来歴。
- 青木直史『サウンドプログラミング入門――音響合成の基本とC言語による実装 』技術評論社(2013)。ノイズ生成やエンベロープを含む音響合成の各方式をC言語の実装つきで解説する、数少ない日本語の定番書。
- デモの実装には Web Audio API を使用。ピッチの急降下は AudioParam.exponentialRampToValueAtTime で予約しています。
sin を1本落とせばキック、ノイズを混ぜればスネア、削ればハイハット。まずはデモのパッドを叩いて、録音ゼロのドラムセットを鳴らしてみてください。
