[ Jpn | Eng ]

Main Menu



Recent

最近の記事

Search

サイト内検索:

Archive

Powered by
MTOS 5.2.2


g200kg > Web Audio API 解説 > 08.a-rateパラメーターとk-rateパラメーター

Web Audio API 解説

2016/11/14

08.a-rateパラメーターとk-rateパラメーター



Web Audio APIの各ノードのAudioParam型のパラメータには例えばフィルターノードのfrequencyやゲインノードのgainなど様々ありますが、実はa-rateパラメーターとk-rateパラメーターという2種類があります。この違いは処理する頻度にあり、a-rateパラメーターは1サンプル単位で反映され、k-rateパラメーターは128サンプル毎に反映されます。

a-rate パラメータは元々はあまり多くなく、信号に AM 変調や FM 変調をかけるためのものだけがa-rate に指定されていたのですが、仕様策定が進むにつれ、かなりのパラメータが a-rate で処理される事になっています。パラメータによっては動作モードによって k-rate になったり a-rate になったりしますので、最新の仕様書での確認が必要です。

いわゆるFM音源的なOP1=>OP2のような変調の場合の例を示します。と言ってもこれは「オレシーターの使い方」の例で出したビブラートを掛ける例とほとんど同じ構成で設定が違うだけです。LFOでゆっくりとビブラートをかけていたものを極端に速くする事で音色の変化を作り出すわけですね。

接続は Osc1=>Gain1=>Osc2(frequency)=>Gain2=>destination となっています。Osc2(frequency)の入力はHz単位ですのでGain1のgainはかなり高い値にしないと効果がでません。デフォルトの状態で300、OP2が440Hzですから、140Hz-740Hzまで振れている事になります。更に大きくしてマイナスの値が含まれるようになってもオシレーターはちゃんと動作します。

<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>FM synthesize Test</h1>
<img src="images/fm.png"/><br/>
OP1 Freq : <input type="text" size="10" id="op1freq" value="220"/><br/>
OP1 Level: <input type="text" size="10" id="op1level" value="300"/><br/>
OP2 Freq : <input type="text" size="10" id="op2freq" value="440"/><br/>
OP2 Level: <input type="text" size="10" id="op2level" value="1"/><br/>
<br/>
<button onclick="Setup()">Set</button><br/>
<script type="text/javascript">

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

var play = 0;
var op1 = audioctx.createOscillator();
var gain1 = audioctx.createGain();
var op2 = audioctx.createOscillator();
var gain2 = audioctx.createGain();

op1.connect(gain1);
gain1.connect(op2.frequency);
op2.connect(gain2);
gain2.connect(audioctx.destination);

function Setup() {
	if(play == 0) {
		play = 1;
		op1.start();
		op2.start();
	}
	op1.frequency.value = parseFloat(document.getElementById("op1freq").value);
	gain1.gain.value = parseFloat(document.getElementById("op1level").value);
	op2.frequency.value = parseFloat(document.getElementById("op2freq").value);
	gain2.gain.value = parseFloat(document.getElementById("op2level").value);
}
</script>

</body>
</html>
テストページ:FMシンセシス

もうひとつの例としてgainを使ったAM変調というかリング変調です。gainパラメーターは負の値になった時に極性が反転すると明記されていますので、ここにオシレーターからの信号を入れる事でいわゆるリング変調を掛ける事ができます。

<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Ring Modulation Test</h1>
<img src="images/ring.png"/><br/>
Osc-2 Freq : <input type="text" size="10" id="osc2freq" value="440"/><br/>
Osc-1 Freq : <input type="text" size="10" id="osc1freq" value="777"/><br/>
<br/>
<button onclick="Setup()">Set</button><br/>
<script type="text/javascript">

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

var play = 0;
var osc1 = audioctx.createOscillator();
var osc2 = audioctx.createOscillator();
var gain = audioctx.createGain();

osc1.connect(gain.gain);
osc2.connect(gain);
gain.connect(audioctx.destination);

function Setup() {
	if(play == 0) {
		play = 1;
		osc1.start();
		osc2.start();
	}
	osc1.frequency.value = parseFloat(document.getElementById("osc1freq").value);
	osc2.frequency.value = parseFloat(document.getElementById("osc2freq").value);
	gain.gain.value = 0;
}
</script>

</body>
</html>
テストページ:リングモジュレーション




g200kg