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 muffledHigh-pass filter
Makes sounds more tinnyBand-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 rangeAll-pass filter
Creates phaser effects