[ Jpn | Eng ]

Main Menu



Recent

最近の記事

Search

サイト内検索:

Archive

Powered by
MTOS 5.2.2


g200kg > Web Audio API 解説 > 16.コンボルバーの使い方

Web Audio API 解説

2016/11/14

16.コンボルバーの使い方



Convolverとは

DTMをやっている方なら「コンボリューションリバーブ」あるいは「インパルスレスポンスリバーブ(IRリバーブ)」という名前を聞いた事があるのではないかと思います。ちょっと重いけど高品質なリバーブ、というくらいに一般的には評価されているのではないかと思いますが、「コンボルバー」はこのコンボリューションリバーブなどを実現するためのノードです。

原理を簡単に説明すると「インパルスレスポンスデータ(IRデータ)」と呼ばれる、実際のホールなどの残響を記録したデータを取っておき、エフェクトをかけたい音源との間でコンボリューション演算(畳み込み演算)と呼ばれる処理をする事で、その場所で音を出したかのように残響や周波数特性を再現する、というものです。

IRデータ自体は例えば.wavのような音声データの形式になっています。測定の元であるインパルス信号は音としては「パチッ」というような音で大雑把に言えば、客席にマイクを置いてステージでパンッと手を叩いた時の音を記録したようなものです。

多くの場合、残響効果いわゆる「リバーブ」をかけるために使用されますが、フィルターなどにも応用できます。例えば「電話を通した音」のIRデータがあれば電話を通したようなフィルターを掛ける事ができます。ただしディストーションのような歪を加えるエフェクトやフェイザーなどの時間と共に変化するモジュレーション系の効果には応用できません。


コンボルバーの使い方

Convolverノードはaudiocontext.createConvolver()で作成します。パラメータとしてはIRデータを指定する「buffer」と「normalize」というフラグがあるだけです。

normalizeはIRデータに記録されている音量によってエフェクト後の音量が変動しないようにあらかじめIRデータをノーマライズをするためのフラグでデフォルトでtrueになっています。特に事情がなければtrueのままで良いでしょう。そしてbufferにはIRデータの入ったBufferを指定します。これはBufferSourceの再生の時と同じ方法で読み込めます。

パラメータ単位デフォルト値値の範囲内容
bufferAudioBuffer-null-使用するインパルスレスポンスデータ
normalizeブール値-true-インパルスレスポンスデータをノーマライズするかどうかの指定


コンボルバーの使用例

それでは使用例です。この使用例ではBufferSourceをdestinationに接続して再生するのと並行してConvolverを通した音を鳴らしています。残響の音量は「ReverbLevel」の設定で変わります。なお、この例ではConvolverを通らない直接音を混ぜていますが、これを混ぜるべきかどうかは使用するIRデータによって変わります。


テストページ:コンボルバー
<!DOCTYPE html>
<html>
<head></head>
<body onload="LoadBuffers()">
<h1>Convolver Test</h1>
<img src="images/convolver1.png"/><br/>
<button onclick="Play()">Play</button><br/>
ReverbLevel : <input type="range" id="revlevel" min="0" max="100" value="50" onchange="Setup()"/><span id="revdisp">50</span>
<br/><br/>
<p>* Impulse Response file from:<br/>
<a href="http://www.acoustics.hut.fi/projects/poririrs/">http://www.acoustics.hut.fi/projects/poririrs/</a><br/>
bin-dfeq.zip <br/>
(free for non-commercial use)
</p>
<script type="text/javascript">

var files = [
	"rhythmloop.wav",
	"ir/s1_r1_bd.wav",
];

window.AudioContext = window.webkitAudioContext||window.AudioContext;
var audioctx = new AudioContext();

var source = null;
var convolver = audioctx.createConvolver();
var revlevel = audioctx.createGain();
revlevel.gain.value=0.5;
convolver.connect(revlevel);
revlevel.connect(audioctx.destination);
var buffers = [];
var loadidx = 0;
var req = new XMLHttpRequest();

function LoadBuffers() {
	req.open("GET", files[loadidx], true);
	req.responseType = "arraybuffer";
	req.onload = function() {
		if(req.response) {
			audioctx.decodeAudioData(req.response).then(function(b){
				buffers[loadidx]=b;
				if(++loadidx < files.length)
					LoadBuffers();
			},function(){});
		}
	};
	req.send();
}
function Setup() {
	var lev=document.getElementById("revlevel").value;
	revlevel.gain.value=parseInt(lev)*0.01;
	document.getElementById("revdisp").innerHTML=lev;
}
function Play() {
	if(source == null) {
		source = audioctx.createBufferSource();
		source.buffer = buffers[0];
		convolver.buffer = buffers[1];
		source.loop = true;
		source.connect(audioctx.destination);
		source.connect(convolver);
		source.start();
	}
	else {
		source.stop();
		source = null;
	}
}
</script>
</body>
</html>

さて、こんな風にconvolverは強力なエフェクトですがそもそもIRデータがなければ何もできません。ネット上を探せば公開されているIRデータが色々と見つかると思いますが、中には権利関係の怪しいものもありますので注意が必要です。特にWebアプリでの使用の場合ネット上にIRデータを配置する事になると思いますので、他サイトへのアップロードも可能である必要があります。このあたりを踏まえると使えるIRデータを探すのは意外と苦労するかも知れません。

とりあえず問題なく使えそうなIRデータの例を挙げておきます

またGitHub上にはWebAudioAPIのサンプルとしてIRデータを持ったものをgoogleのcwilso氏が公開しています(IRデータがオリジナルのものなのかどうかはわかりません)。 https://github.com/cwilso/MIDIDrums

なお、コンボルバーの処理の重さはIRデータの長さに左右されます。つまり長いリバーブを掛けるためには長いIRデータが必要になり、コンボルバーの計算量も多くなります。




g200kg