我正在努力学习如何正确使用网络音频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%时会略微增加音量...但我不认为这是正确的功能我是试图完成。
答案 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)
以下显示了一些建议,用于选择用于各种目的的过滤器类型:
从该页面粘贴:
有许多种过滤器可用于实现某些效果:
低通滤镜 让声音更加低沉
高通过滤器 让声音更加细腻
带通滤镜 削减低点和高点(例如电话过滤器)
低架过滤器 影响声音中的低音量(如立体声中的低音旋钮)
高架过滤器 影响声音中的高音量(如立体声中的高音旋钮)
峰值过滤器 影响声音中的中音量(如中音旋钮) 立体声)
陷阱过滤器 在较窄的频率范围内删除不需要的声音
全通过滤器 创建移相器效果