Robiąc małą grę w JavaScript chciałam wygenerować w niej krótkie dźwięki, imitujące strzelanie, zderzenie z przeszkodą, zmianę levelu itp. Wykorzystałam w tym celu Web Audio API, co pozwoliło mi samodzielnie stworzyć „melodyjki” potrzebne w grze. Poniżej pokażę Ci, w jaki sposób samodzielnie możesz stworzyć własne dźwięki za pomocą JavaScript 😉
W pierwszej kolejności trzeba utworzyć kontekst audio, który będzie sterował wszystkimi procesami tworzenia dźwięku:
let audioContext = new AudioContext();
Aby kod działał poprawnie we wszystkich przeglądarkach możesz użyć:
let audioContext = new (window.AudioContext || window.webkitAudioContext)();
Następnie należy stworzyć źródło dźwięku – w tym przypadku będzie to oscylator (matematycznie obliczony dźwięk), który reprezentuje mi.in rodzaj i częstotliwość fali dźwiękowej.
(Inne źródła dźwięku to np. dźwięk pobrany ze źródła audio/video lub audio stream – dźwięk z kamerki internetowej lub mikrofonu. Tutaj skupiamy się jednak na oscylatorze).
let oscillator = audioContext.createOscillator();
Można również dodać metodę, która kontroluje głośność dźwięku:
let gainNode = audioContext.createGain();
Aby całość działała poprawnie, trzeba utworzone metody połączyć ze sobą i z kontekstem audio. Można to zrobić w sposób:
Powyższy przykład wygeneruje nam ciągły, nieustający dźwięk. Jeśli chcemy uzyskać możliwość kontroli nad włączaniem i wyłączaniem dźwięku, musimy podpiąć metody oscillator.start(); i oscillator.stop(); pod przyciski:
Ponieważ metodyoscillator.start();można użyć tylko raz, dźwięk po zastopowaniu nie odtworzy się ponownie.
Aby móc odtwarzać dźwięk wielokrotnie, przy pomocy przycisków START i STOP, musimy generować nową falę dźwiękową za każdym razem, kiedy kliknięty zostanie przycisk START.
Gdy wiemy już, jak wygenerować prosty dźwięk, możemy pobawić się zmieniając typ i częstotliwość fali. Spróbuj ustawić wyższe lub niższe tony i zciszyć/zgłośnić dźwięk, a także wybrać rodzaj fali:
Możemy też wygenerować dźwięk, który trwa tylko chwilę:
let audioContext = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
oscillator.type = "sine";
oscillator.frequency.value = 440;
const now = audioContext.currentTime;
gainNode.gain.setValueAtTime(10, now);
gainNode.gain.exponentialRampToValueAtTime(0.11, now + 1);
oscillator.start(now);
oscillator.stop(now + 1);
Zmiana częstotliwości dźwięku podczas jego trwania wygląda i brzmi tak:
Teraz generowanie prostych dźwięków na stronie internetowej, w mini grze lub aplikacji nie będzie już problemem 😉
Author: Joanna
Piszę kody, które (zazwyczaj) działają. Tresuję Wordpressa, kodzę z Reactem, zgłębiam świat DevOps i klikam w konsoli Linuxa. Hobbystycznie optymalizuję kod, bo lenistwo to najczystsza forma produktywności. Staram się nie zwariować między bugiem a deadlinem.