Tone.PitchShift 和 Howler.js 问题

Tone.PitchShift and Howler.js issues

我喜欢将 Howler.js 用于我的 (Meteor) 应用程序。但是,播放速率功能导致了我不想要的音高偏移(我只想要时间拉伸,并保持音高)。因此,我的解决方案是将它的音高转换为 'correct' 音高。看起来很简单,这就是为什么我选择使用 https://tonejs.github.io/

唯一的问题是,我一辈子都无法让它正常工作。在阅读 Web Audio API、Tone.js 文档和在线 discussion/troubleshoot 论坛数小时后,我得到的最接近潜在解决方案的是这样的(在我的应用程序呈现期间调用,以防万一问题与过早加载有关):

Tone.setContext(Howler.ctx); //set tone's context to the Howler.js audiocontext
var pShift = new Tone.PitchShift(3); //create the PitchShift effect, +3 semi-tones transposition
pShift.context = Howler.ctx; //set the PitchShift's context to the Howler.js audiocontext
pShift.connect(Howler.ctx.destination); //connect the PitchShift's output to the Howler's destination
Howler.masterGain.connect(pShift); //connect the Howler's master GainNode output to the PitchShift effect

//For debugging purposes:
console.log(Howler.masterGain)
console.log(pShift);

当我这样做 运行 时,我收到此错误消息:

Exception from Tracker afterFlush function: meteor.js?hash=857dafb4b9dff17e29ed8498a22ea5b1a3d6b41d:1059 TypeError: Failed to execute 'connect' on 'AudioNode': Overload resolution failed.

我还注意到下面的 console.log() 命令甚至没有出现在控制台中,这很奇怪。但是,当我删除最后一行(mastergain.connect 到 pShift)时,他们会这样做。

我尝试了一些其他技术,例如 https://github.com/mmckegg/soundbank-pitch-shift/(它起作用了,但它同时播放了变调声音和非变调声音,无论我将其置于何种设置), 或者简单地使用 AudioBufferSourceNode.detune(我不知道如何让它与 Howler.js 一起工作,因为 Howler 只有可以公开 GainNode 和 AudioContext 的函数,无法弄清楚如何在仍然使用 Howler 的同时从那里读取输出)。

任何 help/leads 将不胜感激!

我认为您的代码段中不需要第 3 行。由于您的第一行告诉 Tone.js 使用 howler.js 创建的 AudioContext。因此 pShift.context 应该等于 Howler.ctx。但仔细检查可能有意义。

console.assert(pShift.context === Howler.ctx);

howler.js暴露的masterGain是原生音频节点。这意味着它不能直接连接到使用 Tone.js 创建的节点,因为它们不是本机音频节点。但是 Tone.js 提供了一个帮手来做到这一点。

Tone.connect(Howler.masterGain, pShift);

我认为您还需要在 masterGain 上调用 disconnect() 以删除任何现有连接。

以下代码段应该有效。

Tone.setContext(Howler.ctx);

const pShift = new Tone.PitchShift(3);

Howler.masterGain.disconnect();

Tone.connect(Howler.masterGain, pShift);
pShift.toDestination();

只是想补充一点,如果您设置了 html5: true 选项,那么浏览器会自动为您修复该问题