2016-04-16 4 views
2

Я играю 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 каскадных фильтров приведет к кривой, а не к точному разрезанию. Кроме того, согласно этому графику также влияют частоты в пределах диапазона.

The graph

Как можно добиться такого эффекта с помощью Tone.js, Web Audio API или любой другой JS библиотеки?

ответ

1

Зеленая линия, если она действительно вертикальна, физически неосуществим. Лучшее, что вы можете сделать, - это объединить кучу биквадов (осторожно), чтобы получить приближение. Или используйте IIRFilterNode (если есть), чтобы выполнить фильтрацию.

 Смежные вопросы

  • Нет связанных вопросов^_^