如何使用Web音频API移动/调制音频缓冲频率



我正在尝试Web Audio API,我的目标是创建一个数字吉他,每个字符串都有一个实际的吉他的初始声音源,然后我想打开字符串为了生成所有其他FRET位置,会动态听起来。在对该主题进行了一些研究(对我来说都是很新的)之后,听起来可能是通过更改源声音样本的频率来实现的。

问题是,我已经看到许多用于改变合成的罪行的算法,但没有任何改变音频样本的频率。这是我的代码示例,可以更好地了解我如何尝试实现此目的:

// 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...
    }
}

这样就可以了 - 我可以很好地播放声音,但是当在 cansefefquency 函数中创建代码时,我会失去一点点,该功能会更改和弦样品频率听起来像是字符串上的另一个货物位置。对此代码的任何帮助都将不胜感激,或者就我试图做的事情是否有可能提出意见。

谢谢!

plophbackrate将改变声音的音调,也会改变其播放时间。

如果您只想更改音高,也许您可以使用音高换档器。在此处查看我的JavaScript音高换档器的实现,并在此插件中使用JavaScriptNode

您可以通过设置playbackRate来获得所需的行为,但是正如布拉德所说,您将不得不使用多抽样。另请参阅此类问题:在连接到Web Audio API的音频元素上设置plokackrate。

最新更新