如何使用Web Audio API转换/调制音频缓冲频率

时间:2012-11-09 14:05:52

标签: javascript html5 audio web-audio

我正在尝试使用Web Audio API,我的目标是创建一个数字吉他,其中每个弦都有一个实际吉他的初始声源,打开弦,然后我想动态生成所有其他音品位置声音。经过对该主题的一些研究(这对我来说都是新手),听起来这可能是通过改变源声音样本的频率来实现的。

问题是我已经看到很多用于改变合成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 功能中创建代码时会有点失落,这将改变和弦采样频率所以它听起来就像弦上的另一个音品位置。任何有关此代码的帮助都会受到赞赏,或者对我是否尝试做的事情的意见甚至是可能的。

谢谢!

2 个答案:

答案 0 :(得分:6)

playbackRate将改变声音的音高,但也会改变其播放时间。

如果您只想改变音高,也许您可​​以使用音高移位器。检查我的javascript pitch shifter实现here及其与JavascriptNode in this plugin的使用

答案 1 :(得分:2)

您可以通过设置playbackRate来获得所需的行为,但正如布拉德所说,您将不得不使用多次采样。另请参阅此问题:Setting playbackRate on audio element connected to web audio api