Arei's blog

開発日誌 11/13


WebAudio特有の、再生・停止時のdistortion問題

sourceのstart/stopや、bufferの更新、dis/connectなどで起こる

convolverNodeのbuffer更新の場合、1msec前後無音(データの再生自体は止まらない)が生じてプツプツ聞こえる

クロスフェードをすると、増え続けるクロスフェード用のノードで音量がバク上がりする。

解決法は、

	eventPipe.addEventListener("posChangeCartesian",  pcc);

	async function pcc(e){
	
		const x = e.detail[0];
		const z = e.detail[2];
		const y = e.detail[1];
	
	  Tracks.CurrentTrack.UpdateSofaPositionCartesian(x,y,z);

		// 150msecの間、sofaのアップデートをブロックする。
		var myp = new Promise((resolve) => {
			eventPipe.removeEventListener("posChangeCartesian",pcc);
			setTimeout(function(){resolve()},150);

		});
		myp.then(()=>{
				eventPipe.addEventListener("posChangeCartesian",  pcc);

		}).catch();
	}

一定時間sofaの更新を受け付けないようにするi.e.,フレームレートを下げることだった。

これでも単純な連続音だとプツプツ聞こえるけど、正弦波を入力する人もあんまり居ないだろうしヨシ

タブの変更時に、3D表示を、タブの内容に合わせる変更

出力側から入力をいじくるとロクなことにならない

つまるところ

Three.jsやその影響下のController3dとOutput3dは右手系(yが高さ)でx->zでPhi,x->yでThetaである。

SOFAの仕様に基づいたBinaural処理系は左手系(zが高さ)で、x->yがPhi,y->zでThetaである。

座標系だけじゃなく、極座標のとり方も特殊だからややこしい。一般的には、鉛直軸から水平軸の角度だが、これは逆に水平軸から鉛直軸にとっている。

その上、ラジアンと弧度法が混ざってくる。

そのため、変換は

// Threejs系で、角度はrad

r = Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2));
phi = Math.sign(z)* Math.acos(x/(Math.sqrt(Math.pow(x,2)+Math.pow(z,2))));
theta = Math.asin(y/r);
			

x = this._Radius*Math.cos(radTheta)*(Math.cos(radPhi));
z = this._Radius*Math.cos(radTheta)*Math.sin(radPhi);
y = this._Radius*Math.sin(radTheta);

ところで、binaural系のyを入力時に逆転させると、鏡にできる。ASMR配信者は、マイクに向かって話しているのか、マイクの後ろから話すのか、その時マイクの右耳の音を自分のどちらの耳で聞いていて、どちらの耳として録音されているのだろうか。マイク=自分ならそのままのほうがいいがそれは後頭部の方から見ているとも言える。マイク=鏡に写った自分なら反転だが、マイクの顔を覗き込む位置なわけで、わかりやすい。どちらも180度ひっくり返ると違和感がある


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です