音をプログラムで扱うと聞くと、専門の道具や難しい理論が要りそうに思えます。ところが中身は驚くほど単純で、音とは1秒間に数万個並んだ数字の列でしかありません。スピーカーはその数字のとおりに膜を前後させているだけです。だから音を作るのも、加工するのも、分析するのも、突き詰めればすべて数列の計算になります。
このページは、araisun.com で書いているサウンドプログラミング連載の目次です。オシレータやエンベロープといった音響合成の基本から、ディレイ・リバーブなどのエフェクト、声を作るフォルマント合成、FFTによる分析、そして耳が引っかかる錯覚まで。どの回にも、ブラウザで実際に音が鳴るデモを置いてあります。 Web Audio API で書いた素のJavaScriptなので、何もインストールせずにその場で聴けます。読んで分からなくても、つまみを動かせば分かる、という作りを目指しました。
目次のうち「準備中」と書いてあるものは、書き上がってはいるものの、まだ公開していない回です。それぞれの分野の中に混ぜてあるので、この連載がどこまでを扱うつもりなのかは、そこから読み取ってください。公開したらリンクになります。
数式は隠しません。ただし出しっぱなしにもせず、必ず「その式で何が鳴るのか」まで着地させます。C言語で音を書いていた時代の教科書的なアルゴリズムを土台にしているので、Web Audio に限らず、どの言語でも同じ考え方が使えます。
どこから読むか
はじめてなら、音は数の列 から順に読むのが素直です。サンプル・倍音・エンベロープという語彙が最初の3本でそろい、以降がぐっと読みやすくなります。
作りたい音が決まっているなら、目次から直接どうぞ。ウォブルベースが作りたい、リバーブの中身が知りたい、といった動機で1本だけ読んでも成立するように書いています。
理屈より不思議な話が読みたいなら、耳の錯覚 の章から。無限に上がり続ける音階や、鳴っていないのに聞こえる低音など、聴いて驚く回を集めてあります。
音の正体
音・音色・音程が、それぞれ数の何にあたるのか。連載の土台になる4本と、音楽の側から見た1本です。
- 音は数の列 ── サイン波を数式から鳴らす
- 音色の正体は倍音の配合 ── 足し算だけでノコギリ波を作る
- 同じサイン波が「ピアノらしく」も「オルガンらしく」もなる ── ADSRエンベロープ
- 音色を変えるデジタルフィルター入門 ── ローパスとハイパスのカットオフ
- きれいな和音はなぜ「うなり」が消えるのか ── 平均律と純正律
楽器の音を合成する
サンプリング音源を使わず、計算だけで楽器の音を作る回です。
- sin 2つで金属もベルもエレピも ── FM合成
- ノイズをひと吹き、輪に閉じ込めて回すだけで弦が鳴る ── カープラス・ストロング
- ノイズと sin だけでドラムセットを作る ── 打楽器の手続き合成
- トロンボーンの音を「実測」で当てにいく ── 音色工房①
声を作る
母音、子音、そして機械が喋るようになるまでの歴史。
- ノコギリ波が「あー」と歌う ── フォルマント合成
- 「あ」は作れたのに「さ」が作れない ── 子音の正体(前編・摩擦音)
- 「た」は音ではなく出来事 ── 子音の正体(後編・破裂音)
- 機械はどうやって喋ってきたか ── ボコーダーからAI音声まで
- 「ゆっくり」も初音ミクも同じ木の枝 ── 音声合成の系統樹
シンセサイザーの音づくり
クラブミュージックでおなじみの音を、部品から組み立てます。
- ダブステップの「ウォブウォブ」ベースを作る ── LFOでフィルターを揺らす
- アシッドベース入門 ── TB-303 の音の正体
- 2本のノコギリ波が低音を濁らせる ── Reese Bass
- 発振器を飛ばして鳴らす ── Dub Siren
時間を操るエフェクト
音を遅らせる、返す、伸ばす、刻む。エフェクターの中身の話です。
- やまびこはリングバッファ1本 ── ディレイの仕組み
- 残響を「畳み込む」── リバーブと畳み込みの正体
- 音が止まる瞬間に沈んでいく ── Tape Stop / Vinyl Brake
- 音を粒に刻んで凍らせる ── Granular Freeze
- 音量を揺らす・音を掛け算する ── トレモロとリングモジュレーション
ディレイの下敷きになっているデータ構造は、配列を「輪」に見立てるリングバッファ で扱っています。
デジタルの落とし穴
計算で音を作ると、現実には無いはずの音が生まれたり、フィルタが暴れ出したりします。
- 高い音を作ったら化け物が出た ── エイリアシング(ナイキストの壁)
- IIRフィルタはなぜ発振するのか ── 極をドラッグして聴くz平面(準備中)
音を読む
鳴っている音から、機械が情報を取り出す側の話です。
- マイクの音から音程を当てる ── ピッチ検出(チューナーの中身)
- オートチューンの仕組み ── 音程を検出して、吸い付かせる
- 高速フーリエ変換はなぜ速いのか ── 偶数と奇数に割るだけ(準備中)
- 「ピポパ」を解読する ── DTMFと、音でデータを送った時代(準備中)
- スペクトログラムに絵を描く ── 音で絵を隠す(準備中)
耳の錯覚
鳴っていない音が聞こえる、上がり続ける音階が終わらない。耳と脳の癖につけこむ回です。
- 消えたはずの低音が聞こえる ── ミッシング・ファンダメンタル
- 鳴らしていない低音が聞こえる ── 差音と、パイプオルガンの合成低音
- 無限に上がり続ける音階 ── シェパードトーン
- 無限に速くなり続けるビート ── リセ・リズム
- 鳴っていない音が聞こえ続ける ── 連続性の錯覚(準備中)
- ノイズを止めた瞬間、鳴っていない音が残る ── ツヴィッカートーン(準備中)
- 左右の耳に違う音を入れると、頭の中でうなりが生まれる ── バイノーラルビート(準備中)
- 両耳あわせた音はいつも同じなのに、片方でしか鳴っていないように聞こえる ── オクターブ錯覚(準備中)
- MP3は、あなたに聞こえない音を捨てている ── 聴覚マスキング(準備中)
楽器やブラウザとつなぐ
この先に書くもの
ギターエフェクターの定番(歪み・フェイザー・コーラス・オクターバー・ワウ・コンプレッサー)、ステレオ定位とオートパン、イコライザー、ウェーブテーブル合成、本物の声のピッチシフト。このあたりは書くつもりでいるものの、まだ形になっていません。
デモについて
デモはすべて、外部ライブラリを使わない素の Web Audio API で書いています。ページを開いた瞬間に音が鳴ることはなく、必ず再生ボタンを押してから鳴る作りです(iPhone の Safari はユーザー操作なしに音を出せない仕様なので、その制約に合わせてあります)。音量は控えめに設定していますが、イヤホンで聴く場合は最初に確認してください。
ついでに自作アプリの紹介を。筆者は音程を聴き分ける耳を鍛える Harmonize というトレーニングアプリを個人で開発していて、この連載で扱っている音響合成は、そのアプリの音源エンジンを自分で作った経験が下敷きになっています。平均律と純正律の回で出てくる「うなりが消える瞬間」を、実際に耳で当てられるようになりたい方はどうぞ。
