Web Audio API,设置高音和低音

时间:2015-03-17 21:50:12

标签: javascript web-audio

我正在努力学习如何正确使用网络音频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之间变化。

这是我用于高音拨号的当前mousemove功能:

.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种类型中的哪一种? ("低通","高通","带通"," lowshelf"," highshelf&#34 ;,"峰值","缺口","全通") 我猜测它是高通或高通。

我应该设置什么频率?

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

我是否走错了方向?

我将gain.value设置为高音变量值,看起来它在转向100%时会略微增加音量...但我不认为这是正确的功能我是试图完成。

2 个答案:

答案 0 :(得分:7)

我不确定你为什么要创造六种不同的滤镜 - 你应该只需要两个,一个用于高音,一个用于低音。

认为你正在看的HK放大器没有中频控制 - 这有点奇怪,但还可以。低音滤波器可能是低架子,高音架子很高;按钮控制每个的截止频率。请记住,搁架滤波器在零增益时是平坦响应 - 您可以在http://googlechrome.github.io/web-audio-samples/samples/audio/frequency-response.html处使用滤波器来查看它们的外观。选择低架子,freq = ~200,然后使用增益进行播放。

所以,例如,您使用高音滤波器关闭,除了高音"高音"和贝斯"贝斯"增益值不应该[0,1] - 它应该介于[-maxgain,+ maxgain]之间。 "最大增益"可能是2-3?你必须要玩它并选择一个好的范围 - 我在香港手册(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进行实时更改。

答案 1 :(得分:1)

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

Web Audio API

从该页面粘贴:

  

有许多种过滤器可用于实现某些效果:

     

低通滤镜   让声音更加低沉

     

高通过滤器   让声音更加细腻

     

带通滤镜   削减低点和高点(例如电话过滤器)

     

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

     

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

     

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

     

陷阱过滤器   在较窄的频率范围内删除不需要的声音

     

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