Convolver でリバーブをかける
Web Audio API の ConvolverNode は、インパルスレスポンス(IR)を使って実空間の残響をシミュレートする「コンボリューションリバーブ」を実装するためのノードです。これを使えば、ブラウザ上で「教会で歌っているような響き」「ライブハウスのホール感」など、本物の空間音を再現できます。この記事では、IRとは何か、ConvolverNode の使い方、無料IR素材の探し方を解説します。
コンボリューションリバーブとは
リバーブには大きく2種類あります:
- アルゴリズミックリバーブ: 数式で残響を作る(Schroederアルゴリズム、Freeverb等)
- コンボリューションリバーブ: 実空間で測定した「インパルスレスポンス」を畳み込む
コンボリューションリバーブは「実空間の音響をそのままシミュレート」できるため、よりリアルです。
インパルスレスポンス(IR)とは
IRは「ある空間でパチンと一発音を出したときに、どう響いて減衰するか」を録音したオーディオファイルです。短くて1〜3秒、長いものでは10秒以上のものもあります。
WAV形式が一般的で、モノラル/ステレオの両方が使われます。サンプリングレートは元音と同じが理想です。
ConvolverNode の基本
const convolver = audioCtx.createConvolver();
// IRファイルを fetch して buffer にデコード
const response = await fetch('/path/to/ir.wav');
const arrayBuffer = await response.arrayBuffer();
const audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);
convolver.buffer = audioBuffer; // ここでIRをセット
// 接続: 音源 → convolver → 出力
source.connect(convolver).connect(audioCtx.destination);
たったこれだけで、その音源にIRの残響がかかります。
Dry / Wet ミックス — 残響量を調整する
そのままだと「リバーブ100%」の音になってしまいます。実用的には「原音(dry)」と「残響(wet)」の比率を調整します。
const dryGain = audioCtx.createGain();
const wetGain = audioCtx.createGain();
const convolver = audioCtx.createConvolver();
convolver.buffer = irBuffer;
dryGain.gain.value = 0.7; // 原音70%
wetGain.gain.value = 0.3; // 残響30%
// Dryパス: source → dryGain → 出力
source.connect(dryGain).connect(audioCtx.destination);
// Wetパス: source → convolver → wetGain → 出力
source.connect(convolver).connect(wetGain).connect(audioCtx.destination);
これで「軽くリバーブのかかった音」になります。ホール用は wet 0.4〜0.5、ボーカル用は 0.2〜0.3 程度が一般的です。
無料の IR ファイルが手に入る場所
1. OpenAir Library(University of York)
世界中の有名建築物(教会・スタジアム・廃墟・洞窟・部屋)でレコーディングされたIRが多数。研究目的のため著作権フリー / 引用可。
2. Voxengo Free IR Pack
商用利用OKの無料IRセット。スタジオやホールの定番音響が揃っています。
3. EchoThief Impulse Response Library
個性的なシチュエーション(地下道・大聖堂・トンネル)が豊富。クリエイティブコモンズ。
4. Github の音楽プロジェクト
多くのオープンソースシンセプロジェクトに、自由に使えるIRが同梱されています。
ファイル選びのポイント
- サイズ: 短いIR(1秒)なら数十KB。長いIR(10秒)は数MBになり、CPU負荷も上がる。
- サンプリングレート: AudioContext と合わせるとシームレス(通常44.1kHz)。
- ステレオ/モノラル: ステレオIRは空間の広がりが豊か。モノラルは省CPU。
- 用途: 「教会 = 長い余韻」「スタジオ = 短くタイト」「廃墟 = 個性的な共鳴」
パフォーマンス上の注意
ConvolverNode は IR の長さに比例してCPU負荷が増えます。リアルタイム再生で安定して動作する目安は以下の通りです:
- 1秒以内のIR: モバイルでも余裕
- 3秒程度のIR: デスクトップでは余裕、モバイルは要注意
- 10秒超のIR: ハイエンドPCでも複数音源と重ねるとキツい
軽量化したい場合は IR をトリミングするか、サンプリングレートを下げてデコードします。
IRファイルを自前で生成する小ワザ
本格的なIR録音が無くても、数学的にそれっぽい残響データを作ることはできます。
// 簡易的なホワイトノイズ減衰IR
function makeSyntheticIR(audioCtx, durationSec = 2.0, decay = 3.0) {
const sampleRate = audioCtx.sampleRate;
const length = sampleRate * durationSec;
const buffer = audioCtx.createBuffer(2, length, sampleRate);
for (let ch = 0; ch < 2; ch++) {
const data = buffer.getChannelData(ch);
for (let i = 0; i < length; i++) {
// ホワイトノイズ × 指数減衰
data[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / length, decay);
}
}
return buffer;
}
const ir = makeSyntheticIR(audioCtx, 2.0, 3.0);
convolver.buffer = ir;
本物のIRよりは粗いですが、「ファイルを読み込まずに即座にリバーブ感を出す」用途には十分です。
応用: プレディレイを足す
ConvolverNode の手前に DelayNode を入れると、「壁に音が当たるまでの時間(プレディレイ)」を作れて、より自然になります。
const preDelay = audioCtx.createDelay();
preDelay.delayTime.value = 0.03; // 30ms
source.connect(preDelay).connect(convolver).connect(wetGain).connect(audioCtx.destination);
応用: EQ で残響をフィルタリング
convolver の後段に lowpass を入れると「高域は短く、低域だけ残る」自然な減衰になります。これは実空間の音響でも起こる現象です。
まとめ
ConvolverNode は「ブラウザの中で物理空間をシミュレートする」強力なノードです。良いIRファイルを1つ持っているだけで、楽曲の質感が劇的に変わります。Web Audio API でリアルなサウンドプロダクションを目指すなら、コンボリューションリバーブは必修テクニックです。