jsはaudioContextを通じて3Dサウンド効果を実現します

jsはaudioContextを通じて3Dサウンド効果を実現します

この記事では、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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScript ベースでアラーム効果音を実現する
  • js を使用して Web ページにバックグラウンド ミュージックを追加し、サウンド効果を選択する方法

<<:  高並列処理 nginx サーバー向け Linux カーネル最適化構成の説明

>>:  MYSQL サブクエリとネストされたクエリの最適化例の分析

推薦する

Dockerfile における VOLUME と docker -v の違い

Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...

ノードイベントループにおけるイベント実行の順序

目次イベントループブラウザ環境イベントループノード環境イベントループ6つのステージ(1)setTim...

マインスイーパゲームを実装するための jQuery プラグイン (1)

この記事では、jQueryプラグインを使用したマインスイーパゲームの最初の記事の具体的なコードを参考...

Windows Server のインストール後にワイヤレスとオーディオが機能しない問題を解決する

1. ワイヤレスPowerShell を実行し、次のコマンドを入力します。 install-wind...

mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション

問題を見つける最近、仕事で問題が発生しました。InnoDB タイプの SQL ファイルを実行すると、...

CSS はスクロールバーを非表示にしてコンテンツをスクロールする効果を実現します (3 つの方法)

フロントエンド開発では、スクロールバーを非表示にしながらスクロールをサポートしなければならないという...

Tkinterはjsキャンバスを使用してグラデーションカラーを実現します

目次1. RGBを使用して色を表す2. Tkinter キャンバスコンポーネント3. グラデーション...

MySQL パフォーマンスの最適化: インデックスを効率的かつ正しく使用する方法

実践こそが真実をテストする唯一の方法です。この記事では、インデックスの全体的な使用法についてのみ説明...

SQL Server コメントのショートカット キー操作

SQL Server のバッチコメントバッチ注釈Ctrl + (K, C): Ctrlキーを押しなが...

HTML で点線の境界線を設定する方法

CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...

HTML レイヤード ボックス シャドウ効果のサンプル コード

まず、画像を見てみましょう。今日はこのエフェクトを作成します。 実は、何でもないんです。Web ペー...

Vueは3階層メニューを再帰的に実装する

この記事の例では、3階層メニューを再帰的に実装するVueの具体的なコードを参考までに共有しています。...

MySQL トリガーの追加、削除、変更、クエリ操作の例

この記事では、例を使用して、MySQL トリガーの追加、削除、変更、およびクエリ操作について説明しま...

計算機機能を実現するjsバージョン

この記事の例では、計算機機能を実装するためのjsの具体的なコードを参考までに共有しています。具体的な...

MySQLからElasticsearchにデータを同期する方法の詳細な説明

目次1. 同期の原理2. ログスタッシュ入力JDBC 3. go-mysql-elasticsear...