Chrome secara konsisten dan diam-diam meningkatkan dukungannya untuk Web Audio API. Di Chrome 49 (Beta mulai Februari 2016, dan diperkirakan akan menjadi Stabil pada Maret 2016), kami telah mengupdate beberapa fitur untuk melacak spesifikasi, dan juga menambahkan satu node baru.
decodeAudioData() sekarang menampilkan promise
Metode
decodeAudioData()
pada AudioContext
sekarang menampilkan Promise
, yang mengaktifkan penanganan pola asinkron
berbasis Promise. Metode decodeAudioData()
selalu menggunakan fungsi callback berhasil dan error sebagai parameter:
context.decodeAudioData( arraybufferData, onSuccess, onError);
Namun, kini Anda dapat menggunakan metode Promise standar untuk menangani sifat asinkron mendekode data audio:
context.decodeAudioData( arraybufferData ).then(
(buffer) => { /* store the buffer */ },
(reason) => { console.log("decode failed! " + reason) });
Meskipun dalam satu contoh terlihat lebih panjang, Promise membuat pemrograman asinkron lebih mudah dan lebih konsisten. Untuk kompatibilitas, fungsi callback Berhasil dan Error masih didukung, sesuai spesifikasi.
OfflineAudioContext sekarang mendukung menangguhkan() dan resume()
Secara sekilas, mungkin tampak aneh jika menangguhkan() di
OfflineAudioContext.
Lagi pula, suspend()
telah ditambahkan ke AudioContext
untuk mengaktifkan pemindahan hardware
audio ke mode standby, yang tampaknya tidak ada gunanya dalam skenario saat Anda
merender ke buffer (tentunya itulah tujuan OfflineAudioContext
).
Namun, inti dari fitur ini adalah kemampuan untuk membuat sebagian "skor" saja dalam satu waktu, untuk meminimalkan penggunaan memori. Anda dapat membuat lebih banyak node saat
ditangguhkan di tengah proses render.
Sebagai contoh, Moonlight Sonata karya Beethoven berisi sekitar 6.500 catatan.
Setiap "catatan" mungkin didekonstruksi menjadi setidaknya beberapa node grafik audio
(mis., AudioBuffer dan node Keuntungan). Jika ingin merender keseluruhan
tujuh setengah menit ke dalam buffer dengan OfflineAudioContext
, Anda mungkin
tidak ingin membuat semua node tersebut sekaligus. Sebagai gantinya, Anda dapat membuatnya
dalam waktu singkat:
var context = new OfflineAudioContext(2, length, sampleRate);
scheduleNextBlock();
context.startRendering().then( (buffer) => { /* store the buffer */ } );
function scheduleNextBlock() {
// create any notes for the next blockSize number of seconds here
// ...
// make sure to tell the context to suspend again after this block;
context.suspend(context.currentTime + blockSize).then( scheduleNextBlock );
context.resume();
}
Dengan demikian, Anda dapat meminimalkan jumlah node yang perlu dibuat sebelumnya pada awal rendering, dan mengurangi permintaan memori.
IIRFilterNode
Spesifikasi ini telah menambahkan node untuk audiophile yang ingin membuat
infinite-impulse-response:
IIRFilterNode.
Filter ini melengkapi BiquadFilterNode, tetapi memungkinkan spesifikasi lengkap parameter respons filter (bukan AudioParams
BiquadFilterNode
yang mudah digunakan untuk jenis, frekuensi, Q, dan sejenisnya). IIRFilterNode
memungkinkan spesifikasi filter yang tepat yang tidak dapat dibuat
sebelumnya, seperti filter urutan tunggal; namun, penggunaan IIRFilterNode memerlukan
pengetahuan mendalam tentang cara kerja filter IIR, dan filter juga tidak dapat dijadwalkan
seperti BiquadFilterNodes.
Perubahan sebelumnya
Saya juga ingin menyebutkan beberapa peningkatan yang telah dilakukan sebelumnya: di
Chrome 48, otomatisasi node BiquadFilter
mulai berjalan dengan kecepatan audio. API
tidak berubah sama sekali untuk melakukan ini, tetapi ini berarti sweep filter Anda akan terdengar
lebih lancar. Selain itu, di Chrome 48, kami menambahkan perantaian ke metode AudioNode.connect()
dengan menampilkan node yang kita hubungkan. Hal ini mempermudah pembuatan rantai node, seperti dalam contoh ini:
sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);
Itu saja untuk saat ini, dan teruslah bermain!