簡體   English   中英

如何使用Web Audio API轉換/調制音頻緩沖頻率

[英]How to shift/modulate audio buffer frequency using Web Audio API

我正在嘗試使用Web Audio API,我的目標是創建一個數字吉他,其中每個琴弦都有一個初始吉他的真實聲源,彈奏該琴弦時會打開它,然后我想動態生成所有其他琴弦位置聲音。 經過對該主題的研究(這對我來說是很新的),聽起來可以通過更改源聲音樣本的頻率來實現。

問題是我見過很多用於改變合成正弦波的算法,但沒有什么可以改變音頻樣本的頻率。 這是我的代碼示例,可讓我更好地了解如何實現此目的:

// 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函數中創建代碼會有點不知所措 ,因為它將更改和弦采樣頻率,因此聽起來像弦上的另一個琴弦位置。 對此代碼的任何幫助將不勝感激,或者對我嘗試做的事情是否有意見。

謝謝!

playbackRate會改變聲音的音調,還會改變其播放時間。

如果只想改變音高,也許可以使用音高移位器。 在這里檢查我的javascript音調轉換器實現及其在此插件中與JavascriptNode 的結合使用

您可以通過設置playbackRate來獲得所需的行為,但是正如Brad所說,您將不得不使用多重采樣。 另請參見此SO問題: 在連接到Web音頻api的音頻元素上設置playbackRate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM