10

私はWebAudioAPIを試しています。私の目標は、各弦に弦を開いて演奏する実際のギターの初期音源があり、他のすべてのフレット位置の音を動的に生成するデジタルギターを作成することです。このテーマについて調査したところ(これは私にとってはまったく新しいことです)、ソースサウンドサンプルの周波数を変更することでこれが達成される可能性があるように思われました。

問題は、合成されたsin波を変更するための多くのアルゴリズムを見てきましたが、オーディオサンプルの周波数を変更するためのアルゴリズムは何もありません。これは、これをどのように実装しようとしているのかをよりよく理解するためのコードのサンプルです。

// Guitar chord buffer    
var chordBuffer = null;

// Create audio context
var context = new webkitAudioContext();

// Load sound sample
var request = new XMLHttpRequest();
request.open('GET', 'chord.mp3', true);
request.responseType = 'arraybuffer';
request.onload = loadChord;
request.send();

// Handle guitar string "pluck"
$('.string').mouseenter(function(e){
    e.preventDefault();

    var source = context.createBufferSource();
    source.buffer = chordBuffer;

    // Create javaScriptNode so we can get at raw audio buffer
    var jsnode = context.createJavaScriptNode(1024, 1, 1);
    jsnode.onaudioprocess = changeFrequency;

    // Connect nodes and play
    source.connect(jsnode);
    jsnode.connect(context.destination);
    source.noteOn(0);
});

function loadChord() {
    context.decodeAudioData(
        request.response,
        function(pBuffer) { chordBuffer = pBuffer; },
        function(pError) { console.error(pError); }
    );
}

function changeFrequency(e) {
    var ib = e.inputBuffer.getChannelData(0);
    var ob = e.outputBuffer.getChannelData(0);
    var n = ib.length;

    for (var i = 0; i < n; ++i) {
        // Code needed...
    }
}

これで完了です。サウンドは問題なく再生できますが、コードサンプルの周波数を変更して弦の別のフレット位置のように聞こえるchangeFrequency関数でコードを作成する場合、少し迷います。このコードに関するヘルプや、私がやろうとしていることが可能かどうかについての意見をいただければ幸いです。

ありがとう!

4

2 に答える 2

6

playingRateは、サウンドのピッチだけでなく、再生時間も変更します。

ピッチだけを変更したい場合は、ピッチシフターを使用できます。ここで私のjavascriptピッチシフターの実装とこのプラグインのJavascriptNodeでの使用を確認してください

于 2013-01-31T11:37:25.063 に答える
2

を設定することで目的の動作を得ることができますplaybackRateが、Bradが言うように、マルチサンプリングを使用する必要があります。このSOの質問も参照してください:WebオーディオAPIに接続されたオーディオ要素でplaybackRateを設定します

于 2012-11-09T19:49:33.907 に答える