Chrome telah secara konsisten dan diam-diam meningkatkan dukungannya untuk Web Audio API. Di Chrome 49 (Beta mulai Februari 2016, dan diharapkan Stabil pada Maret 2016), kami telah mengupdate beberapa fitur untuk melacak spesifikasi, dan juga menambahkan satu node baru.
decodeAudioData() kini menampilkan promise
Metode
decodeAudioData()
di AudioContext
kini menampilkan Promise
, yang memungkinkan penanganan pola asinkron
berbasis Promise. Metode decodeAudioData()
selalu menggunakan
fungsi callback sukses dan error sebagai parameter:
context.decodeAudioData( arraybufferData, onSuccess, onError);
Namun, sekarang Anda dapat menggunakan metode Promise standar untuk menangani sifat asinkron decoding data audio:
context.decodeAudioData( arraybufferData ).then(
(buffer) => { /* store the buffer */ },
(reason) => { console.log("decode failed! " + reason) });
Meskipun dalam satu contoh ini terlihat lebih panjang, Promise membuat pemrograman asinkron lebih mudah dan lebih konsisten. Untuk kompatibilitas, fungsi callback Success dan Error masih didukung, sesuai dengan spesifikasi.
OfflineAudioContext kini mendukung suspend() dan resume()
Sekilas, mungkin tampak aneh untuk memiliki suspend() di
OfflineAudioContext.
Lagi pula, suspend()
ditambahkan ke AudioContext
untuk memungkinkan hardware
audio masuk ke mode standby, yang tampaknya tidak ada gunanya dalam skenario saat Anda
merender ke buffering (tentu saja, itulah tujuan OfflineAudioContext
).
Namun, tujuan fitur ini adalah untuk dapat membuat hanya sebagian
"skor" pada 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 not.
Setiap "catatan" mungkin didekonstruksi menjadi minimal beberapa node grafik audio
(misalnya, node AudioBuffer dan Gain). Jika ingin merender seluruh
tujuh setengah menit ke dalam buffer dengan OfflineAudioContext
, Anda mungkin
tidak ingin membuat semua node tersebut sekaligus. Sebagai gantinya, Anda dapat membuatnya dalam
bagian waktu:
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();
}
Hal ini akan memungkinkan Anda meminimalkan jumlah node yang perlu dibuat sebelumnya di awal rendering, dan mengurangi permintaan memori.
IIRFilterNode
Spesifikasi telah menambahkan node untuk audiophile yang ingin membuat
infinite-impulse-response
sendiri yang ditentukan dengan tepat:
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 akurat yang tidak dapat dibuat
sebelumnya, seperti filter urutan tunggal; Namun, penggunaan IIRFilterNode memerlukan
beberapa pengetahuan mendalam tentang cara kerja filter IIR, dan filter tersebut 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 pada kecepatan audio. API
tidak berubah sama sekali untuk melakukan hal ini, tetapi ini berarti sapuan filter Anda akan terdengar
lebih halus. Selain itu, di Chrome 48, kami menambahkan rantai ke metode AudioNode.connect()
dengan menampilkan node yang terhubung. Hal ini memudahkan pembuatan rantai node, seperti dalam contoh ini:
sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);
Sekian untuk saat ini, dan teruslah berkarya!