2012-11-09 82 views
10

我正在試驗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函數中的代碼,該函數將更改和絃採樣頻率,使其聽起來像字符串上的另一個音柱位置。任何關於這個代碼的幫助都會被讚賞或者我是否試圖做的甚至是可能的。

謝謝!

+1

您正在製作採樣器。您將需要比單個字符串多得多的樣本。至少,如果你想要體面的聲音,你需要每個八度兩個樣本。即使如此,吉他也是一款非常複雜的樂器,只需重新制作樣品。 – Brad

回答

6

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

如果您只想改變音高,也許可以使用音高移位器。檢查我的javascript音高移位器實現here及其與JavascriptNode的使用in this plugin