如何使用 Web Audio API 移动/调制音频缓冲频率
Posted
技术标签:
【中文标题】如何使用 Web Audio API 移动/调制音频缓冲频率【英文标题】:How to shift/modulate audio buffer frequency using Web Audio API 【发布时间】:2012-11-09 14:05:51 【问题描述】:我正在尝试使用 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】:playbackRate 会改变声音的音高,也会改变它的播放时间。
如果您只想改变音高,也许您可以使用音高转换器。检查我的 javascript pitch shifter 实现 here 及其与 JavascriptNode 的使用 in this plugin
【讨论】:
【参考方案2】:您可以通过设置playbackRate
来获得所需的行为,但正如 Brad 所说,您将不得不使用多重采样。另请参阅此 SO 问题:Setting playbackRate on audio element connected to web audio api。
【讨论】:
以上是关于如何使用 Web Audio API 移动/调制音频缓冲频率的主要内容,如果未能解决你的问题,请参考以下文章
如何下载我刚刚使用 Web Audio API 创建的声音?
如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?