به‌روزرسانی‌های صوتی وب در Chrome 49

کریس ویلسون
Chris Wilson

Chrome به طور مداوم و بی سر و صدا پشتیبانی خود را از Web Audio API بهبود می بخشد. در کروم 49 (بتا از فوریه 2016 و انتظار می رود در مارس 2016 پایدار باشد) چندین ویژگی را برای ردیابی مشخصات به روز کرده ایم و همچنین یک گره جدید اضافه کرده ایم.

()decodeAudioData اکنون یک وعده را برمی گرداند

متد decodeAudioData () در AudioContext اکنون یک Promise برمی‌گرداند که مدیریت الگوی ناهمزمان مبتنی بر Promise را امکان‌پذیر می‌کند. متد decodeAudioData() همیشه توابع پاسخ به تماس موفقیت و خطا را به عنوان پارامتر در نظر گرفته است:

context.decodeAudioData( arraybufferData, onSuccess, onError);

اما اکنون می‌توانید از روش استاندارد Promise برای مدیریت ماهیت ناهمزمان رمزگشایی داده‌های صوتی استفاده کنید:

context.decodeAudioData( arraybufferData ).then(
        (buffer) => { /* store the buffer */ },
        (reason) => { console.log("decode failed! " + reason) });

اگرچه در یک مثال این موضوع پرمخاطب تر به نظر می رسد، اما Promises برنامه نویسی ناهمزمان را آسان تر و سازگارتر می کند. برای سازگاری، عملکردهای بازگشت به تماس موفقیت و خطا مطابق با مشخصات هنوز پشتیبانی می شوند.

OfflineAudioContext اکنون از suspend() و resume() پشتیبانی می کند.

در نگاه اول، ممکن است عجیب باشد که suspend() در OfflineAudioContext داشته باشید. پس از همه، suspend() به AudioContext اضافه شد تا بتواند سخت افزار صوتی را در حالت آماده به کار قرار دهد، که در سناریوهایی که در حال رندر کردن در یک بافر (که البته OfflineAudioContext برای آن است) بی معنی به نظر می رسد. با این حال، هدف از این ویژگی این است که قادر به ساخت تنها بخشی از یک "امتیاز" در یک زمان، برای به حداقل رساندن استفاده از حافظه است. شما می توانید گره های بیشتری را در حالی که در وسط یک رندر به حالت تعلیق درآمده اید ایجاد کنید.

به عنوان مثال، سونات مهتاب بتهوون شامل حدود 6500 نت است . هر "یادداشت" احتمالاً به حداقل چند گره نمودار صوتی (مانند یک AudioBuffer و یک گره Gain) تجزیه می شود. اگر می‌خواهید کل هفت و نیم دقیقه را با OfflineAudioContext در یک بافر رندر کنید، احتمالاً نمی‌خواهید همه آن گره‌ها را همزمان ایجاد کنید. درعوض، می‌توانید آن‌ها را در تکه‌های زمان ایجاد کنید:

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();
}

این به شما امکان می‌دهد تعداد گره‌هایی را که باید از قبل در ابتدای رندر ایجاد شوند، به حداقل برسانید و تقاضای حافظه را کاهش دهید.

IIRFfilterNode

این مشخصات یک گره برای علاقه‌مندان به صدا اضافه کرده است که می‌خواهند پاسخ بی‌نهایت تکانه‌ای دقیقاً مشخص شده خود را ایجاد کنند: IIRFilterNode . این فیلتر مکمل BiquadFilterNode است، اما اجازه می دهد تا مشخصات کامل پارامترهای پاسخ فیلتر (به جای AudioParams با استفاده آسان BiquadFilterNode برای نوع، فرکانس، Q و موارد مشابه). IIRFilterNode اجازه می دهد تا مشخصات دقیق فیلترهایی را که قبلاً نمی توان ایجاد کرد، مانند فیلترهای تک مرتبه، مشخص کرد. با این حال، استفاده از IIRFilterNode نیاز به دانش عمیقی در مورد نحوه عملکرد فیلترهای IIR دارد و همچنین مانند BiquadFilterNodes قابل زمانبندی نیستند.

تغییرات قبلی

همچنین می‌خواهم به چند بهبودی اشاره کنم که قبلاً انجام شده است: در Chrome 48، اتوماسیون گره BiquadFilter با نرخ صدا شروع به کار کرد. API برای انجام این کار اصلاً تغییر نکرده است، اما این بدان معناست که جابجایی فیلتر شما حتی نرم‌تر به نظر می‌رسد. همچنین در کروم 48، با برگرداندن گره‌ای که به آن متصل می‌شویم، زنجیره‌سازی را به متد AudioNode.connect() اضافه کردیم. این کار ایجاد زنجیره‌ای از گره‌ها را ساده‌تر می‌کند، مانند این مثال :

sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);

فعلاً همین است و به تکان دادن ادامه دهید!

،

کریس ویلسون
Chris Wilson

Chrome به طور مداوم و بی سر و صدا پشتیبانی خود را از Web Audio API بهبود می بخشد. در کروم 49 (بتا از فوریه 2016 و انتظار می رود در مارس 2016 پایدار باشد) چندین ویژگی را برای ردیابی مشخصات به روز کرده ایم و همچنین یک گره جدید اضافه کرده ایم.

()decodeAudioData اکنون یک وعده را برمی گرداند

متد decodeAudioData () در AudioContext اکنون یک Promise برمی‌گرداند که مدیریت الگوی ناهمزمان مبتنی بر Promise را امکان‌پذیر می‌کند. متد decodeAudioData() همیشه توابع پاسخ به تماس موفقیت و خطا را به عنوان پارامتر در نظر گرفته است:

context.decodeAudioData( arraybufferData, onSuccess, onError);

اما اکنون می‌توانید از روش استاندارد Promise برای مدیریت ماهیت ناهمزمان رمزگشایی داده‌های صوتی استفاده کنید:

context.decodeAudioData( arraybufferData ).then(
        (buffer) => { /* store the buffer */ },
        (reason) => { console.log("decode failed! " + reason) });

اگرچه در یک مثال این موضوع پرمخاطب تر به نظر می رسد، اما Promises برنامه نویسی ناهمزمان را آسان تر و سازگارتر می کند. برای سازگاری، عملکردهای بازگشت به تماس موفقیت و خطا مطابق با مشخصات هنوز پشتیبانی می شوند.

OfflineAudioContext اکنون از suspend() و resume() پشتیبانی می کند.

در نگاه اول، ممکن است عجیب باشد که suspend() در OfflineAudioContext داشته باشید. پس از همه، suspend() به AudioContext اضافه شد تا بتواند سخت افزار صوتی را در حالت آماده به کار قرار دهد، که در سناریوهایی که در حال رندر کردن در یک بافر (که البته OfflineAudioContext برای آن است) بی معنی به نظر می رسد. با این حال، هدف از این ویژگی این است که قادر به ساخت تنها بخشی از یک "امتیاز" در یک زمان، برای به حداقل رساندن استفاده از حافظه است. شما می توانید گره های بیشتری را در حالی که در وسط یک رندر به حالت تعلیق درآمده اید ایجاد کنید.

به عنوان مثال، سونات مهتاب بتهوون شامل حدود 6500 نت است . هر "یادداشت" احتمالاً به حداقل چند گره نمودار صوتی (مانند یک AudioBuffer و یک گره Gain) تجزیه می شود. اگر می‌خواهید کل هفت و نیم دقیقه را با OfflineAudioContext در یک بافر رندر کنید، احتمالاً نمی‌خواهید همه آن گره‌ها را همزمان ایجاد کنید. درعوض، می‌توانید آن‌ها را در تکه‌های زمان ایجاد کنید:

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();
}

این به شما امکان می‌دهد تعداد گره‌هایی را که باید از قبل در ابتدای رندر ایجاد شوند، به حداقل برسانید و تقاضای حافظه را کاهش دهید.

IIRFfilterNode

این مشخصات یک گره برای علاقه‌مندان به صدا اضافه کرده است که می‌خواهند پاسخ بی‌نهایت تکانه‌ای دقیقاً مشخص شده خود را ایجاد کنند: IIRFilterNode . این فیلتر مکمل BiquadFilterNode است، اما اجازه می دهد تا مشخصات کامل پارامترهای پاسخ فیلتر (به جای AudioParams با استفاده آسان BiquadFilterNode برای نوع، فرکانس، Q و موارد مشابه). IIRFilterNode اجازه می دهد تا مشخصات دقیق فیلترهایی را که قبلاً نمی توان ایجاد کرد، مانند فیلترهای تک مرتبه، مشخص کرد. با این حال، استفاده از IIRFilterNode نیاز به دانش عمیقی در مورد نحوه عملکرد فیلترهای IIR دارد و همچنین مانند BiquadFilterNodes قابل زمانبندی نیستند.

تغییرات قبلی

همچنین می‌خواهم به چند بهبودی اشاره کنم که قبلاً انجام شده است: در Chrome 48، اتوماسیون گره BiquadFilter با نرخ صدا شروع به کار کرد. API برای انجام این کار اصلاً تغییر نکرده است، اما این بدان معناست که جابجایی فیلتر شما حتی نرم‌تر به نظر می‌رسد. همچنین در کروم 48، با برگرداندن گره‌ای که به آن متصل می‌شویم، زنجیره‌سازی را به متد AudioNode.connect() اضافه کردیم. این کار ایجاد زنجیره‌ای از گره‌ها را ساده‌تر می‌کند، مانند این مثال :

sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);

فعلاً همین است و به تکان دادن ادامه دهید!