Generowanie dźwięku w JavaScript

How to generate sound in JavaScript?

Jak stworzyć dźwięki w JavaScript?

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:


oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);

 

Teraz można ustawić rodzaj fali (np. sine, square, sawtooth, triangle lub custom), częstotliwość dźwięku (w hertzach) oraz głośność:


oscillator.type = "sine";
oscillator.frequency.value = 440;
gainNode.gain = 1;
oscillator.start();

 

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:

See the Pen Generating sound in JavaScript – continuous uninterrupted sound by Joanna (@JoannaEl) on CodePen.0

Ponieważ metody oscillator.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.

See the Pen Generating sound in JavaScript – on button click by Joanna (@JoannaEl) on CodePen.0

 

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:

See the Pen Generating sound in JavaScript – on button click -part II by Joanna (@JoannaEl) on CodePen.0

 

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);

See the Pen Generating sound in JavaScript – continuous uninterrupted sound by Joanna (@JoannaEl) on CodePen.0

 

Zmiana częstotliwości dźwięku podczas jego trwania wygląda i brzmi tak:


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 + 2);
oscillator.start(now);
oscillator.stop(now + 2);

oscillator.type = "triangle";
oscillator.frequency.setValueAtTime(250, context.currentTime + 0.2);
oscillator.frequency.setValueAtTime(220, context.currentTime + 0.4);
oscillator.frequency.setValueAtTime(350, context.currentTime + 0.6);
oscillator.frequency.setValueAtTime(370, context.currentTime + 0.8);

See the Pen Generating sound in JavaScript – change frequency value by Joanna (@JoannaEl) on CodePen.0

 

Teraz generowanie prostych dźwięków na stronie internetowej, w mini grze lub aplikacji nie będzie już problemem 😉

 

Joanna

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *