【问题标题】:Web Audio API, setting treble and bassWeb Audio API,设置高音和低音
【发布时间】:2016-09-13 11:58:53
【问题描述】:

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

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

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

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

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 plugin 来控制转盘。刻度盘确实有效,当刻度盘从 0% 转到 100% 时,我可以获得介于 0 和 1 之间的“高音”变量范围。

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

.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”)猜测是highpass还是highself。

我应该设置什么频率?

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

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

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

【问题讨论】:

标签: javascript web-audio-api


【解决方案1】:

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

认为您正在查看的 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) 中找不到。将滤波器串联而不是并联也很重要(否则会出现相位问题)。

// 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,我不是音频技术人员。
  • 是的。做好 EQ 控制并不像看起来那么容易。 1)将过滤器串联,而不是并联。 2)每个“波段”只需要一个滤波器 - 如果你有一个中心波段,你只需要三个(中间的一个“峰值”滤波器)3)如果你不需要,你不想断开连接到(你不需要)4)低音/高音转换开关只是切换相关搁架滤波器的频率,它不是一个单独的滤波器。
  • 哦,“音调衰减”应该在滤波器频段前使用两个并联增益节点来实现,一个输出连接到目标,另一个连接到滤波器,以设置绕过 - 增益节点之一的值应始终为零,而一个增益节点的值应为 1。(开关应切换哪个节点为零。)这有意义吗?
  • 我正要试一试。我认为这是有道理的,但是我的印象是 gainNode 只能在 0-1 之间。我想情况并非如此。我还想指出,接收器上还有一个响度按钮。我猜响度只会比音调失败为 1 或 0 时提高两个频段的增益。
  • 增益节点可以有任何值。在这种情况下(搁架滤波器), .gain 参数是对搁架的提升 - 所以如果增益为 0,它是一个平坦的响应。如果为 1,则提升货架的等级。如果它是-1,它会降低货架的响应。
【解决方案2】:

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

Web Audio API

从该页面粘贴:

有很多种滤镜可以用来实现特定的效果:

低通滤波器 让声音更沉闷

高通滤波器 让声音更细小

带通滤波器 切断低点和高点(例如,电话过滤器)

低架过滤器 影响声音中的低音量(如立体声音响上的低音旋钮)

高架过滤器 影响声音的高音量(就像立体声音响上的高音旋钮)

峰值过滤器 影响声音中的中音量(如打开的中音旋钮 立体声)

陷波过滤器 去除窄频率范围内不需要的声音

全通滤波器 创建移相器效果

【讨论】:

  • 我猜是高架过滤器......但是随着旋钮的转动,我在增加或减少什么?增益值没有做到这一点。我是否应该同时增加增益和频率以获得正确的效果?增益仅在 0 和 1 之间以浮点数增加,而频率范围很大。
  • 查看您的 Harmon-Kardon 手册,了解高音和低音控件的中心频率。你能用硬编码值成功地影响“音调/eq”吗? (IOW -- 跳过 UI 小部件进行测试)
  • 手册并没有说中心频率是多少。 harmankardon.com/images/media/HK590i_OM_EN.pdf
  • 低音翻转按钮在向上位置时显示“400Hz”。按下位置时为“200Hz”。高音转换在向上位置显示“2kHz”。 “6kHz”在按下位置。由于两个按钮都必须处于向上或向下位置,我猜低音 300Hz 和高音 4kHz 是中心频率?
猜你喜欢
  • 2015-11-09
  • 2020-02-22
  • 2010-12-26
  • 1970-01-01
  • 2015-09-14
  • 2013-01-03
  • 2012-09-13
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多