Advertisement
  1. Code
  2. Media

Merender Spektrum Audio MP3 di Flash dengan computeSpectrum()

Scroll to top
Read Time: 9 min

Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)

Dalam tutorial ini, saya akan mengajarkan Anda cara membuat representasi visual dari spektrum audio file suara, menggunakan metode SoundMixer.computeSpectrum dari Flash. Kita akan menggunakan empat kelas untuk efek ini: Sound, SoundChannel, SoundMixer, dan ByteArray. Saya akan menjelaskan setiap kelas saat kita menggunakannya.


Pratinjau Hasil Akhir

Mari kita lihat hasil akhir yang akan kita jalani:


Klik untuk melihat demo

Langkah 1: Mengatur File Flash Anda

Luncurkan Flash Pro dan buat Dokumen Flash baru. Atur ukuran panggung menjadi 500x300px, warna latar belakang ke #000000, dan frame rate ke 24fps.

Setup Stage Setup Stage Setup Stage

Penyiapan Panggung Di timeline Anda, pilih layer yang ada dan beri nama "Buttons". Kemudian klik Window > Common Libraries > Buttons.

Pilih set tombol favorit Anda, lalu tarik dan lepaskan tombol 'Play' dan 'Stop' ke sudut kanan bawah panggung.

Library-Buttons

Atur nama instance dari tombol ini ke play_btn dan stop_btn, masing-masing.

Langkah 2: Buat Kelas Dokumen

Buat file AS baru, dan simpan sebagai Main.as. Tambahkan kode ini (baca komentar untuk detail lebih lanjut):

Kode ini harus ditempatkan di Kelas baru kita:

1
package  {
2
  import flash.display.Sprite;
3
	import flash.media.Sound; //The Sound class is the first step in working with sound. It is used to load a sound, play a sound, and manage basic sound properties.

4
	import flash.net.URLRequest;
5
	
6
	public class Main extends Sprite {	
7
		private var sound:Sound; 
8
		public function Main() {
9
			sound = new Sound(new URLRequest("sound.mp3")); //assign music to the sound variable.

10
			sound.play(); //play assigned sound.

11
		}
12
	}
13
}

Anda harus meletakkan file MP3 yang disebut sound.mp3 di direktori yang sama dengan direktori output FLA Anda. Setiap MP3 akan dilakukan; yang termasuk dalam unduhan sumber tutorial.


Langkah 3: Kelas Dokumen

Tambahkan nama kelas ke field Kelas di bagian Publish dari panel Properties untuk mengaitkan FLA dengan kelas dokumen Main.

Jika Anda tidak akrab dengan konsep kelas dokumen, periksa Tip Cepat ini sebelum membaca lebih lanjut.

Publish section

Bagian PublishLalu tekan Ctrl+Enter untuk menguji Aplikasi Anda.


Langkah 4: Menangani Suara Menggunakan Tombol

Mari tambahkan instance dari kelas baru: SoundChannel. Kelas ini digunakan untuk menyimpan berbagai suara di saluran audio terpisah; setiap saluran dibuat oleh instance SoundChannel, dan kita menggunakan instance ini untuk mengontrol suara.

1
package  {
2
	import flash.display.Sprite;
3
	import flash.media.Sound;
4
	import flash.media.SoundChannel;
5
	import flash.net.URLRequest;
6
	import flash.events.MouseEvent;
7
	public class Main extends Sprite {
8
		private var sound:Sound;
9
		private var channel:SoundChannel;
10
		
11
		public function Main() {
12
			sound = new Sound(new URLRequest("sound.mp3"));
13
			play_btn.addEventListener(MouseEvent.CLICK,onPlayHandler);
14
			stop_btn.addEventListener(MouseEvent.CLICK,onStopHandler);
15
		}
16
		
17
		private function onPlayHandler(event:MouseEvent):void{
18
			channel = sound.play();
19
		}
20
		
21
		private function onStopHandler(event:MouseEvent):void{
22
			channel.stop();
23
		}
24
	}
25
}

Seperti yang Anda lihat, ketika Play diklik, kita tidak hanya memainkan MP3, kita juga menetapkannya ke SoundChannel. Kita kemudian dapat mengontrol pemutaran melalui instance SoundChannel nanti - dalam hal ini, dengan membuatnya berhenti.


Langkah 5: Membuat Animasi Sederhana

Sekarang mari kita buat beberapa animasi sederhana untuk suara ini, lagi-lagi menggunakan kelas SoundChannel.

1
package  {
2
	import flash.display.Sprite;
3
	import flash.media.Sound;
4
	import flash.media.SoundChannel;
5
	import flash.net.URLRequest;
6
	import flash.events.MouseEvent;
7
	import flash.events.Event;
8
	
9
	public class Main extends Sprite {
10
		
11
		private var sound:Sound;
12
		private var channel:SoundChannel;
13
		
14
		public function Main() {
15
			sound = new Sound(new URLRequest("sound.mp3"));
16
			play_btn.addEventListener(MouseEvent.CLICK,onPlayHandler);
17
			stop_btn.addEventListener(MouseEvent.CLICK,onStopHandler);
18
		}
19
		
20
		private function onPlayHandler(event:MouseEvent):void{
21
			channel = sound.play();//assign sound to channel class 

22
			addEventListener(Event.ENTER_FRAME,animateBars); //render the animation every frame

23
		}
24
		
25
		private function onStopHandler(event:MouseEvent):void{
26
			channel.stop();
27
			graphics.clear();
28
			removeEventListener(Event.ENTER_FRAME,animateBars);//stop rendering the animation

29
		}
30
		
31
		private function animateBars(event:Event):void{
32
			
33
			graphics.clear();
34
			
35
			graphics.beginFill(0xAB300C,1);
36
			//Draw a rectangle whose height corresponds to channel.leftPeak

37
			graphics.drawRect(190,300,50,-channel.leftPeak * 160 );
38
			graphics.endFill();
39
			
40
			graphics.beginFill(0xAB300C,1);
41
			//Draw a rectangle whose height corresponds to channel.rightPeak

42
			graphics.drawRect(250,300,50,-channel.rightPeak  * 160 );
43
			graphics.endFill(); 
44
		}
45
	}
46
}

Properti leftPeak dan rightPeak dari instance SoundChannel sesuai dengan amplitudo suara saat ini, melalui saluran kiri dan kanan. Anggap saja seperti ini: jika Anda memiliki speaker stereo, maka leftPeak adalah volume suara yang keluar dari speaker kiri, dan rightPeak adalah volume suara yang keluar dari speaker kanan.

Anda dapat menekan Ctrl+Enter untuk menguji aplikasi Anda:

Sound Bar AnimationSound Bar AnimationSound Bar Animation

Langkah 6: Apa itu SoundMixer?

Kelas SoundMixer mengontrol semua suara yang tertanam dan streaming dalam aplikasi, untuk semua SoundChannels sekaligus.

Ini memiliki tiga metode: isSoundsInaccessible(), yang menentukan apakah suara apa pun tidak dapat diakses karena alasan keamanan; stopAll(), yang menghentikan pemutaran semua suara; dan computeSpectrum(), yang kita minati untuk tutorial ini. Metode terakhir mengambil "snapshot" dari suara saat ini, dan mendorongnya ke objek ByteArray.


Langkah 7: Apa itu ByteArray?

Kelas ByteArray menyediakan metode dan properti untuk mengoptimalkan membaca, menulis, dan bekerja dengan data biner. Ini menyimpan data sebagai array byte, sesuai namanya. Cari tahu lebih lanjut dengan Pengenalan untuk ByteArray ini.


Langkah 8: Animasi yang Lebih Kompleks

Jadi sekarang mari kita buat animasi yang lebih kompleks menggunakan metode SoundMixer.computeSpectrum(). Sekali lagi, baca komentar di kode untuk sepenuhnya memahami perilakunya:

1
package {
2
	import flash.display.Sprite;
3
	import flash.media.Sound;
4
	import flash.utils.ByteArray;
5
	import flash.events.Event;
6
	import flash.media.SoundMixer;
7
	import flash.filters.GlowFilter;
8
	import flash.net.URLRequest;
9
	import flash.events.MouseEvent;
10
	import flash.media.SoundChannel;
11
12
	public class Main extends Sprite{
13
		private var sound:Sound;
14
		private var channel:SoundChannel;
15
		private var byteArr:ByteArray = new ByteArray();
16
		private var glow:GlowFilter = new GlowFilter();
17
		private var filterArr:Array;
18
		private var line:Sprite = new Sprite();
19
20
		public function Main(){
21
			// create a "glow" effect for the animation we will render

22
			glow.color = 0x009900;
23
			glow.alpha = 1;
24
			glow.blurX = 10;
25
			glow.blurY = 10;
26
			
27
			// load your MP3 in to the Sound object

28
			sound = new Sound(new URLRequest("sound.mp3"));			
29
			// apply the glow effect

30
			filterArr = new Array(glow);
31
			line.filters = filterArr;
32
			addChild(line);
33
			
34
			play_btn.addEventListener(MouseEvent.CLICK,onPlayHandler);
35
			stop_btn.addEventListener(MouseEvent.CLICK,onStopHandler);
36
		}
37
		
38
		private function onPlayHandler(event:MouseEvent):void{
39
			channel = sound.play(0,1000);
40
			addEventListener(Event.ENTER_FRAME,spectrumHandler);
41
		}
42
		
43
		private function onStopHandler(event:MouseEvent):void{
44
			channel.stop();
45
			line.graphics.clear();
46
			removeEventListener(Event.ENTER_FRAME,spectrumHandler);
47
		}
48
49
		private function spectrumHandler(event:Event):void{
50
			line.graphics.clear();
51
			line.graphics.lineStyle(1,Math.random() * 0xFFFFFF);
52
			line.graphics.moveTo(-1,150);
53
			// push the spectrum's bytes into the ByteArray

54
			SoundMixer.computeSpectrum(byteArr);
55
56
			for (var i:uint=0; i<256; i++){
57
				// read bytes and translate to a number between 0 and +300

58
				var num:Number = byteArr.readFloat() * 150 + 150;
59
				//use this number to draw a line

60
				line.graphics.lineTo(i*2,num);
61
			}
62
		}
63
	}
64
}

Bagian terpenting dari kode ini adalah baris 53 dan 57. Di sini, seluruh gelombang suara diterjemahkan ke ByteArray, yang kemudian dibaca, byte demi byte, dan diterjemahkan ke dalam serangkaian angka.

ByteArray akan menjadi float sepanjang 512; di perulangan for, kita hanya membaca 256 float pertama, yang sesuai dengan seluruh gelombang suara dari saluran kiri (suara yang masuk melalui speaker kiri).

Tekan Ctrl+Enter untuk menguji Aplikasi Anda.

Sound Line AnimationSound Line AnimationSound Line Animation

Langkah 9: Mengisi Kesenjangan

Kita dapat mengisi area di bawah garis untuk memberi kita efek yang berbeda:

Complex Drawing AnimationComplex Drawing AnimationComplex Drawing Animation

Yang perlu kita lakukan adalah menggambar kotak dan mengisinya, menggunakan metode graphics. Kode untuk ini adalah sebagai berikut:

1
package {
2
	import flash.display.Sprite;
3
	import flash.media.Sound;
4
	import flash.utils.ByteArray;
5
	import flash.events.Event;
6
	import flash.media.SoundMixer;
7
	import flash.filters.GlowFilter;
8
	import flash.net.URLRequest;
9
	import flash.events.MouseEvent;
10
	import flash.media.SoundChannel;
11
12
	public class Main extends Sprite{
13
		private var sound:Sound;
14
		private var channel:SoundChannel;
15
		private var byteArr:ByteArray = new ByteArray();
16
		private var glow:GlowFilter = new GlowFilter();
17
		private var filterArr:Array;
18
		private var line:Sprite = new Sprite();
19
20
		public function Main(){
21
			glow.color = 0xFF0000;
22
			glow.alpha = 1;
23
			glow.blurX = 10;
24
			glow.blurY = 10;
25
			
26
			sound = new Sound(new URLRequest("sound.mp3"));
27
			
28
			filterArr = new Array(glow);
29
			line.filters = filterArr;
30
			addChild(line);
31
			addChild(play_btn);
32
			addChild(stop_btn);
33
			
34
			play_btn.addEventListener(MouseEvent.CLICK,onPlayHandler);
35
			stop_btn.addEventListener(MouseEvent.CLICK,onStopHandler);
36
		}
37
		
38
		private function onPlayHandler(event:MouseEvent):void{
39
			channel = sound.play(0,1000);
40
			addEventListener(Event.ENTER_FRAME,spectrumHandler);
41
		}
42
		
43
		private function onStopHandler(event:MouseEvent):void{
44
			channel.stop();
45
			line.graphics.clear();
46
			removeEventListener(Event.ENTER_FRAME,spectrumHandler);
47
		}
48
49
		private function spectrumHandler(event:Event):void{
50
			// draw one edge of the box, and specify a fill

51
			line.graphics.clear();
52
			line.graphics.beginFill(0xFF0000,1);
53
			line.graphics.lineStyle(1,0xFF0000);
54
			line.graphics.moveTo(-1,150);
55
			SoundMixer.computeSpectrum(byteArr);
56
57
			for (var i:uint=0; i<256; i++){
58
				var num:Number = byteArr.readFloat() * 200 + 150;
59
				line.graphics.lineTo(i*2,num);
60
			}
61
62
			//draw the rest of the box

63
			line.graphics.lineTo(512,300);
64
			line.graphics.lineTo(0,300);
65
			line.graphics.lineTo(-1,150);
66
		}
67
	}
68
}

Langkah 10: Cobalah Sesuatu yang Berbeda

Kita dapat mengambil gagasan ini lebih jauh, untuk menambahkan efek yang lebih menarik dan kompleks:

Complex Drawing AnimationComplex Drawing AnimationComplex Drawing Animation

Dalam hal ini, kita akan menggambar dua spektrum di atas satu sama lain, satu untuk saluran kiri dan satu untuk kanan. Untuk mencapai ini, kita akan menggunakan dua perulangan for yang masing-masing membaca 256 float, satu demi satu.

1
package {
2
	import flash.display.Sprite;
3
	import flash.media.Sound;
4
	import flash.utils.ByteArray;
5
	import flash.events.Event;
6
	import flash.media.SoundMixer;
7
	import flash.filters.GlowFilter;
8
	import flash.net.URLRequest;
9
	import flash.events.MouseEvent;
10
	import flash.media.SoundChannel;
11
12
	public class Main extends Sprite{
13
		private var sound:Sound;
14
		private var channel:SoundChannel;
15
		private var byteArr:ByteArray = new ByteArray();
16
		private var glow:GlowFilter = new GlowFilter();
17
		private var filterArr:Array;
18
		private var line:Sprite = new Sprite();
19
		private var num:Number;
20
		public const GRAFT_HEIGHT:int = 150; //set animation height

21
		public const CHANNEL_SIZE:int = 256; //set left/right channel size

22
23
		public function Main(){
24
			glow.color = 0x009900;
25
			glow.alpha = 1;
26
			glow.blurX = 10;
27
			glow.blurY = 10;
28
			
29
			sound = new Sound(new URLRequest("sound.mp3"));
30
			
31
			filterArr = new Array(glow); //add glow to the animation

32
			line.filters = filterArr;
33
			addChild(line);
34
			
35
			play_btn.addEventListener(MouseEvent.CLICK,onPlayHandler);
36
			stop_btn.addEventListener(MouseEvent.CLICK,onStopHandler);
37
		}
38
		
39
		private function onPlayHandler(event:MouseEvent):void{
40
			channel = sound.play(0,1000); // play sound 1000 times

41
			addEventListener(Event.ENTER_FRAME,spectrumHandler);
42
		}
43
		
44
		private function onStopHandler(event:MouseEvent):void{
45
			channel.stop();
46
			line.graphics.clear();
47
			removeEventListener(Event.ENTER_FRAME,spectrumHandler);
48
		}
49
50
		private function spectrumHandler(event:Event):void{
51
			num = 0;
52
			
53
			line.graphics.clear(); // create current graphics

54
			line.graphics.lineStyle(0, 0x00FF00);
55
			line.graphics.beginFill(0x00FF00,0.5);
56
			line.graphics.moveTo(0,GRAFT_HEIGHT);
57
			
58
			SoundMixer.computeSpectrum(byteArr);// add bytes to Sound mixer

59
			
60
			for (var i:int = 0; i < CHANNEL_SIZE; i++) {
61
                		num = (byteArr.readFloat() * GRAFT_HEIGHT);
62
                		line.graphics.lineTo(i * 2, GRAFT_HEIGHT - num);
63
            		}
64
			
65
			line.graphics.lineTo(CHANNEL_SIZE * 2, GRAFT_HEIGHT);
66
			line.graphics.endFill();
67
			 
68
			line.graphics.lineStyle(0, 0xFF0000);
69
			line.graphics.beginFill(0xFF0000, 0.5);
70
			line.graphics.moveTo(CHANNEL_SIZE * 2,GRAFT_HEIGHT);
71
			 
72
			for (i = CHANNEL_SIZE; i > 0; i--) {
73
				num = (byteArr.readFloat() * GRAFT_HEIGHT);
74
				line.graphics.lineTo(i * 2, GRAFT_HEIGHT - num);
75
			}
76
			
77
			line.graphics.lineTo(0, GRAFT_HEIGHT);
78
			line.graphics.endFill();
79
		}
80
	}
81
}

Kesimpulan

Jadi kita telah belajar cara menggunakan berbagai kelas Sound, dan cara membuat animasi gambar suara yang indah menggunakan SoundMixer.

Terima kasih telah meluangkan waktu untuk membaca artikel ini, karena ini adalah tutorial pertama saya. Jika Anda memiliki pertanyaan, silakan tinggalkan komentar.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.