我通过Tone.js的播放器播放mp3文件,我需要播放此文件中的某些频率范围。该范围由用户动态选择,用户应该能够在不停止播放的情况下进行更改。同时Tone.js播放合成音符。目前,我使用带通/低通/高通滤波器,但据我所知,它们不会严格切割超出所选范围的频率,而是平滑地降低其增益,如下图中的红线所示我在一些教程中找到了。这是我的代码:
function applyLimits([min,max]) {
minFreq = min > max ? Number.NEGATIVE_INFINITY : min;
maxFreq = min > max ? Number.POSITIVE_INFINITY : max;
if (mp3Player) {
if (minFreq == Number.NEGATIVE_INFINITY && maxFreq == Number.POSITIVE_INFINITY) {
if (mp3Filter) {
mp3Filter.dispose();
mp3Player.toMaster();
mp3Filter = null;
}
}
else {
if (!mp3Filter) {
mp3Player.disconnect();
mp3Filter = new Tone.Filter();
mp3Player.chain(mp3Filter, Tone.Master);
}
if (minFreq != Number.NEGATIVE_INFINITY && maxFreq != Number.POSITIVE_INFINITY) {
let centerFrequency = Math.sqrt(maxFreq * minFreq);
let q = centerFrequency / (maxFreq - minFreq);
mp3Filter.set({frequency: centerFrequency, Q: q, type: 'bandpass', rolloff: -96});
}
else if (minFreq != Number.NEGATIVE_INFINITY) {
mp3Filter.set({frequency: minFreq, Q: 1, type: 'highpass', rolloff: -96});
}
else {
mp3Filter.set({frequency: maxFreq, Q: 1, type: 'lowpass', rolloff: -96});
}
}
}
}
绿线说明了我需要的东西。看看Tone.js源代码,我可以看到Tone.js使用了级联双二阶滤波器。但是使用甚至10个级联滤波器将导致曲线,而不是精确切割。此外,根据该图,该范围内的频率也受到影响。
如何使用Tone.js,Web Audio API或任何其他js库实现此类效果?
答案 0 :(得分:1)
绿线如果是真正垂直的,则在物理上是不可实现的。您可以做的最好的事情是将一堆双二阶段(小心地)级联起来以产生近似值。或者使用IIRFilterNode(如果可用)进行过滤。