我正在使用webkit Audio API并且我正在尝试创建一个Echo效果,以实现我已经在循环中连接了一个带有GainNode的DelayNode(一个的输出是另一个的输入,反之亦然。
效果很好,但现在我想创建一个EchoNode对象,我可以插件并与其他AudioNode对象连接。
类似的东西:
myEchoNode = new EchoNode();
myConvolverNode = context.createConvolver();
myConvolverNode.connect(myEchoNode);
我认为我应该让我的EchoNode继承AudioNode,以便其他所有AudioNode的连接功能都能正常工作,但我不知道如何使用Web Audio API在Javascript中这样做。
任何人都可以给我一个提示,或者如果你认为有更好的方法可以实现,我会非常感激。
由于
答案 0 :(得分:8)
Oskar的解决方案应该可以解决问题,但我想指出它需要您以非标准方式连接到您的EchoNode(使用EchoNode.input
而不是简单地连接到EchoNode本身)。对于诸如反馈延迟之类的简单效果,可以通过工厂函数创建EchoNode来避免这种情况,该函数返回与一些额外属性混合的本机DelayNode。以下是SynthJS的示例:
function FeedbackDelayNode(context, delay, feedback){
this.delayTime.value = delay;
this.gainNode = context.createGainNode();
this.gainNode.gain.value = feedback;
this.connect(this.gainNode);
this.gainNode.connect(this);
}
function FeedbackDelayFactory(context, delayTime, feedback){
var delay = context.createDelayNode(delayTime + 1);
FeedbackDelayNode.call(delay, context, delayTime, feedback);
return delay;
}
AudioContext.prototype.createFeedbackDelay = function(delay, feedback){
return FeedbackDelayFactory(this, delay, feedback);
};
如您所见,结果是一个本机DelayNode,它可以以标准方式连接到其他节点,但它有一个附加的增益节点,可以提供反馈效果。
答案 1 :(得分:2)
看看我写的这篇文章,它可能会给你一些想法:http://www.html5rocks.com/en/tutorials/casestudies/jamwithchrome-audio/(这解释了道教推荐的tuna.js背后的基本思想)。