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函数中的代码时有点失败,这将改变和弦采样频率,所以它听起来像是弦上的另一个音品位置。对此代码的任何帮助将不胜感激,或者对我正在尝试做的事情是否有可能提出意见。

谢谢!

4

2 回答 2

6

PlaybackRate 会改变声音的音高,也会改变它的播放时间。

如果您只想改变音高,也许您可​​以使用音高转换器。在此检查我的 javascript pitch shifter implementation及其与 JavascriptNode在此插件中的使用

于 2013-01-31T11:37:25.063 回答
2

您可以通过设置获得所需的行为playbackRate,但正如布拉德所说,您将不得不使用多重采样。另请参阅此 SO 问题:在连接到网络音频 api 的音频元素上设置播放速率

于 2012-11-09T19:49:33.907 回答