2015-05-05 35 views
6

I zostały rozglądać się za tworzenie korektora dźwięku za pomocą interfejsu API Web Audio: http://webaudio.github.io/web-audio-api/Web API dźwięku korektor

Znalazłem wiele wątków dotyczących tworzenia wizualizera, ale to oczywiście nie to, co chcę zrobić . Po prostu chcę mieć możliwość zmiany dźwięku za pomocą suwaków częstotliwości. Zauważyłem, że BiquadFilter powinien wykonać pracę, ale nie mogę uzyskać dobrego wyniku. Dźwięk zmienia się konsekwentnie, gdy zmieniam jakąkolwiek wartość częstotliwości, ale po prostu obniża jakość dźwięku, a jednocześnie powinien zmieniać częstotliwości.

I najpierw załadować dźwięk:

Audio.prototype.init = function(callback){ 
    var $this = this; 
    this.gainScale = d3.scale.linear().domain([0,1]).range([-40,40]); 
    this.context = new AudioContext(); 
    this.loadSounds(function(){ 
     $this.loadSound(0); 
     $this.play(); 
     callback.call(); 
    }); 
}; 

Wszystko działa dobrze, dźwięk odtwarzany, gdy gotowe.

Mam 10 suwaków dla częstotliwości [32,64,125,250,500,1000,2000,4000,8000,16000]. Dla każdego suwaka utworzyć filtr i podłączyć go do źródła, jak opisano tutaj: Creating a 10-Band Equalizer Using Web Audio API:

Audio.prototype.createFilter = function(index,frequency){ 
    if(this.filters == undefined) this.filters = []; 
    var filter = this.context.createBiquadFilter(); 
    filter = this.context.createBiquadFilter(); 
    filter.type = 2; 
    filter.frequency.value = frequency; 
    // Connect source to filter, filter to destination. 
    this.source.connect(filter); 
    filter.connect(this.context.destination); 
    this.filters[index] = filter; 
}; 

Wreszcie, kiedy zmienić wartość suwaka zaktualizować filtr:

Audio.prototype.updateFilter = function(index,newVal){ 
    this.filters[index].frequency.gain = this.gainScale(newVal); 
}; 

NB: Moja funkcja to.gainScale przyjmuje jako wartość wejściową wartość [0,1] i zwraca wartość w [-4040], aby ustawić wzmocnienie między -40 a 40 dla każdej częstotliwości.

Doceniam każdą pomoc!

Odpowiedz

9

Wiele rzeczy tutaj.

1) Nie należy używać równolegle filtrów pasmowych do realizacji korektora. Pomijając inne kwestie, filtrowanie dwukierunkowe zmienia fazę różnych części sygnału, a zatem różne pasma będą kończyły się w różnych fazach, a ty będziesz miał potencjalnie całkiem zły wpływ na twój dźwięk, kiedy się zrekomplikuje.

2) Podejście, które chcesz mieć, to filtr o niskiej półce na dolnym końcu, filtr wysokiej półki na górnym końcu i dowolna liczba filtrów szczytowych w środku. Powinny one być połączone szeregowo (tzn. Sygnał wejściowy łączy się z jednym filtrem, który łączy się z innym filtrem, który łączy się z innym filtrem, i innym, i tylko końcowy filtr powinien zostać podłączony do audiocontext.destination. dostrojone (patrz poniżej), a wzmocnienie filtru określa wzmocnienie/cięcie (dla płaskiej odpowiedzi wszystkie wzmocnienia filtra powinny być ustawione na zero.)

3) filter.type to typ wyliczeniowy, który należy ustawić jako ciąg, a nie jako liczba. "Lowshelf", "highshelf" i "peaking" to te, których szukasz.

Możesz zobaczyć przykład prostego, trójpasmowego equalizera w mojej aplikacji DJ - https://github.com/cwilso/wubwubwub/blob/MixTrack/js/tracks.js#L189-L207 to ustawia. Aby zmienić to w korektor wielobranżowy, musisz poprawić wartość Q każdego filtru, aby pasma nie nakładały się zbyt mocno (nie jest źle, jeśli nakładają się, ale twoje pasma będą bardziej precyzyjne, jeśli je dostroisz) . Możesz użyć http://googlechrome.github.io/web-audio-samples/samples/audio/frequency-response.html, aby sprawdzić odpowiedź częstotliwościową dla danego Q i typu filtra.

+1

Witam, bardzo dziękuję, naprawił większość moich problemów i zaczął brzmieć jak coś nie tak złego. Zasadniczo właśnie teraz tworzę filtry bez typu i bez ich łączenia. Następnie podaję typ według indeksu filtra (0: półka, 0 Charles

+0

A co z łączeniem filtra półkowego i górnoprzepustowego dla każdej częstotliwości? –

+0

Na przykład, jeśli chcesz zmodyfikować 250 herców, dodaj dolną klapę w 350, aby wyciąć wszystko powyżej 350 i drugą górną półkę w 150, aby wyciąć wszystko poniżej 150. Połącz oba wzmocnienia i zmodyfikuj ich wartości naraz? Czy myślisz, że to zadziała? –

0

Jednym z problemów jest to, że chcesz, aby suwaki kontrolowały wzmocnienie filtra na danej częstotliwości, a nie samą częstotliwość filtra. Według specyfikacji wzmocnienie filtra pasmowego nie jest sterowalne, co jest nieco ograniczające. Na szczęście możesz umieścić węzeł wzmocnienia na końcu każdego filtra.

var filter = this.context.createBiquadFilter(); 
filter = this.context.createBiquadFilter(); 
filter.type = 2; 
filter.frequency.value = frequency; 

var gain = this.context.createGainNode(); 

// Connect source to filter, filter to the gain, gain to destination. 
this.source.connect(filter); 
filter.connect(gain); 
gain.connect(this.context.destination); 
this.filters[index] = filter; 
this.gains[index] = gain; 

Następnie należy podłączyć suwak do parametru wzmocnienia kontroli wzmocnienia. Tak naprawdę nie znam dźwięku w Internecie, więc zostawię to tobie. Ostatnią rzeczą jest to, że musisz podać Q filtru. Mam wrażenie z twojej listy częstotliwości, że próbujesz stworzyć filtry o szerokości oktawy, więc współczynnik Q prawdopodobnie wyniesie około 1,414. Naprawdę będziesz musiał przeprowadzić trochę badań, jeśli chcesz to naprawić.

+0

Dzięki za odpowiedź. Masz rację, był błąd. Ale nie ma poprawy po mojej stronie – Charles

+0

@Charles. Zobacz moje zmiany. – jaket

+0

W rzeczywistości wygląda na to, że działa. Właśnie wprowadziłem modyfikacje sugerowane przez @ cwilso i działa całkiem dobrze, bez użycia dodatkowego gainNode – Charles