如何使用Web Audio API改变音频缓冲区的频率/调制

10

我正在尝试使用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
2个回答

7

playbackRate会改变声音的音高,也会影响播放时间。

如果您只想改变音高,可以尝试使用音高移调器。在这里检查我的JavaScript音高移调器实现(点击此处),以及它如何与JavascriptNode一起使用在此插件中。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接