Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在我尝试将音频连接到双四元滤波器时JS抛出类型错误?_Javascript_Audio_Typeerror_Web Audio Api - Fatal编程技术网

Javascript 为什么在我尝试将音频连接到双四元滤波器时JS抛出类型错误?

Javascript 为什么在我尝试将音频连接到双四元滤波器时JS抛出类型错误?,javascript,audio,typeerror,web-audio-api,Javascript,Audio,Typeerror,Web Audio Api,我一直在涉猎WebAudioAPI,由于某些原因,我无法让双四元过滤器工作。我的振荡器、封套和自定义效果都很好,但滤波器一直给我带来麻烦 我有一个主增益控制vca,我想通过我的过滤器将其发送到context.destinationvca的定义如下: var vca = context.createGain(); vca.gain.value = 0.3 我构建的过滤器如下所示: function lowpass() { var filter = context.createBiquadFi

我一直在涉猎WebAudioAPI,由于某些原因,我无法让双四元过滤器工作。我的振荡器、封套和自定义效果都很好,但滤波器一直给我带来麻烦

我有一个主增益控制
vca
,我想通过我的过滤器将其发送到
context.destination
<代码>vca的定义如下:

var vca = context.createGain();
vca.gain.value = 0.3
我构建的过滤器如下所示:

function lowpass() {
  var filter = context.createBiquadFilter();
  filter.type = 'lowpass';
  filter.frequency.value = 1000
}
var filt = new lowpass
当我尝试运行以下操作时,CodePen会抛出一个类型错误:

vca.connect(filt);
filt.connect(context.destination)

为什么会这样?过滤器设置有问题吗?我连接VCA的方法有问题吗?我构建过滤器的方式?谢谢。

这是创建新过滤器的方式
lowpass()
是一个常规函数,但
new
关键字将其视为构造函数

您可以通过将代码作为常规函数调用并从中返回
过滤器来修复代码

function lowpass() {
  var filter = context.createBiquadFilter();
  filter.type = 'lowpass';
  filter.frequency.value = 1000
  return filter;
}
var filt = lowpass()
如果您想更进一步,您可以将
上下文
传递到函数中,而不是依赖将在外部范围中定义的
上下文
,使其更干净

function lowpass(context) {
  var filter = context.createBiquadFilter();
  filter.type = 'lowpass';
  filter.frequency.value = 1000
  return filter;
}
var filt = lowpass(context)

这就解决了问题–您的回答还说明了我的代码中的其他问题,即对非构造函数调用
new
。我还将频率的方法更改为
filter.frequency.setValueAtTime(1000,context.currentTime)
,这可能会有所不同。