[英]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
來獲得所需的行為,但是正如Brad所說,您將不得不使用多重采樣。 另請參見此SO問題: 在連接到Web音頻api的音頻元素上設置playbackRate 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.