2026年6月11日 · 技術解説

Convolver でリバーブをかける

convolver-reverb の記事アイキャッチ画像

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 でリアルなサウンドプロダクションを目指すなら、コンボリューションリバーブは必修テクニックです。