Web Audio API,设置高音和低音

4
我正在尝试学习如何正确使用Web音频API,但遇到了一些困惑。 在我的项目中,我正在尝试复制旧的1982年Harman/Kardon接收器的功能。 (点击链接查看照片) 这个接收器有单独的旋钮控制高音和低音。在这个问题中,我只处理高音。我相信一旦指导方向,我就能找出低音的等效方法。 在初始化函数中,我创建上下文和过滤器节点。
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的范围。 这是我用于高音表盘的当前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种类型? (“lowpass”,“highpass”,“bandpass”,“lowshelf”,“highshelf”,“peaking”,“notch”,“allpass”) 我猜想应该是 highpass 或 highself。

我应该设置什么频率?

当拨号旋转时,gain.value 应该是动态的吗?

我完全走错了方向吗?

我将 gain.value 设置为高音变量值,当调到100%时似乎会略微增加音量...但我不认为这是我试图实现的正确功能。


2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8

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

我认为你正在考虑的HK放大器没有中音控制-这有点奇怪,但没关系。低音滤波器可能是低架,而高音则是高架;按钮控制每个的截止频率。请记住,架式滤波器在零增益时具有平坦响应-您可以在http://googlechrome.github.io/web-audio-samples/samples/audio/frequency-response.html上玩弄滤波器,看看它们会是什么样子。选择低架,频率=〜200,然后调整增益。

因此,例如,您接近高音滤波器,除了“高音”和“低音”增益值不应该变为[0,1] - 它应该在[-maxgain,+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,我不是一个音频技术人员。 - Livi17
是的。做好EQ控制并不像看起来那么容易。1)将滤波器串联而非并联。2)每个“频段”只需要一个滤波器——如果你有一个中心频段,你只需要三个(一个用于中间的“峰值”滤波器)。3)如果不需要断开连接,就不要断开连接(也确实不需要)。4)低音/高音翻转开关只是切换相关货架滤波器的频率,它不是一个单独的滤波器。 - cwilso
哦,还有,“音调打败”应该通过在滤波器带前并联两个增益节点来实现,其中一个的输出连接到目标,另一个连接到滤波器,以建立一个旁路 - 一个增益节点应该始终为零,而另一个应该为1。(开关应该切换哪个节点为零。)这样说清楚了吗? - cwilso
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Livi17
我知道我在test.html中做错了什么...我根本没有用低音和高音按钮改变gain.values。无论您单击什么,我都将其设置为0。这似乎最符合我的接收器功能: http://aceroinc.ca/harmanKardon/test2.html - Livi17
显示剩余3条评论

2
以下是关于选择不同滤波器类型用于不同目的的建议: 从以下页面中复制:Web Audio API 引用如下: 有许多种滤波器可用于实现某些特定效果: 低通滤波器:使声音更加沉闷。 高通滤波器:使声音更加尖锐。 带通滤波器:截断低频和高频(例如,电话滤波器)。 低架滤波器:影响声音中低音的数量(就像立体声上的低音旋钮一样)。 高架滤波器:影响声音中高音的数量(就像立体声上的高音旋钮一样)。 尖峰滤波器:影响声音中的中音数量(就像立体声上的中音旋钮一样)。 陷波滤波器:在窄频率范围内消除不需要的声音。 全通滤波器:创建相位移效果。

我猜测是高架滤波器...但是旋钮的转动会增加或减少什么?增益值并不能做到这一点。我是否应该同时增加增益和频率以获得正确的效果?增益只能在0到1之间作为浮点数增加,而频率具有巨大的范围。 - Livi17
查看您的Harmon-Kardon手册以获取高音和低音控件的中心频率。您能够成功地使用硬编码值来影响“音调/均衡”吗?(换言之 - 跳过UI小部件进行测试) - David Tansey
手册没有说明中心频率是多少。http://www.harmankardon.com/images/media/HK590i_OM_CN.pdf - Livi17
低音翻转按钮在上方位时显示“400Hz”,在按下位时显示“200Hz”。高音翻转在上方位时显示“2kHz”,在按下位时显示“6kHz”。由于两个按钮都必须处于上或下位置,因此我猜测低音为300Hz,高音为4kHz是中心频率? - Livi17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,