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:
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.



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.

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.

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:



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.



Langkah 9: Mengisi Kesenjangan
Kita dapat mengisi area di bawah garis untuk memberi kita efek yang berbeda:



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:



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.