Advertisement
  1. Code
  2. Effects

Mulai pemrograman Audio dalam AS3

Scroll to top
Read Time: 34 min

Indonesian (Bahasa Indonesia) translation by Keti Pritania (you can also view the original English article)

Flash Player 10 memperkenalkan baru rendah api untuk memanipulasi audio dengan AS3. Dalam tutorial ini, Anda akan belajar tentang api dan bagaimana mereka bekerja, dan menggunakan mereka untuk menciptakan sebuah aplikasi sederhana yang dapat memainkan mp3 secara terbalik.

Klik di sini untuk melihat preview SWF kita akan membangun dalam tutorial ini. Klik pada tombol "Putar" untuk memainkan suara. Anda benar-benar tidak bisa mengatakan dengan melihat atau mendengar untuk itu, tapi ini tidak hanya MP3 dimuat dan kemudian dimainkan normal; MP3 sedang digunakan sebagai sumber suara dan sampel diberi secara dinamis untuk mesin suara. Untuk membantu membuktikan hal itu, "Mundur" tombol akan memainkan suara yang sama, hanya secara terbalik. Ada tidak ada sulap tangan di sini: ada hanya satu MP3 dimuat dan efek pembalikan dihitung pada terbang.


Langkah 1: Bermain suara: cara Olde

Pertama, mari kita membuat yakin kita sampai dengan kecepatan pada metode pra-Flash 10 loading dan bermain MP3. Yang mengatakan, metode ini masih bekerja di Flash 10 dan naik, tetapi kita akan menjelajahi sebuah metode yang lebih maju dan lebih kuat dalam tutorial. Jika Anda membaca tutorial ini untuk spesifik dari metode yang lebih maju, dan merasa Anda memiliki pemahaman yang kuat tentang metode tradisional, merasa bebas untuk beralih ke langkah "suara bermain: cara Neue."

Metode umum untuk proses ini adalah sebagai berikut:

  1. Membuat objek suara.
  2. Load file MP3 yang menggunakan metode memuat objek suara.
  3. Setelah MP3 dimuat, mulai pemutaran dengan memanggil metode play.
  4. Ketika Anda menelepon bermain, pastikan untuk menyimpan objek SoundChannel Anda akan mendapatkan kembali.
  5. Ketika / jika Anda perlu untuk menghentikan suara, atau menyesuaikan volume panning, memanggil metode yang sesuai pada objek SoundChannel.

Untuk memulai, mari kita membuat sebuah proyek dasar.

  • Buat ActionScript 3 FLA baru dan Simpan ke folder proyek.
  • Membuat dokumen kelas untuk pergi bersama dengan Fla Itu adalah, membuat file ActionScript 3.0 baru, dan menyimpannya sebagai "TraditionalSound.as" dalam folder yang sama sebagai fla Anda
  • Jika Anda memerlukan beberapa kelas boilerplate, masukkan ini ke dalam file kelas baru Anda:

Selanjutnya, kita akan berjalan melalui langkah-langkah lima (yang diuraikan di atas) terlibat dalam loading dan memainkan suara.


Langkah 2: Membuat objek suara

Membuat sebuah contoh properti jenis suara file kelas:

Dan kemudian instantiate di konstruktor.


Langkah 3: Load MP3 File

Untuk memuat file, Panggil metode load objek suara dan lulus dalam URLRequest yang menunjukkan file MP3 untuk memuat.

Sementara kita loading suara, kita juga dapat menambahkan pendengar acara "lengkap". Anda dapat menguji film sekarang, dan dengan asumsi Anda menunjuk metode load file MP3 yang valid, Anda akan melihat jejak segera setelah beban:


Juga mencatat bahwa Idealnya Anda akan hook up IOErrorEvent.IO_ERROR pendengar acara, juga, untuk situasi di mana MP3 file gagal untuk memuat.


Langkah 4: Mulai pemutaran

Dimungkinkan untuk memulai pemutaran suara sebelum itu telah terisi penuh, tetapi untuk tujuan kita, kita akan tetap dengan menunggu sampai itu. Jadi, dalam metode onSoundLoad, memberitahu suara untuk bermain.

Uji film sekarang, dan Anda harus mendengar suara Anda.


Langkah 5: Objek SoundChannel

Sekarang setelah Anda memainkan suara, mungkin Anda ingin mengendalikannya lebih lanjut: hentikan, sesuaikan volume, dll. Jika ini adalah pertama kalinya Anda telah bekerja dengan audio di flash, Anda mungkin akan terkejut untuk mengetahui bahwa tidak ada metode berhenti pada objek suara, atau apakah ada cara untuk mengontrol volume atau wajan setelah suara telah mulai bermain. Sebaliknya, ada sebuah objek SoundChannel yang mengurus fungsi-fungsi ini. Anda membuat objek SoundChannel dengan memanggil Sound.play, yang tidak hanya mulai pemutaran audio tetapi juga mengembalikan objek SoundChannel yang bermain audio. Jadi, pertama kita perlu sebuah properti di mana untuk menyimpan objek SoundChannel:

Maka kita perlu mengubah kode pemutaran kita untuk menyimpan objek SoundChannel:

Sekarang kita dapat mengontrol suara yang diputar. Sebagai contoh, mari kita buat klik pada tahap hentikan audio (sebagian besar kode kelas tercantum di bawah ini untuk referensi; kode baru disorot).

Sebagai contoh lain, kita akan membuat menggerakkan mouse di sekitar kontrol volume dan pan. Panci akan disesuaikan tergantung mana mouse pada sumbu horisontal, dan volume akan pada sumbu vertikal, dengan dasar yang sedang dimatikan. Kita hanya perlu menambahkan pendengar bergerak mouse. Dalam konstruktor:

Dan pendengar itu sendiri:

Matematika sedikit liar, tapi itu hanya berubah posisi mouse ke angka-angka yang dapat digunakan untuk volume dan pan. Volume dapat menjadi dari 0 ke 1, dan panci dari -1 ke 1. Mereka mendapatkan dimasukkan ke sebuah objek SoundTransform, yang kemudian dapat diatur dalam SoundChannel.

Sekarang, Anda mungkin bertanya-tanya mengapa Anda memerlukan satu objek untuk memutar suara dan yang lainnya untuk mengontrol suara. Awalnya agak membingungkan, tetapi pengaturannya memungkinkan Anda untuk memiliki satu objek Sound, yaitu sumber audio, dan memutarnya beberapa kali dengan berbagai cara. Untuk hanya memutar lagu, yang ini tidak terlalu berguna, tapi membayangkan memberikan suara untuk permainan. Jika Anda memiliki suara untuk memukul musuh, suara ini mungkin perlu untuk diputar kembali berkali-kali, mungkin tumpang tindih itu sendiri, dan dengan volume terpisah dan panci tergantung pada di mana pada layar hit terjadi. Dengan bermain kembali suara ke beberapa SoundChannels, Anda memiliki jenis kontrol, tapi tanpa perlu untuk menciptakan kembali audio sumber setiap waktu.

Untuk tujuan kita, kita tidak akan mendapatkan yang terlibat, tetapi Anda perlu untuk memahami hubungan antara suara dan SoundChannel objek.


Langkah 6: Bermain suara: cara Neue

Sekarang bahwa kita sudah kursus kilat dalam cara untuk memuat dan memutar suara cara standar, kita akan mulai mencari cara untuk memutar suara dengan metode yang baru diperkenalkan di Flash Player 10. Pendekatan kami akan pertama termasuk sedikit Flash cerita rakyat, dan kemudian melibatkan beberapa teori audio digital umum. Selanjutnya kita akan membuat kerangka proyek bagi kita untuk bekerja di, dan kemudian menghabiskan sisa waktu kita pada pendekatan bertahap untuk menulis kode, dengan murah hati penjelasan tenun di.

Sedikit sejarah. Jenius di belakang hobnox audiotool*, yaitu André Michelle dan Joa Ebert, akan mana ada Flash berbasis aplikasi audio pergi sebelum, dan diperlukan suatu metode yang lebih dinamis untuk menciptakan audio pada terbang. Sementara mereka berhasil membuat terjadi di Flash Player 9, mereka muak dengan audio kurang kuat implementasi di Flash. Mereka mendirikan sebuah situs yang disebut make-some-noise.info yang didukung masyarakat permohonan untuk mendapatkan Adobe untuk menambahkan audio fitur ke Flash.

Hebatnya, tidak hanya itu Adobe mendengarkan, tapi mereka disampaikan dalam hitungan bulan, dan dirilis beberapa fitur sebelumnya tak terduga dengan Flash Player 10. Kabar baiknya adalah bahwa kami sekarang memiliki beberapa cukup maju alat tersedia bagi kita untuk manipulasi audio. Kabar buruknya adalah bahwa itu benar-benar adalah hanya satu set kecil cukup rendah api itu, sementara kuat, yang hanya blok bangunan yang Anda akan perlu untuk menambahkan Anda sendiri kecerdikan dan kerja keras. Tapi itulah apa tutorial ini adalah tentang, jadi Anda tertutup.

(Adobe membuat beberapa kebisingan kampanye ini tidak lagi di sekitar, tapi Anda masih dapat membaca posting di membuat beberapa noise.info, serta serangkaian posting blog oleh Tinic Uro, yang adalah seorang pengembang di Adobe bekerja pada Flash Player. Dalam posting ini ia menanggapi Adobe membuat beberapa kebisingan atas nama Adobe dan menyediakan beberapa wawasan yang menarik ke situasi serta melihat beberapa contoh kode pertama. Ada tiga posting, menambahkan sampai dengan dosis yang baik informasi, tetapi tidak terlalu panjang untuk dibaca. Bagian 1, Bagian 2, dan bagian 3.)

* Hanya samping pribadi: audiotool adalah yang paling mengesankan bagian Flash yang pernah saya lihat.


Langkah 7: Penjelasan singkat dari sampel

Untuk sepenuhnya memahami apa yang terjadi dengan teknik baru ini, Anda perlu pastikan Anda memahami dasar-dasar digital audio. Jika Anda merasa seperti Anda telah memiliki pemahaman yang baik pada bagaimana digital audio bekerja, khususnya sifat sampel (yang "sampel" seperti 44,100 sampel per detik pada CD, tidak seperti dalam sampling riff bass untuk lagu Anda), maka jangan ragu untuk langsung beralih ke langkah berikutnya.

Juga perhatikan bahwa berikut ini adalah pengenalan yang sangat singkat dan sepintas digital audio. Harap mengerti bahwa ada banyak informasi yang dipelajari mengenai hal ini, dan semua saya mencoba untuk melakukan adalah menarik keluar mutlak penting karena mereka berhubungan dengan tujuan kita di Flash. Untuk informasi lebih lanjut, merasa bebas untuk melakukan penelitian lebih lanjut, mungkin dimulai dengan Audiotuts + artikel ini, dan mungkin termasuk artikel Wikipedia ini dan Halaman ini manual Audacity, dan jika itu tidak cukup, mencapai puncaknya dengan pencarian internet

Suara yang kami dengar, atau yang dijemput oleh mikrofon, yang perubahan tekanan di udara. Dalam kasus telinga, perubahan tekanan ini memukul drum telinga kami, dan akhirnya getaran mendapatkan otak kita. Dalam kasus mikrofon, perubahan tekanan ini memukul diafragma mic dan dengan demikian diterjemahkan ke dalam perubahan dalam arus listrik, yang kemudian akan dialihkan ke kabel dan ke perangkat audio lainnya.

Kami tertarik pada salah satu perangkat audio lainnya: A / DC, atau Analog-to-Digital Converter. Pada akhirnya audio perlu dikonversi menjadi 1 dan 0 sehingga komputer dan perangkat audio digital lainnya dapat melakukan tugasnya. Dan pekerjaan dari A / DC adalah untuk mengambil arus listrik yang analog, yang cukup mirip perubahan tekanan udara, dan mengubahnya menjadi aliran angka biner, yang benar-benar tidak menyerupai aslinya suara sama sekali.

Cara kerjanya, kemudian, adalah bahwa pada interval reguler waktu, A / DC mengambil sampel analog audio. Di kemudian mengukur kekuatan sinyal audio pada saat ini, atau amplitudo, dan merekam nilai itu sebagai angka biner. Pengambilan sampel ini dilakukan secara berkala, yang dikenal sebagai laju sampel konversi. Semakin cepat tingkat ini, semakin tinggi kualitas konversi, tetapi lebih penyimpanan ruang dan kekuatan pemrosesan yang diperlukan. CD audio ini memiliki tingkat sampling 441.kHz, atau 44,100 sampel per detik.


Ketika sinyal audio ini melanjutkan perjalanannya di dunia digital, aliran sampel terbang dengan kecepatan laju sampel. Sampel-sampel ini dapat diubah sepanjang jalan, tetapi tetap sampel; snapshot audio pada titik waktu tertentu, yang kemudian dapat dipasang kembali menjadi sinyal audio analog dengan proses terbalik.

Jika penjelasan ini sepintas tidak meninggalkan Anda dengan pemahaman perusahaan pada gagasan sampel, kemudian silakan merujuk ke link yang disebutkan di awal langkah ini. Untuk sepenuhnya memahami apa yang kita lakukan dalam tutorial ini, serta Tutorial Flash audio yang akan datang, maka silakan melakukan due diligence dan bangun untuk kecepatan.


Langkah 8: Mendirikan proyek

Untuk memulai dengan sebenarnya coding, kami akan membuat proyek dasar kami. Ini adalah hal umum boilerplate, tetapi itu perlu dilakukan. Anda dipersilakan untuk melewatkan langkah ini dengan hanya menggunakan proyek canggih-suara-mulai termasuk dalam paket download. Sub-langkah yang diuraikan dalam langkah ini akan hanya membuat file tersebut, atau yang lain berfungsi sebagai penjelasan berkas-berkas tersebut.

  1. Membuat folder untuk proyek kami untuk tinggal di. Saya bernama \advanced-sound-start\.
  2. Buat file Flash baru:
    • Membuat ActionScript 3.0.
    • Simpan sebagai AdvancedSound.fla dalam folder proyek kami.
  3. Buat UI dalam Flash file:
    • Gambar beberapa karya seni menjadi tombol 'Mainkan'. Ubah menjadi simbol, dan beri nama instance "play_mc"
    • Menggambar beberapa karya seni untuk menjadi "Berhenti" tombol. Mengubahnya menjadi simbol, dan nama contoh "stop_mc"
    • Menggambar beberapa karya seni untuk menjadi "Reverse" tombol. Mengubahnya menjadi simbol, dan nama contoh "reverse_mc"
  4. Buat sebuah file baru ActionScript untuk melayani sebagai kelas dokumen kami.

    • Simpan sebagai AdvancedSound.as di folder proyek kami.
    • Masukkan template kelas khas dokumen berikut, jika editor Anda tidak menyediakan fasilitas yang:

  5. Kami akan menempatkan kode kita audio ke kelas sendiri, yang akan terkandung dalam sebuah paket. Buat folder berikut:
    • [proyek akar]
      • com
        • activetuts
          • audio
  6. Di dalam audio folder, membuat file ActionScript lain bernama ReversibleSound.as

    • Masukkan template kelas berikut:

  7. Pastikan untuk memiliki suatu file MP3 yang dapat diakses di tingkat akar proyek. Anda dapat menyalin file clip.mp3 yang disediakan dalam paket download (Lihat di folder maju-suara-start) atau menggunakan MP3 Anda sendiri. Jika Anda menggunakan Anda sendiri, Anda dapat mengubah nama "clip.mp3", atau yang lain Anda dapat berada di lookout untuk terjadinya "clip.mp3" dalam langkah berikut dan mengubahnya sesuai.

Itu banyak mikro-tugas, tetapi semua dalam semua itu hanya menambah hingga memiliki file siap bagi kita untuk bekerja di langkah-langkah berikut.


Langkah 9: Load MP3 File

Sekarang mari kita load MP3 file. Mekanisme pemuatan akan identik dengan apa yang kita bahas sebelumnya. Namun, kami akan membungkus yang dalam metode beban pada kelas ReversibleSound. Kami juga perlu menambahkan dan mengatur properti untuk objek Sound. Mulailah dengan mendeklarasikan properti, tepat setelah kelas dibuka dan sebelum konstruktor:

Kemudian mengatur it up di konstruktor:

Selanjutnya kita akan menulis metode load, yang akan menerima String url dan meneruskannya ke metode load milik Sound. Hanya setelah konstruktor, tapi sebelum kelas penutupan penjepit yang keriting:

Dan akhirnya Mari kita menambahkan onSoundLoad metode, lengkap event handler kami mendirikan di konstruktor:

Untuk menguji ini kita dapat naik kembali ke kelas AdvancedSound dan pastikan kita membuat ReversibleSound objek dan panggilan load di atasnya. Pertama mengimpor kelas:

Selanjutnya menyatakan properti untuk tahan objek:

Kemudian menurunkannya dan Panggil metode load dalam konstruktor:

Pada titik ini, kita dapat menguji itu. Anda tidak akan mendengar suara apapun namun, tetapi Anda akan melihat "suara load" pop up di Output panel, menunjukkan bahwa objek kami kabel dengan baik dan bahwa file MP3 kami sedang benar dimuat.



Langkah 10: Objek kedua suara

Segalanya akan mulai sedikit membingungkan, jadi bersabarlah jika saya mendapat sedikit penjelasan-senang.

Kami memiliki objek suara kami, dan itu memuat MP3 file. Kami hanya bisa menelepon bermain dan dilakukan dengan hal itu. Pada kenyataannya, jika Anda lelah dari tutorial ini, saya sarankan Anda melakukan hal itu, dan berhenti membaca, dan kemudian pergi mendapatkan segelas susu dan Fruit Rollup™, diikuti oleh tidur siang. Tidak ada yang akan menilai Anda.

Masih di sini? Bagus, karena Anda akan melakukan beberapa program Flash keren yang jahat. Untuk melakukan itu, kita perlu membuat dan menyimpan objek suara lain. Berikut ini adalah tempat hal-hal yang mungkin tidak masuk akal segera (dan Anda akan senang Anda melewatkan susu). Singkatnya, kita perlu satu suara untuk menyediakan sumber audio, dan suara lainnya untuk menyediakan sebuah mekanisme pemutaran. Suara kita sudah dibuat, bernama "_soundData", adalah sumber audio. Itu banyak MP3 dan, di langkah ke depan, menyediakan sampel untuk dimainkan. Sekarang kita akan menciptakan suara yang akan memainkan sampel tersebut.

Dalam ReversibleSound, membuat properti lain, tepat di bawah properti pertama kami membuat:

Sekarang dalam konstruktor, instantiate:

Ini tidak banyak untuk menguji sekarang, meskipun seperti biasa, Anda hanya dapat menjalankan film untuk melihat jika kesalahan muncul.


Langkah 11: Menyediakan Data sampel

Kita akhirnya akan masuk ke dalam teknik kunci tutorial ini. Seperti disebutkan dalam langkah terakhir, objek _soundPlayer akan menyediakan pemutaran, sedangkan objek _soundData yang menyediakan audio data. Untuk membuat hal ini terjadi, kita perlu menambahkan acara tertentu ke objek _soundPlayer. Kami akan melakukan yang benar setelah kita membuat itu:

Ketika Anda menambahkan pendengar acara ini ke objek suara, Anda menetapkan itu untuk dinamis audio generasi. Event handler (yang kita akan menulis pada langkah berikutnya) akan dipanggil ketika suara bermain. Setelah pemutaran dimulai, objek Sound perlu sampel untuk diputar (ingat bahwa ini bukan suara 'tradisional' dengan data sampel yang secara inheren bagian dari objek dalam bentuk file MP3). Jadi SAMPLE_DATA peristiwa kebakaran, yang pada dasarnya objek suara mengatakan, "Mungkin I plz memiliki beberapa sampel untuk bermain?" Melalui acara ini, Anda dapat makan sampel ke objek suara, dan kemudian suara akan bermain mereka kembali.

Sebagai pemutaran berlangsung, itu akan akhirnya kehabisan contoh untuk bermain dari pertama kali, Anda diberikan mereka. "Akhirnya" di sini berarti "sepersekian detik," seperti yang biasanya Anda menyediakan antara 2048 dan 8192 sampel - yaitu antara 0.0464399093 dan 0.1857596372 detik pada 44.1 kHz. Ketika buffer sampel menjalankan rendah, objek suara akan api acara SAMPLE_DATA lagi, pada titik mana Anda memberikan sampel. Suara terus bermain mereka, dan kemudian akan api acara sebagai contoh menjalankan rendah lagi. Proses ini terus sampai Anda berhenti memberikan contoh, atau hubungi berhenti di SoundChannel.

Sidenote: Jika Anda membaca posting Tinic Uro menanggapi Adobe Make Some Noise, Anda mungkin telah memperhatikan bahwa di Bagian 2 ia menyatakan bahwa Anda dapat menyediakan antara 512 dan 8192 sampel. Ketika ia menulis posting itu, Flash Player 10 belum dirilis dan API suara dinamis belum selesai. Sayangnya, itu tidak benar lagi; 512 sampel akan menjadi pilihan yang lebih rendah latensi untuk aplikasi suara mana responsif audio lebih penting daripada melestarikan siklus CPU. Jangan ragu untuk mencoba; Anda hanya akan mendapatkan audio tidak jika Anda mencolokkan Nomer tidak valid.


Langkah 12: Mendapatkan Sampel Dari Audio Sumber

Kita akan perlu untuk menulis yang event handler sekarang, sehingga kami dapat melanjutkan diskusi kita tentang acara SAMPLE_DATA.

Dan ini adalah bagaimana kami feed sampel kotoran. Mari kita pertama kali harus jelas bahwa hasil akhir dari ini akan hanya memutar file MP3 yang penuh dengan suara lain. Untuk itu, metode ini agak rumit, tetapi hal ini membantu kita berfokus pada teknik mendasar.

Mari kita berjalan melalui garis-garis metode ini.

Pertama ada tanda tangan metode, yang tidak mengejutkan, tetapi it's worth mencatat jenis parameter objek acara: SampleDataEvent. Kita akan menggunakan objek acara ini dalam metode, jadi kita harus memastikan kita tertentu, dan tidak menggunakan jenis aktivitas generik.

Selanjutnya kita membuat objek ByteArray. Jika Anda belum pernah menggunakan ByteArrays sebelumnya, mereka bisa sedikit membingungkan untuk digunakan, terutama jika Anda mengharapkannya mirip dengan Array biasa. Saya tidak akan terlalu mendalam dengan cara kerja ByteArray, cukup untuk membantu membuat kami dengan tutorial suara kami, tetapi Anda juga harus tahu bahwa benih untuk tutorial masa depan tentang ByteArray telah ditanam.

Cukuplah untuk mengatakan bahwa kita membuat sebuah objek ByteArray kosong. Ini merupakan bahan utama dalam dua langkah: langkah-langkah kedua perlu ByteArray sebagai parameter ke metode kami akan memanggil. Ini akan menjadi ByteArray ini.

Baris kedua metode tubuh panggilan extract pada objek sumber suara kami; yang satu yang kita digunakan untuk memuat MP3 file. Ini adalah di mana kita mendapatkan sampel dari suara itu. Metode ini mengharuskan ByteArray (mengatakan ya!) sebagai parameter pertama, dan ByteArray berlalu dalam akan mendapatkan sampel data yang tersimpan di dalamnya sebagai hasil dari proses ini. Tampaknya aneh bahwa alih-alih mengembalikan ByteArray, kami mengirimkan satu dan memasukkan data ke dalamnya, tetapi ini sebenarnya adalah teknik umum dalam bahasa berbasis C. Dalam kasus ini, itu lebih efisien untuk memiliki metode ekstrak yang hanya menempatkan data ke ByteArray yang ada daripada untuk membuat ByteArray, menulis untuk itu dan mengembalikannya. Untuk itu, kita dapat membuat metode onSampleData kami lebih efisien dengan menulis ulang seperti ini:

Dengan cara ini kita membuat satu objek ByteArray, menyimpannya, dan kemudian memanggil jelas pada itu, daripada menciptakan sebuah objek ByteArray seluruh setiap kali kita perlu sampel. Sebagai aturan, membuat objek baru adalah tindakan mahal, dan itu biasanya lebih efisien guna object yang telah ada dan hanya menset atributnya ke pengaturan netral. Ini adalah teknik yang dikenal sebagai Object Pooling dan itu semua akan saya katakan lagi dalam tutorial ini.

Parameter kedua ekstrak adalah jumlah sampel untuk mendapatkan dari suara. Ini bisa menjadi salah satu dari tiga nilai: 2048, 4096 atau 8192. Tidak bahwa 2048 * 2 = 4096, dan bahwa 2048 * 4 = 8192. Yang Anda pilih tergantung pada kebutuhan Anda. Saya telah menemukan bahwa lebih rendah nomor, semakin intens Flash harus seperti itu menembakkan acara SAMPLE_DATA lebih sering (karena Anda memberikannya sampel lebih sedikit untuk bekerja terakhir kali dan sehingga perlu sampel lebih cepat). Pada saat yang sama, nilai-nilai yang lebih tinggi dapat memiliki efek samping yang aneh dari tidak diperbarui cukup cepat. Suara itu sendiri akan diputar dengan baik, tetapi penyesuaian suara yang dilakukan selama pemutaran akan ditangguhkan hingga acara SAMPLE_DATA berikutnya, dan saat Anda menambah waktu di antara acara, semakin kelihatan perbedaan ini. Untuk sekarang, itu tidak banyak masalah, tapi aku telah memilih untuk pergi dengan 2048 memonopoli kinerja.

Sekarang, Anda mungkin bertanya-tanya, sampel 2048 mana yang diambil dari sumber audio? Bagaimana Flash tahu di mana harus mulai memanen data? Jawabannya adalah dalam parameter ketiga untuk mengekstrak. Parameter ketiga menentukan di mana sampel untuk mulai, dan bekerja ke depan dari sana. Namun, jika ditinggalkan, objek Sound melakukan beberapa pekerjaan untuk Anda dengan melacak pointer secara internal yang dimulai pada 0 dan maju secara otomatis ke sampel pertama setelah ekstraksi Anda. Jadi dengan meninggalkan, seperti yang kita lakukan di sini, kami secara otomatis meminta semua sampel MP3 dalam urutan yang benar.

Akhirnya, garis akhir onSampleData mengambil ByteArray itu, yang sekarang adalah sesak penuh data sampel, dan feed untuk pemutaran suara melalui data milik writeBytes metode, ditemukan pada objek SampleDataEvent lulus dalam ke event handler. Tidak ada cara untuk menulis sampel langsung ke suara; Anda harus pergi melalui metode ini. Setelah melewati sepanjang sampel kami selesai (sampai waktu berikutnya peristiwa kebakaran), dan pemutaran suara akan menghasilkan output.

Kami akan siap untuk menguji ini, tetapi kami masih perlu untuk benar-benar memberitahu pemutaran Sound to play, jadi mari kita kaitkan tombol 'play' yang besar di langkah berikutnya.


Langkah 13: Tombol Play

Langkah ini akan menjadi cakewalk setelah yang terakhir. Kita hanya perlu beberapa penanganan MouseEvent.

Dalam AdvancedSound (kelas dokumen), tambahkan klik pendengar ke tombol play_mc.

Dan di pendengar acara itu, panggil metode play yang belum ditulis di ReversibleSound:

Sekarang naik kembali ke ReversibleSound dan menulis bermain metode:

Dan tentu saja kita tidak menulis properti _channel itu belum, jadi menyatakan bahwa bersama seluruh properti:

Dan kita harus baik untuk pergi. Uji film, dan klik pada tombol "play". Jika semua berjalan lancar, Anda harus mendengar file MP3 Anda memutar melalui Flash.


Langkah 14: Checkpoint

Untuk referensi, berikut adalah kode lengkap dari dua kelas kami saat ini:

AdvancedSound

ReversibleSound


Langkah 15: Sebuah kata tentang efisiensi

Seperti Anda mungkin bisa membayangkan, hal ini dinamis audio dapat menjadi cukup kuat untuk Flash untuk mengeksekusi. Hal ini cukup kokoh, tetapi itu tidak berarti sulit untuk pajak sistem. Anda harus melakukan yang terbaik untuk menjaga pendengar acara SAMPLE_DATA sebagai kurus sebanyak yang Anda bisa. Kami melakukan ini dua langkah yang lalu ketika kami kami refactored metode dari menggunakan ByteAray baru setiap waktu untuk menggunakan objek ByteAray, hanya menghapusnya setiap waktu.

Contoh lain akan menjadi untuk menghindari jejak dalam metode. Melemparkan beberapa di hanya untuk debugging baik, tetapi sangat mudah untuk melacak terlalu banyak. Satu jejak di sana-sini baik-baik saja, tetapi mereka yang benar-benar agak pendaftaran proses sendiri, dan menempel mereka di mengulang peristiwa, seperti ENTER_FRAME atau cepat timer, dapat merusak performa film Flash Anda. Demikian juga, metode SAMPLE_DATA ini dipanggil hingga 22 kali kedua, dan itu sendiri rutin kinerja-sensitif, jadi setelah Anda selesai dengan jejak Anda, pergi ke depan dan komentar itu keluar atau menghapusnya sama sekali.


Langkah 16: Menghentikan suara

Hal terakhir yang kami lakukan adalah menghubungkan tombol 'putar' untuk memainkan suara; sekarang mari kita memasang tombol 'stop'.

Jadi kami akan menambahkan pendengar acara klik untuk klip stop_mc di AdvancedSound.as:

Dan kemudian tulis metode onStopClick:

Selanjutnya kita perlu menulis metode berhenti pada kelas ReversibleSound:

Dan pada titik ini, kita harus mampu mulai dan berhenti suara dengan mengklik tombol "Putar" dan "berhenti" masing-masing.

Jika Anda bermain, maka berhenti, kemudian bermain lagi, Anda harus menyadari bahwa suara Anda akan mengambil mana ia tinggalkan. Hal ini karena metode Sound.extract, dan perilaku ketika parameter ketiga (posisi) diabaikan. Jika Anda ingat, tidak menentukan parameter berarti bahwa objek Sound akan menggunakan pointer internal itu sendiri, yang dimulai pada 0 dan mengingat di mana harus memulai lagi pada saat berikutnya dipanggil. Jadi kita mendapatkan "berhenti" gratis. Itu akan cukup sederhana untuk mengubah nama tombol untuk "jeda" dan membuat "berhenti" tombol berhenti suara dan me-reset posisi ke 0, tapi itu bersinggungan saya akan melawan.


Langkah 17: Membalikkan suara

Sejauh ini, semua yang kami lakukan adalah membuat banyak bekerja ekstra untuk memainkan file MP3, yang Flash telah mampu melakukan selama bertahun-tahun. Tapi titik nyata generasi suara dinamis agar dapat memproses suara dalam berbagai cara dengan cepat, dan mendengar hasil dalam real-time, tanpa harus memuat beberapa variasi dari MP3.

Untuk keperluan tutorial kami, kami akan menjaga pemrosesan yang sebenarnya menjadi lebih sederhana dan mengaktifkan opsi memutar suara secara terbalik. Untuk melakukan ini, secara konseptual agak sederhana: cukup mengekstrak sampel dari sumber Sound secara terbalik, dan mengumpankannya ke Sound pemutaran.

Namun, mengatakan "cukup ekstrak sampel terbalik" dan melakukannya adalah dua hal yang berbeda. Ini akan mengambil sedikit kerja untuk mendapatkan fungsional, tetapi kita akan mengambil satu langkah pada satu waktu.

Upaya pertama akan menghubungkan tombol. Kami akan mengatur tombol sebagai beralih. Ini adalah secara default, tetapi ketika diklik kami akan memungkinkan pemutaran terbalik. Mengklik lagi akan mematikannya.

Untuk melakukan ini, kami akan menambahkan properti dan setter / pengambil terkait untuk menunjukkan pemutaran mundur harus / sedang berlaku Di ReversibleSound.as, tambahkan properti pribadi di area yang sama dengan properti lainnya:

Kemudian tambahkan sepasang metode pengambil / penyetel untuk itu:

Sekarang naik kembali ke AdvancedSound.as dan menghubungkan event klik untuk tombol reverse_mc:

Dan kemudian tulis pawang:

Sebagian besar ini harus cukup lurus ke depan. Kita akan kembali kepada setter isReversing itu, tapi untuk saat ini adalah properti yang sederhana. Klik handler hanya berbalik Boolean saat ini ditemukan dalam objek ReversibleSound, sehingga ia bertindak sebagai beralih. Kemudian ada pemeriksaan sederhana untuk melihat apakah kita sedang membalikkan atau tidak, dan kami secara visual mempengaruhi tombol hanya sebagai indikator Apakah membalikkan ini berlaku.

Pergi ke depan dan mencobanya. Anda tidak akan dapat membalik suara hanya belum, tapi Anda dapat klik tombol dan beralih di antara keadaan normal dan keadaan sedikit lebih gelap (toggled pada dan reverse pemutaran akan berlaku).


Langkah 18: Pindah posisi Playback ke akhir

Fasa berikutnya adalah untuk melacak di mana kita berada dalam suara sementara secara terbalik. Kami tidak memiliki kenyamanan hanya meninggalkan dari parameter ketiga untuk mengekstrak. Sebagai gantinya, kita harus melakukan sedikit matematika untuk melacak posisi kita sendiri, dan memasukkan nilai itu ke metode extract.

Mari kita mulai dengan menyatakan sebuah properti di ReversibleSound.as untuk melacak posisi kami.

Selanjutnya, kepala ke setter set isReversing Anda dan kami akan menetapkan posisi ini tidak:

Jika kita memungkinkan pemutaran terbalik, maka kami akan mengatur _position. Bagaimana kita mengatur itu, meskipun, memerlukan beberapa penjelasan.

Karena kita akan pergi untuk membalikkan pemutaran, kita perlu untuk memulai pada akhir suara. Dan karena milik _position kami terus melacak yang sampel kami, kita perlu pada awalnya diatur _position untuk sampel suara yang sangat terakhir.

Untuk melakukan itu, kita harus membuka sekaleng matematika. Akan lebih bagus jika kita bisa dengan mudah mendapatkan jumlah sampel dalam Sound yang diberikan, tetapi sebaliknya yang paling kita dapatkan adalah properti length, yang memberi kita berapa milidetik panjang suara itu. Jika kita membagi nomor dengan 1000, kita bisa mendapatkan berapa banyak detik lama suara adalah. Dan karena kita akan berasumsi bahwa MP3 dikodekan dengan tingkat sampling 44.1 kHz, kita dapat mengalikan jumlah detik oleh 44100 untuk mendapatkan jumlah sampel.

Ini, tentu saja, dapat disederhanakan untuk:

Tapi kurang jelas apa yang melakukan; itu lebih mudah untuk menjelaskan menggunakan versi yang lebih lama. Gunakan versi mana yang Anda pikir membuat Anda lebih dingin.

Dengan asumsi 44.1 kHz adalah asumsi yang adil; Flash hanya dapat bermain kembali file MP3 (menggunakan metode tradisional) jika tingkat sampling 44.1 khz, 22.05 kHz, atau 11.025 kHz. Dan ketika menggunakan dinamis generasi suara, suara meminta data sampel mengharapkan sampel harus disediakan di 44.1 kHz. Intuisi programmer saya ingin membuat 44100 dan mengubahnya menjadi sebuah properti yang dapat dikonfigurasi, dan tidak ada yang salah dengan itu, tapi itu juga bisa berbahaya salah mengkonfigurasi properti. Menjaga ini dalam pikiran, meskipun, jika Anda sedang loading suara itu tidak 44.1 kHz. Jika Anda mendapatkan error (karena Anda sudah over diperkirakan ada berapa banyak sampel) atau pemutaran Anda adalah setengah-kecepatan (karena Anda telah diremehkan), kemudian coba re-encoding MP3 Anda harus 44.1 kHz.

Tidak ada seluruh banyak titik untuk pengujian film kami belum benar-benar membuat perubahan yang terlihat begitu jauh. Tapi jika Anda suka, kompilasi untuk memastikan tidak ada kesalahan kompilator, dan kemudian melanjutkan.


Langkah 19: Melacak Posisi Pemutaran Saat Berbalik

Sekarang, jika kita terbalik, kita perlu memperbarui properti _position dengan tepat ketika data sampel diminta. Kita akan Pertama tongkat ukuran buffer sampel kami ke properti, sehingga lebih mudah untuk menggunakan secara konsisten di banyak tempat kita akan membutuhkannya. Masih di ReversibleSound.as, buat properti pribadi untuk menampung ukuran buffer kami. Juga buat tiga konstanta statis publik untuk menyimpan nilai yang valid untuk buffer:

Dan kemudian kami akan membuat parameter opsional untuk konstruktor, yang akan default ke "kecil", dan mengatur properti _bufferSize.

Dengan cara ini Anda memiliki pilihan untuk mengubah ukuran buffer, tetapi memiliki default berguna.

Sekarang, kita perlu meninjau kembali metode onSampleData. Memperbarui itu tampak seperti berikut:

Apa yang kita lakukan adalah memeriksa untuk melihat jika kita membalikkan atau tidak. Jika tidak (yang akan blok lain), kita melakukan persis apa yang kami lakukan sebelum: cukup ekstrak sampel dan memberi mereka suara. Namun, jika kita membalikkan, kita perlu memperbarui internal kami posisi dengan mengurangi dari itu ukuran buffer. Dengan cara ini kita akan pengurangan posisi dengan ukuran buffer, sehingga kita dapat mengekstrak sampel oleh potongan, hanya mundur.

Perhatikan bahwa kami juga telah diperbarui maju-bermain ekstrak metode untuk menggunakan _bufferSize bukan 2048 keras-kode.


Langkah 20: Ekstraksi sampel terbalik

Dalam hal mengekstraksi sampel, tidak ada banyak perbedaan antara maju atau mundur. Perbedaan utama adalah bahwa ketika mundur, kita perlu menyediakan parameter ketiga itu; argumen sampel awal.

Untungnya, kita sudah punya nilai: itu adalah _position yang kami telah bekerja pada. Untuk ekstrak sampel kami, kita hanya perlu menambahkan disorot baris berikut:

Dan merasa bebas untuk menguji itu (klik pada "Terbalik" kemudian pada "Bermain"); Anda akan mendapatkan audio terbalik. Seperti itulah. Itu pasti suara terbalik. Tapi itu juga terdengar agak gugup. Kami akan alamat itu pada langkah berikutnya.


Langkah 21: Membalikkan ByteArray

Audio terdengar agak dendeng alasannya karena sementara kita sedang ekstraksi sampel terbalik, kita sedang hanya mengeluarkan potongan sampel, 2048 pada satu waktu, secara terbalik. Potongan (ByteArray) sendiri berada di urutan ke depan. Jadi kita telah terbalik potongan tetapi individu sampel dalam potongan adalah masih dalam pesanan ke depan. Ini adalah seperti mengambil setumpuk kartu, meraih lima dari atas dan menempatkan mereka ke samping, kemudian meraih berikutnya lima dari atas dan menempatkan mereka di atas tumpukan baru, dan sebagainya. Kami akan bercampur urutan kartu, dan jenis terbalik mereka sehingga kartu yang berada di atas geladak sekarang di bagian bawah, dan sebaliknya. Tetapi mereka tidak benar-benar terbalik.

Untuk mendapatkan benar reverse pemutaran, kita perlu untuk berikutnya membalikkan isi dari ByteArray setelah kita ekstrak sampel. Kita akan menciptakan metode baru untuk tujuan ini. Tempat ini di suatu tempat di ReversibleSound.as:

Metode ini perlu objek ByteArray lain untuk melakukan membalikkan, dan daripada menciptakan ByteArray baru setiap kali metode ini disebut, kita dapat menyimpan beberapa overhead oleh menciptakan satu di properti, dan kemudian menghapusnya setiap kali. Itulah _reversedBytes digunakan dalam metode ini. Kita perlu menyatakan dan instantiate properti itu:

Kembali ke metode reverseBytes, logika inti itu hanya loop atas input ByteArray secara terbalik dan membaca angka-angka dari itu untuk menulis ke dalam ByteArray terbalik. Sekali lagi, saya tidak akan membahas mekanisme ByteArray di sini, tetapi saya akan menunjukkan bahwa sampel yang disimpan dalam ByteArray, baik dari metode extract dan dari apa yang diharapkan oleh pemutaran Suara, ditulis sebagai float: 32- bit angka floating point. Jadi kita dapat membaca individu sampel dengan readFloat dan menyimpan mereka dengan writeFloat. Karena posisi ByteArray didasarkan pada byte, dan ada 4 byte dalam sejumlah 32-bit (8 bit = 1 byte), kita dapat melintasi ByteArray masukan oleh langkah-langkah 4 dan tanah pada titik awal yang tepat untuk berikutnya (atau sebelumnya tergantung pada bagaimana Anda melihatnya) sampel.

Ketika semua itu dikatakan dan dilakukan, metode mengembalikan pembalikan sempurna ByteArray masukan.


Langkah 22: Memasok sampel terbalik terhadap suara

Sekarang mari kita gunakan metode ini di onSampleData:

Kami hanya perlu mengirimkan _bytes setelah ekstraksi, dan kemudian kami dapat menyimpan hasilnya kembali ke _bytes sehingga dapat digunakan untuk menulis sampel ke Sound playback.

Pergi ke depan dan mencobanya. Klik tombol "Mundur", kemudian "Bermain", dan... Oh, kacang-kacangan, Anda mungkin telah mendengar awal dari beberapa dibalik suara tapi kemudian Anda berakhir dengan apa-apa (atau, tergantung pada suara Anda, Anda mungkin tidak mendengar apa-apa, jika akhir memiliki beberapa keheningan sebagai bagian dari MP3). Apa deuce?

Pada titik ini, kita perlu berhati-hati dari bagaimana kita mengelola ByteArrays. Upaya kami untuk menyelamatkan beberapa overhead dengan menciptakan ByteArrays terlebih dahulu dan menggunakan mereka untuk setiap metode benar-benar datang kembali untuk menggigit kita. Tetapi ada cara sekitar masalah, dan melibatkan, ya, menciptakan ByteArray lain.

Kali ini, kita hanya perlu mendeklarasikan properti (atau variabel metode, bahkan, meskipun kita dapat - lagi - menyimpan beberapa pemrosesan dengan mendeklarasikannya sekali sebagai properti daripada beberapa kali sebagai variabel metode). Mari kita lakukan itu, di mana properti lainnya dinyatakan:

Dan mari kita menempatkan untuk menggunakan onSampleData metode:

Kami menambahkan dua baris logika, satu untuk setiap kasus jika/lain. Kita hanya menetapkan _samplesToUse untuk _bytes baik (untuk pemutaran normal) atau kembalinya reverseBytes (untuk pemutaran terbalik). Kemudian kita menggunakan _samplesToUse, tidak _bytes, ketika mengirimkan sampel ke objek suara dengan writeBytes.

Sebanyak itu mungkin masuk akal, dan mungkin tidak jelas mengapa kami melakukan ini sekali.

Saya tidak ingin menggagalkan diskusi terlalu banyak dari topik inti kami, tetapi ini ada hubungannya dengan referensi objek, dan cara kami melewati ByteArray sekitar untuk dikerjakan oleh berbagai metode. Saya akan mencoba merangkumnya:

  • Ketika kami melewati _bytes ke reverseBytes, kita menggunakannya sebagai sumber data untuk dibalik. Karena kita perlu loop melalui sumber data, dan menulis terbalik ke ByteArray lain, kami memiliki properti ByteArray kedua, _reversedBytes.
  • _Bytes dan _reversedBytes yang diadakan ke demi efisiensi. reverseBytes kemudian kembali _reversedBytes, dan kemudian kita menetapkan bahwa untuk _bytes on line 49, di onSampleData. Setelah satu panggilan, kita telah benar-benar menunjukkan _bytes dan _reversedBytes ByteArray objek yang sama.
  • Kedua kalinya, kita benar-benar melewati di objek ByteArray direferensikan ganda ke reverseBytes, dan sekarang objek yang sama adalah sumber data serta ByteArray dimaksudkan untuk menyimpan sampel terbalik.
  • Pada titik ini, Flash memiliki kesulitan menjaga alam semesta dari meledak dan hanya berhenti berpikir tentang hal itu ("misi baru: menolak misi ini!"). Jadi kita menghindari masalah dengan memperkenalkan properti ByteArray ketiga - tapi mengerti bahwa hal ini tidak ketiga ByteArray objek, itu hanya sebuah properti yang digunakan untuk referensi. Kami tidak peduli yang ByteArray akan disimpan di dalamnya, jadi kami menggunakan satu sebagai pointer untuk apapun yang kita ingin menggunakan dan lulus yang ke writeBytes.

Sekarang Anda sekarang harus mendengar audio sempurna terbalik!


Langkah 23: Mengetahui Kapan Harus Berhenti

Kita perlu mempertimbangkan apa yang akan terjadi saat kita mendekati awal suara. Sebagai _postiion mendapat decremented, di beberapa titik itu akan menjadi negatif. Itu bukan posisi yang valid, tetapi di bawah 0 dan akan menyebabkan extract dimulai pada awal dan bergerak maju secara otomatis, seperti yang kita lakukan jika kita tidak mundur.

Jadi setiap kali kita mengurangi _positition, kita perlu memeriksa untuk memastikan itu 0 atau lebih tinggi. Jika tidak, maka kita perlu menganggap audio sudah berjalan, dan kita bisa berhenti. Perbarui metode onSampleData untuk ini:

Jika properti _position berjalan negatif, maka kita dapat memanggil stop() untuk memastikan suara telah berhenti. Maka kita dapat me-reset properti _position ke akhir suara lagi, sehingga siap untuk memulai lagi jika play() harus terjadi untuk dipanggil berikutnya. Kami melakukannya dengan menyeting properti isReversing untuk benar lagi. Itu sudah benar, tapi ketika itu diatur untuk benar juga set _position properti pada akhir. Akhirnya, kita kembali ke awal sehingga tidak ada sampel diambil, atau dikirim ke suara.


Langkah 24: Saya Tahu Kapan Berhenti

Tutorial ini dikemas sampai penuh dengan informasi audio: pertama kita belajar (atau ditinjau) metode tradisional untuk memuat dan memutar file MP3. Kemudian kita belajar bagaimana untuk memuat MP3 dan menggunakannya untuk memberi makan sampel ke buffer suara. Akhirnya kita tahu bagaimana untuk mengambil sampel tersebut dan membalikkan mereka sehingga kita bisa memberi makan mereka ke buffer untuk mendapatkan suara yang terbalik, sambil belajar beberapa dasar-dasar audio digital sepanjang jalan.

Saya berharap Anda bersenang-senang dengan yang satu ini. Aku akan kembali dengan tutorial lain atau dua di Flash audio, sehingga jika Anda menyukai artikel ini, menantikan.

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.