2

私は Web オーディオの確率的オシレータに取り組んでおり、scriptProcessorNode に問題があります。私のアルゴリズムは、ランダム ウォークを使用して波形の動的ブレークポイントを決定し、それらの間を補間します。

ブレークポイントが x 軸上を移動すると、振動波形の周波数が変化すると思いましたが、フィルタリング効果があり、周波数は scriptProcessorNode バッファ サイズによって決定されるようです。これは 256 の間の 2 の累乗でなければなりませんと 16384。

scriptProcessorNode オシレータの周波数を変更するにはどうすればよいですか?

ここに私の合成コードがあります:

scriptNode.onaudioprocess = function(audioProcessingEvent) {

    walk(); //use random walk to generate new x/y position for each breakpoint

    var outputBuffer = audioProcessingEvent.outputBuffer;
    var lastPoint = 0;
    var index = 0;

    // linearly interpolate between the new breakpoint positions
    for(var i = 0; i < breakpoint.length-1; i++) {
        var y = breakpoint[lastPoint].y; 
        for(var channel = 0; channel <= 0;channel++) {
            var outputData = outputBuffer.getChannelData(channel);
            if(i != 0){
                if(y >= breakpoint[i].y) {
                    while(y >= breakpoint[i].y) {
                        y = (breakpoint[i].m*index)+breakpoint[i].b;// y = m(x)+b
                        outputData[index] = y; 
                        index++; 
                    }
                } else if(y <= breakpoint[i].y) {
                    while(y <= breakpoint[i].y) {
                        y = (breakpoint[i].m*index)+breakpoint[i].b;
                        outputData[index] = y; 
                        index++;  
                    }
                }
            } 
        }
        lastPoint = i;
    }
}

そして、ここに実際の例へのリンクがあります: http://andrewbernste.in/bernie/gendy011.html

これはすべて、Iannis Xenakis の GENDY 確率的合成プログラムに基づいています。

ありがとう!

4

1 に答える 1

1

index関数の外部で変数を使用scriptNode.onaudioprocessして波形を scriptNode バッファに書き込むことで問題を解決しました。こうすることで、波形がバッファに書き込まれる頻度がバッファのサイズに結び付けられなくなります。

最終的なコードは次のとおりです。

var index = 0;
var freq = 0.8;

scriptNode.onaudioprocess = function(audioProcessingEvent){

    var outputBuffer = audioProcessingEvent.outputBuffer;
    var outputData = outputBuffer.getChannelData(0);
    for(var j = 0; j < outputData.length;j++){
        // linearly interpolate between the new breakpoint positions
        // get the interp point by comparing index to the x distance
        var lerp = (index - breakpoint[point].x) / (breakpoint[point+1].x - breakpoint[point].x)

        y = nx.interp(lerp,breakpoint[point].y,breakpoint[point+1].y);
        if(point < breakpoint.length && index >= breakpoint[point+1].x) {
            point++;
        }

        outputData[j] = y;
        index+=freq; 
        if(index >= breakpoint[breakpoint.length-1].x){
            index = 0;
            point = 0;
            walk(); 
        }  
    }
}
于 2015-05-25T19:11:39.153 に答える