この記事では、audioContextを介して3Dサウンド効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。 序文AudioContextのsetPositionは3Dサウンドエフェクトを実装します エフェクト表示コードショーケース<!DOCTYPE html> <html lang="ja"> <ヘッド> <メタ文字セット="UTF-8"> <title>3D オーディオ</title> <スタイル> 本文、div{ マージン: 0px; パディング: 0px; テキスト配置: 中央; } #cav{ 境界線: 1px 黒一色; 境界線の半径: 4px; マージン: 10px 自動; } </スタイル> </head> <本文> <キャンバスid="cav" 幅="320" 高さ="200"></キャンバス> </本文> <スクリプト> Aud = 関数 (ctx, url) { this.ctx = ctx; this.url = url; // ソースノード this.src = ctx.createBufferSource(); //複数の処理ノードグループ this.pNode = []; }; オーディオプロトタイプ = { 出力(){ (i = 0 とします; i < this.pNode.length; i++){ tNode = this.src; とします。 (j = 0 とします; j < this.pNode[i].length; j++){ tNode.connect(this.pNode[i][j]); tNode = this.pNode[i][j]; } tNode.connect(this.ctx.destination); } }, 再生(ループ){ this.src.loop = ループ || false; この出力(); 開始(0); }, 停止() { this.src() を停止します。 }, addNode(ノード、グループIdx = 0){ this.pNode[groupIdx] = this.pNode[groupIdx] || []; this.pNode[groupIdx].push(ノード); } }; //ノードタイプを設定する Aud.NODETYPE = { GNODE: 0 // gainNode ノードを表します} //Aud管理オブジェクト AudManager = { URL: [], アイテム: [], ctx: null、 初期化(){ 試す{ this.ctx = 新しい AudioContext(); }キャッチ(e){ コンソールにログ出力します。 } }, ロード(コールバック){ (i = 0 とします; i < this.urls.length; i++){ this.loadSingle(this.urls[i], コールバック); } }, loadSingle(url, コールバック){ req = new XMLHttpRequest(); 要求を開きます('GET'、URL、true)。 req.responseType = 'arraybuffer'; 自分自身 = this とします。 req.onload = 関数(){ self.ctx.decodeAudioData(このレスポンス) 。それから( バッファ => { aud = new Aud(self.ctx, url); とします。 aud.src.buffer = buf; 自己アイテムをプッシュします(aud); (self.items.length == self.urls.length)の場合{ 折り返し電話(); } }, エラー => { console.log(`デコードエラー:${err}`); } ) }; 要求を送信します。 }, ノードを作成します(ノードタイプ、パラメータ){ ノードを null にします。 スイッチ (ノードタイプ) { ケース1: ノード = this.ctx.createPanner(); 壊す; ケース2: ノード = this.ctx.createScriptProcessor(param[0], param[1], param[2]); 壊す; デフォルト: ノード = this.ctx.createGain(); } ノードを返します。 } }; ctx = document.getElementById('cav').getContext('2d') とします。 // 移動点の座標を定義する cX = 190, cY = 100、 度 = 0; window.onload = 関数 (){ 初期化(); } 関数renderCir(x, y, r, col){ ctx.save(); ctx.beginPath(); ctx.arc(x, y, r, 0, Math.PI*2); ctx.closePath(); ctx.fillStyle = col; ctx.fill(); ctx.restore(); } 関数renderCenter(){ renderCir(160, 100, 8, "赤"); } 関数renderCat() { renderCir(cX, cY, 8, "青"); } 関数init(){ AudManager.urls = ["test.mp3"]; AudManager を初期化します。 AudManager.load(()=>{ pNod1 = AudManager.createNode(1); とします。 sound1 = AudManager.items[0]とします。 sound1.addNode(pNod1); sound1を再生します(true); 時間ハンドル(); }); } 関数timeHandle() { ウィンドウ.setInterval(()=>{ ctx.clearRect(0,0,320,200); rad = Math.PI*deg / 180 とします。 sx = 90*Math.cos(rad)とします。 sy = 90*Math.sin(rad); cX = 160 + sx; cY = 100 + sy; AudManager.items[0].pNode[0][0].setPosition(sx*0.1, -sy*0.1, 0); レンダリングセンター(); レンダリングCat(); 度++; }, 30); } </スクリプト> </html> 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: 高並列処理 nginx サーバー向け Linux カーネル最適化構成の説明
>>: MYSQL サブクエリとネストされたクエリの最適化例の分析
目次1. 非同期2. 待つ: 3. 包括的なアプリケーション1. 非同期async 、非同期コードが...
この記事では、jQueryプラグインを使用してマインスイーパゲームを実装する2番目の記事を参考までに...
目次序文シナリオシミュレーション要約する序文最近、sql_mode の話題については何度も話し合われ...
目次序文クロージャの紹介メモリのゴミを識別する方法クロージャのメモリ表現結論序文クロージャは、Jav...
目次1. フロントエンドルーティングの実装原則2. vue-Routerの基本的な使い方2.1. イ...
この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...
目次序文仮想リストとは何ですか?デモ効果準備スクリーンの高さとボックスの高さ最適化要約する序文人気の...
目次1. プラットフォームバスの紹介1.1. Linuxドライバの分離と階層化1.1.1. Linu...
ここにmysqlドライバmysql.data.dllがあります知らせ:ここではX86バージョンが多く...
序文この記事は主に、MySQL の Innodb で 2T の大きなテーブルをすばやく削除する方法に...
問題の説明最近、MySQL5.6.21サーバーがありました。アプリケーションがリリースされた後、同時...
nohup コマンドUnix/Linux を使用する場合、通常はプログラムをバックグラウンドで実行す...
404 を避けるべきだとどうして言えるのでしょうか? その理由は、ほとんどの 404 ページが粗雑す...
mysql コマンドを使用して MySQL サーバーに接続します。 MySQL サーバーが起動したら...
序文smb は、クライアントとサーバー間の Web 接続および情報通信に使用できるプロトコルの名前で...