Proste dźwięki do gier w JavaScript

Generowanie dźwięków w grach za pomocą JavaScriptu

W poprzednim artykule Generowanie dźwięku w JavaScript pokazałam, w jaki sposób można samodzielnie stworzyć pojedyncze dźwięki, by wykorzystać je np. w swoich grach. W tym artykule pokażę, jak stworzyć proste dźwięki będące krótkimi muzyczkami, które można wykorzystać np. przy zmianie levelu.

Oto kod, który odgrywa przykładową melodyjkę:


const audioContext = new (window.AudioContext || window.webkitAudioContext)();
	
let New_sound = {
   song: "fffbzfbzz",
   counting: 0,
   scale: {
	f: 349.23,
	b: 493.88,
	z: 0
   },
		
   create() {
	this.oscillator = audioContext.createOscillator();
	this.gainNode = audioContext.createGain();
	this.oscillator.connect(this.gainNode);
	this.gainNode.connect(audioContext.destination);
   },
		
   new_sound(wave, Hz, volume) {
	let now = audioContext.currentTime
	this.oscillator.type = wave;
	this.oscillator.frequency.value = Hz;
	this.gainNode.gain.value = volume;
	this.gainNode.gain.setValueAtTime(1, audioContext.currentTime);
	this.gainNode.gain.exponentialRampToValueAtTime(0.11, now + 1.5);
   }, 
	
   play_sound() {
	const now = audioContext.currentTime;
	if (this.counting == this.song.length) {
		this.counting = 0;
		return;
	}
	if ( this.counting < this.song.length) { 
            let note = this.song.charAt(this.counting); 
            let Hz = this.scale[note]; 
            this.create(); 
            this.new_sound("square", Hz, 1); 
            this.oscillator.start(now); 
            this.counting += 1; } 
            // Aby this w setTimeout odnosiło się do obiektu, a nie do jego metody, trzeba zastosować funkcję strzałkową 
            setTimeout(() => {
		this.oscillator.stop(now + 1.5);
		this.oscillator.disconnect(this.gainNode);
		this.gainNode.disconnect(audioContext.destination);
		let loop = this.play_sound();
	}, 220);
   }
}

New_sound.play_sound();

Najpierw stworzyłam kontekst audio, a następnie obiekt New_sound, który zawiera cały kod melodyjki. Wartość song zawiera nuty melodyjki, a ich wartości wyrażone w Hertzach znajdują się w scale. Counting to licznik nut. W metodzie create stworzyłam oscylator i regulację głośności oraz połączyłam je z kontekstem audio. New_sound przechowuje ustawienia fali dźwiękowej, jak częstotliwość, poziom głośności, typ fali i jej rozłożenie w czasie. W metodzie play_sound zastosowana jest pętla, która odgrywa każdą nutę. W efekcie uzyskujemy melodyjkę zmiany levelu:

Powyższy dźwięk wykorzystałam w mojej grze Lost In Blocks, o której napiszę później 😉

No dobrze, skąd wziąć nuty? Możesz ułożyć je samodzielnie lub poszukać w internecie. A skąd wziąć odpowiadające im częstotliwości? Na przykład ze strony: pages.mtu.edu

(„Middle C” is C4 )

NoteFrequency (Hz)Wavelength (cm)
C016.352109.89
 C#0/Db017.321991.47
D018.351879.69
 D#0/Eb019.451774.20
E020.601674.62
F021.831580.63
 F#0/Gb023.121491.91
G024.501408.18
 G#0/Ab025.961329.14
A027.501254.55
 A#0/Bb029.141184.13
B030.871117.67
C132.701054.94
 C#1/Db134.65995.73
D136.71939.85
 D#1/Eb138.89887.10
E141.20837.31
F143.65790.31
 F#1/Gb146.25745.96
G149.00704.09
 G#1/Ab151.91664.57
A155.00627.27
 A#1/Bb158.27592.07
B161.74558.84
C265.41527.47
 C#2/Db269.30497.87
D273.42469.92
 D#2/Eb277.78443.55
E282.41418.65
F287.31395.16
 F#2/Gb292.50372.98
G298.00352.04
 G#2/Ab2103.83332.29
A2110.00313.64
 A#2/Bb2116.54296.03
B2123.47279.42
C3130.81263.74
 C#3/Db3138.59248.93
D3146.83234.96
 D#3/Eb3155.56221.77
E3164.81209.33
F3174.61197.58
 F#3/Gb3185.00186.49
G3196.00176.02
 G#3/Ab3207.65166.14
A3220.00156.82
 A#3/Bb3233.08148.02
B3246.94139.71
C4261.63131.87
 C#4/Db4277.18124.47
D4293.66117.48
 D#4/Eb4311.13110.89
E4329.63104.66
F4349.2398.79
 F#4/Gb4369.9993.24
G4392.0088.01
 G#4/Ab4415.3083.07
A4440.0078.41
 A#4/Bb4466.1674.01
B4493.8869.85
C5523.2565.93
 C#5/Db5554.3762.23
D5587.3358.74
 D#5/Eb5622.2555.44
E5659.2552.33
F5698.4649.39
 F#5/Gb5739.9946.62
G5783.9944.01
 G#5/Ab5830.6141.54
A5880.0039.20
 A#5/Bb5932.3337.00
B5987.7734.93
C61046.5032.97
 C#6/Db61108.7331.12
D61174.6629.37
 D#6/Eb61244.5127.72
E61318.5126.17
F61396.9124.70
 F#6/Gb61479.9823.31
G61567.9822.00
 G#6/Ab61661.2220.77
A61760.0019.60
 A#6/Bb61864.6618.50
B61975.5317.46
C72093.0016.48
 C#7/Db72217.4615.56
D72349.3214.69
 D#7/Eb72489.0213.86
E72637.0213.08
F72793.8312.35
 F#7/Gb72959.9611.66
G73135.9611.00
 G#7/Ab73322.4410.38
A73520.009.80
 A#7/Bb73729.319.25
B73951.078.73
C84186.018.24
 C#8/Db84434.927.78
D84698.637.34
 D#8/Eb84978.036.93
E85274.046.54
F85587.656.17
 F#8/Gb85919.915.83
G86271.935.50
 G#8/Ab86644.885.19
A87040.004.90
 A#8/Bb87458.624.63
B87902.134.37

Źródło: pages.mtu.edu