Я играю mp3-файл через плеер Tone.js, и мне нужно играть только с определенным диапазоном частот из этого файла. Этот диапазон динамически выбирается пользователем, и пользователь должен иметь возможность изменять его, не останавливая воспроизведение. Одновременно Tone.js воспроизводит синтезированные заметки. В настоящее время я использую фильтры полосы пропускания/lowpass/highpass, но, насколько я понимаю, они не строят частоты за пределами выбранного диапазона, а вместо этого плавно уменьшают коэффициент усиления, как показано красной линией на графике ниже, что я В некоторых учебных пособиях. Вот мой фрагмент кода:Фильтрация частот веб-аудио
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 библиотеки?