我正在尝试使用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 函数中创建代码以更改和弦采样频率使其听起来像弦上的另一个品位时,我有些困惑。对于这段代码的任何帮助将不胜感激,或者建议我所尝试的是否可能。
谢谢!