关于javascript:Web Audio API,设置高音和低音

Web Audio API, setting treble and bass

我正在尝试学习如何正确使用网络音频 api,但我遇到了一些困惑。

在我的项目中,我试图复制一台 1982 年的旧 Harman/Kardon 接收器的功能。 (点击链接查看照片)

此接收器具有用于高音和低音控制的单独拨盘。我将在这个问题中处理高音。我敢肯定,一旦我指向正确的方向,我就能算出等效的低音。

在初始化函数中,我创建上下文和过滤节点。

1
2
3
4
5
6
7
8
9
10
11
12
window.AudioContext = window.AudioContext || window.webkitAudioContext;
    context = new AudioContext();
    source = context.createMediaElementSource(document.getElementById('audio'));
    gainNode = context.createGain();

//filter nodes
bassTurnoverFilter = context.createBiquadFilter();
trebleTurnoverFilter = context.createBiquadFilter();
loudnessTrebFilter = context.createBiquadFilter();
loudnessBassFilter = context.createBiquadFilter();
trebleLevelFilter = context.createBiquadFilter();
bassLevelFilter = context.createBiquadFilter();

我目前正在使用 jogDial 插件来控制转盘。刻度盘确实有效,当刻度盘从 0% 转到 100% 时,我可以获得介于 0 和 1 之间的"高音"变量范围。

这是我用于高音拨盘的当前鼠标移动功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
.on("mousemove", function(event){

var treble = (event.target.rotation + 140) / 280;

    if(trebleLevelFilter !== undefined){
        trebleLevelFilter.disconnect();
    }
    source.connect(trebleLevelFilter);
    trebleLevelFilter.type ="highshelf";
    trebleLevelFilter.frequency.value = 200;
    trebleLevelFilter.gain.value = treble;
    trebleLevelFilter.connect(context.destination);
});

我的问题或多部分问题是...
我应该使用 6 种类型中的哪一种? ("lowpass","highpass","bandpass","lowshelf","highshelf","peaking","notch","allpass")我猜这是高通或高通。

我应该设置什么频率?

当表盘转动时,gain.value 应该是动态的吗?

我是不是完全走错了方向?

我将 gain.value 设置为高音变量值,当转到 100% 时,它似乎会稍微增加音量......但我认为这不是我想要的正确功能完成。


我不确定您为什么要创建六个不同的过滤器 - 您应该只需要两个,一个用于高音,一个用于低音。

我认为你看到的 HK 放大器没有中频控制——这有点奇怪,但还好。低音滤波器可能是低架,高音是高架;按钮控制每个按钮的截止频率。请记住,搁架式滤波器在零增益时是平坦的响应 - 您可以在 http://googlechrome.github.io/web-audio-samples/samples/audio/frequency-response.html 上使用滤波器,看看他们会做什么看起来像。选择一个低架子,freq= ~200,然后玩增益。

因此,例如,您使用高音滤波器很接近,除了"高音"和"低音"增益值不应该在 [0,1] 之间 - 它应该在 [-maxgain ,最大增益]。 "maxgain" 大概是 2-3?您必须尝试使用??它并选择一个好的范围 - 我在 HK 手册中找不到 (http://www.manualslib.com/manual/279084/Harman-Kardon-Hk590i.html) .将滤波器串联而不是并联也很重要(否则会出现相位问题)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// if treble=0 and bass=0 you'll have a flat response
bassFilter = context.createBiquadFilter();
bassFilter.type ="lowshelf";
bassFilter.frequency.value = 200;  // switches to 400 in UI
bassFilter.gain.value = bass;  // you'll need to hook this to UI too

trebleFilter = context.createBiquadFilter();
trebleFilter.type ="highshelf";
trebleFilter.frequency.value = 2000;  // switches to 6000 in UI
trebleFilter.gain.value = treble;  // you'll need to hook this to UI too

source.connect(bassFilter);
bassFilter.connect(trebleFilter);
trebleFilter.connect(context.destination);

此外,没有理由断开过滤器并重新连接它 - 您可以在 .gain.value 连接时对其进行实时更改。


以下显示了选择用于各种目的的过滤器类型的一些建议:

网络音频 API

从该页面粘贴:

There are many kinds of filters that can be used to achieve certain kinds of effects:

Low-pass filter
Makes sounds more muffled

High-pass filter
Makes sounds more tinny

Band-pass filter
Cuts off lows and highs (e.g., telephone filter)

Low-shelf filter
Affects the amount of bass in a sound (like the bass knob on a stereo)

High-shelf filter
Affects the amount of treble in a sound (like the treble knob on a stereo)

Peaking filter
Affects the amount of midrange in a sound (like the mid knob on
a stereo)

Notch filter
Removes unwanted sounds in a narrow frequency range

All-pass filter
Creates phaser effects