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

Bee*_*ees 10 javascript audio html5 web-audio-api

我正在尝试使用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...
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你有它 - 我可以很好地播放声音但是在改变和弦采样频率时会有点失败,这会改变和弦采样频率,因此它听起来像是字符串上的另一个音品位置.任何有关此代码的帮助都将受到赞赏,或者对我是否尝试做的事情的意见甚至是可能的.

谢谢!

jan*_*nce 6

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

如果你只想改变音高,也许你可以使用音高变换器.检查我的javascript pitch shifter实现,在此插件中使用JavascriptNode


Bor*_*mus 2

您可以通过设置获得所需的行为playbackRate,但正如 Brad 所说,您将不得不使用多重采样。另请参阅这个问题:SettingplayingRate on audio elementconnected to web audio api