3

私の知る限り、Google Chrome(v21)のWebAudioAPIは以下をサポートしていません。

    source.playbackRate.value = -1; 

よろしくお願いします!私は辛抱強くなりますが、それまでの間、この投稿には優れた代替ソリューションがあります。ロードされたバッファリストからロードされた自分のオーディオサンプルを逆にしようとするためにそれを採用しました。ロードされた各バッファの順方向バージョンと逆方向バージョンの両方を使用できることを期待しています。

    function finishedLoading(bufferList)  {
        for (var it = 0; it < this.urlList.length; ++it) {  
            storedBuffer[it] = bufferList[it]; // assign bufferList to globals
            storedBufferR[it] = bufferList[it];

            // attempt to reverse storedBufferR only ...
            Array.prototype.reverse.call( storedBufferR[it].getChannelData(0) );
            Array.prototype.reverse.call( storedBufferR[it].getChannelData(1) ); 
        }
    }

上記の関数は実際に再生を逆にしますが、すべてのバッファーが逆になるように、「storedbufferR」と「storedbuffer」の両方を逆にします。

ここで迷子になります...Array.protoypeがすべての配列に影響することを理解しているので、「storedBuffer」が「storedBufferR」の逆メソッドによってどのように影響を受けるかを確認できると思います。編集:逆の方法は問題のアレイにのみ影響します

しかし、上記の関数を書き直して、array.protoypeが逆にしたい保存されたバッファーにのみ影響するようにすることは可能ですか?そうでない場合は、順方向バージョンと逆方向バージョンの両方を保存する別の方法はありますか?

4

1 に答える 1

6

同じ参照を共有する 2 つの AudioBuffers に関するコメントは正しい方向に進んでいましたが、解決策は新しい AudioContext を作成することではありません。むしろ、新しい AudioBuffer を作成し、実際のオーディオ サンプルを保持する基礎となる Float32Array のクローンを作成するだけで済みます。

たとえば、この関数は AudioBuffer のクローンを作成します。

function cloneAudioBuffer(audioBuffer){
    var channels = [],
        numChannels = audioBuffer.numberOfChannels;

    //clone the underlying Float32Arrays
    for (var i = 0; i < numChannels; i++){
        channels[i] = new Float32Array(audioBuffer.getChannelData(i));
    }

    //create the new AudioBuffer (assuming AudioContext variable is in scope)
    var newBuffer = context.createBuffer(
                        audioBuffer.numberOfChannels,
                        audioBuffer.length,
                        audioBuffer.sampleRate
                    );

    //copy the cloned arrays to the new AudioBuffer
    for (var i = 0; i < numChannels; i++){
        newBuffer.getChannelData(i).set(channels[i]);
    }

    return newBuffer;
}

次に、上記を変更するには...

function finishedLoading(bufferList)  {
    for (var it = 0; it < this.urlList.length; ++it) {  
        storedBuffer[it] = bufferList[it]; // assign bufferList to globals
        storedBufferR[it] = cloneAudioBuffer(bufferList[it]);

        // attempt to reverse storedBufferR only ...
        Array.prototype.reverse.call( storedBufferR[it].getChannelData(0) );
        Array.prototype.reverse.call( storedBufferR[it].getChannelData(1) ); 
    }
}
于 2012-09-20T17:56:34.690 に答える