我正在尝试使用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...
}
}
所以你有它 - 我可以播放声音很好但是在 changeFrequency 功能中创建代码时会有点失落,这将改变和弦采样频率所以它听起来就像弦上的另一个音品位置。任何有关此代码的帮助都会受到赞赏,或者对我是否尝试做的事情的意见甚至是可能的。
谢谢!
答案 0 :(得分:6)
playbackRate将改变声音的音高,但也会改变其播放时间。
如果您只想改变音高,也许您可以使用音高移位器。检查我的javascript pitch shifter实现here及其与JavascriptNode in this plugin的使用
答案 1 :(得分:2)
您可以通过设置playbackRate
来获得所需的行为,但正如布拉德所说,您将不得不使用多次采样。另请参阅此问题:Setting playbackRate on audio element connected to web audio api。