Chrome 49-এ ওয়েব অডিও আপডেট

ক্রিস উইলসন
Chris Wilson

Chrome ধারাবাহিকভাবে এবং শান্তভাবে ওয়েব অডিও API- এর জন্য তার সমর্থন উন্নত করে চলেছে৷ ক্রোম 49-এ (ফেব্রুয়ারি 2016 থেকে বিটা, এবং মার্চ 2016-এ স্থিতিশীল হওয়ার প্রত্যাশা) আমরা স্পেসিফিকেশন ট্র্যাক করার জন্য বেশ কয়েকটি বৈশিষ্ট্য আপডেট করেছি, এবং একটি নতুন নোডও যুক্ত করেছি।

decodeAudioData() এখন একটি প্রতিশ্রুতি প্রদান করে

AudioContextdecodeAudioData () পদ্ধতিটি এখন একটি Promise প্রদান করে, প্রতিশ্রুতি-ভিত্তিক অ্যাসিঙ্ক্রোনাস প্যাটার্ন পরিচালনা সক্ষম করে। decodeAudioData() পদ্ধতি সর্বদা সাফল্য এবং ত্রুটি কলব্যাক ফাংশনকে পরামিতি হিসাবে গ্রহণ করেছে:

context.decodeAudioData( arraybufferData, onSuccess, onError);

কিন্তু এখন আপনি পরিবর্তে অডিও ডেটা ডিকোড করার অ্যাসিঙ্ক্রোনাস প্রকৃতি পরিচালনা করতে স্ট্যান্ডার্ড প্রতিশ্রুতি পদ্ধতি ব্যবহার করতে পারেন:

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

যদিও একটি একক উদাহরণে এটি আরও ভার্বস দেখায়, প্রতিশ্রুতিগুলি অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে সহজ এবং আরও সামঞ্জস্যপূর্ণ করে তোলে। সামঞ্জস্যের জন্য, স্পেসিফিকেশন অনুযায়ী সাফল্য এবং ত্রুটি কলব্যাক ফাংশন এখনও সমর্থিত।

OfflineAudioContext এখন সাসপেন্ড() এবং রিজুমে() সমর্থন করে

প্রথম নজরে, একটি OfflineAudioContext- এ suspend() থাকা অদ্ভুত বলে মনে হতে পারে। সর্বোপরি, অডিও হার্ডওয়্যারটিকে স্ট্যান্ডবাই মোডে রাখতে সক্ষম করতে AudioContextsuspend() যুক্ত করা হয়েছিল, যা আপনি যখন একটি বাফারে রেন্ডার করছেন তখন পরিস্থিতিতে অর্থহীন বলে মনে হয় (অবশ্যই OfflineAudioContext এর জন্য)। যাইহোক, এই বৈশিষ্ট্যটির মূল বিষয় হল মেমরির ব্যবহার কমাতে একটি সময়ে একটি "স্কোর" এর শুধুমাত্র অংশ তৈরি করতে সক্ষম হওয়া। রেন্ডারের মাঝখানে স্থগিত থাকা অবস্থায় আপনি আরও নোড তৈরি করতে পারেন।

উদাহরণ হিসাবে, বিথোভেনের মুনলাইট সোনাটাতে প্রায় 6,500টি নোট রয়েছে । প্রতিটি "নোট" সম্ভবত অন্তত কয়েকটি অডিও গ্রাফ নোড (যেমন একটি অডিওবাফার এবং একটি গেইন নোড) ডিকনস্ট্রাকট করে। আপনি যদি 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();
}

এটি আপনাকে রেন্ডারিংয়ের শুরুতে প্রাক-তৈরি করা প্রয়োজন এমন নোডের সংখ্যা কমাতে এবং মেমরির চাহিদা কমাতে সক্ষম করবে।

IIRFilterNode

স্পেকটি অডিওফাইলদের জন্য একটি নোড যুক্ত করেছে যারা তাদের নিজস্ব সুনির্দিষ্ট-নির্দিষ্ট অসীম-আবেগ-প্রতিক্রিয়া তৈরি করতে চায়: IIRFilterNode । এই ফিল্টারটি BiquadFilterNode-এর পরিপূরক, কিন্তু ফিল্টার প্রতিক্রিয়া পরামিতিগুলির সম্পূর্ণ স্পেসিফিকেশনের অনুমতি দেয় (টাইপ, ফ্রিকোয়েন্সি, Q, এবং এই ধরনের জন্য BiquadFilterNode এর সহজে ব্যবহারযোগ্য AudioParams পরিবর্তে)। IIRFilterNode ফিল্টারগুলির সুনির্দিষ্ট স্পেসিফিকেশনের অনুমতি দেয় যা আগে তৈরি করা যায়নি, যেমন একক-অর্ডার ফিল্টার; যাইহোক, IIRFilterNode ব্যবহার করার জন্য IIR ফিল্টারগুলি কীভাবে কাজ করে সে সম্পর্কে কিছু গভীর জ্ঞানের প্রয়োজন, এবং সেগুলি BiquadFilterNodes-এর মতো নির্ধারিত নয়।

পূর্ববর্তী পরিবর্তন

আমি কিছু উন্নতি উল্লেখ করতে চাই যা আগে হয়েছে: ক্রোম 48-এ, BiquadFilter নোড অটোমেশন অডিও হারে চলতে শুরু করেছে। এটি করার জন্য API মোটেও পরিবর্তন করেনি, তবে এর মানে হল আপনার ফিল্টার সুইপগুলি আরও মসৃণ শোনাবে। এছাড়াও Chrome 48-এ, আমরা যে নোডের সাথে সংযোগ করছি সেটি ফিরিয়ে দিয়ে AudioNode.connect() পদ্ধতিতে চেইনিং যুক্ত করেছি। এটি নোডের চেইন তৈরি করা সহজ করে তোলে, যেমন এই উদাহরণে :

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

যে আপাতত সব, এবং দোলনা রাখা!

,

ক্রিস উইলসন
Chris Wilson

Chrome ধারাবাহিকভাবে এবং শান্তভাবে ওয়েব অডিও API- এর জন্য তার সমর্থন উন্নত করে চলেছে৷ ক্রোম 49-এ (ফেব্রুয়ারি 2016 থেকে বিটা, এবং মার্চ 2016-এ স্থিতিশীল হওয়ার প্রত্যাশা) আমরা স্পেসিফিকেশন ট্র্যাক করার জন্য বেশ কয়েকটি বৈশিষ্ট্য আপডেট করেছি, এবং একটি নতুন নোডও যুক্ত করেছি।

decodeAudioData() এখন একটি প্রতিশ্রুতি প্রদান করে

AudioContextdecodeAudioData () পদ্ধতিটি এখন একটি Promise প্রদান করে, প্রতিশ্রুতি-ভিত্তিক অ্যাসিঙ্ক্রোনাস প্যাটার্ন পরিচালনা সক্ষম করে। decodeAudioData() পদ্ধতি সর্বদা সাফল্য এবং ত্রুটি কলব্যাক ফাংশনকে পরামিতি হিসাবে গ্রহণ করেছে:

context.decodeAudioData( arraybufferData, onSuccess, onError);

কিন্তু এখন আপনি পরিবর্তে অডিও ডেটা ডিকোড করার অ্যাসিঙ্ক্রোনাস প্রকৃতি পরিচালনা করতে স্ট্যান্ডার্ড প্রতিশ্রুতি পদ্ধতি ব্যবহার করতে পারেন:

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

যদিও একটি একক উদাহরণে এটি আরও ভার্বস দেখায়, প্রতিশ্রুতিগুলি অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে সহজ এবং আরও সামঞ্জস্যপূর্ণ করে তোলে। সামঞ্জস্যের জন্য, স্পেসিফিকেশন অনুযায়ী সাফল্য এবং ত্রুটি কলব্যাক ফাংশন এখনও সমর্থিত।

OfflineAudioContext এখন সাসপেন্ড() এবং রিজুমে() সমর্থন করে

প্রথম নজরে, একটি OfflineAudioContext- এ suspend() থাকা অদ্ভুত বলে মনে হতে পারে। সর্বোপরি, অডিও হার্ডওয়্যারটিকে স্ট্যান্ডবাই মোডে রাখতে সক্ষম করতে AudioContextsuspend() যুক্ত করা হয়েছিল, যা আপনি যখন একটি বাফারে রেন্ডার করছেন তখন পরিস্থিতিতে অর্থহীন বলে মনে হয় (অবশ্যই OfflineAudioContext এর জন্য)। যাইহোক, এই বৈশিষ্ট্যটির মূল বিষয় হল মেমরির ব্যবহার কমাতে একটি সময়ে একটি "স্কোর" এর শুধুমাত্র অংশ তৈরি করতে সক্ষম হওয়া। রেন্ডারের মাঝখানে স্থগিত থাকা অবস্থায় আপনি আরও নোড তৈরি করতে পারেন।

উদাহরণ হিসাবে, বিথোভেনের মুনলাইট সোনাটাতে প্রায় 6,500টি নোট রয়েছে । প্রতিটি "নোট" সম্ভবত অন্তত কয়েকটি অডিও গ্রাফ নোড (যেমন একটি অডিওবাফার এবং একটি গেইন নোড) ডিকনস্ট্রাকট করে। আপনি যদি 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();
}

এটি আপনাকে রেন্ডারিংয়ের শুরুতে প্রাক-তৈরি করা প্রয়োজন এমন নোডের সংখ্যা কমাতে এবং মেমরির চাহিদা কমাতে সক্ষম করবে।

IIRFilterNode

স্পেকটি অডিওফাইলদের জন্য একটি নোড যুক্ত করেছে যারা তাদের নিজস্ব সুনির্দিষ্ট-নির্দিষ্ট অসীম-আবেগ-প্রতিক্রিয়া তৈরি করতে চায়: IIRFilterNode । এই ফিল্টারটি BiquadFilterNode-এর পরিপূরক, কিন্তু ফিল্টার প্রতিক্রিয়া পরামিতিগুলির সম্পূর্ণ স্পেসিফিকেশনের অনুমতি দেয় (টাইপ, ফ্রিকোয়েন্সি, Q, এবং এই ধরনের জন্য BiquadFilterNode এর সহজে ব্যবহারযোগ্য AudioParams পরিবর্তে)। IIRFilterNode ফিল্টারগুলির সুনির্দিষ্ট স্পেসিফিকেশনের অনুমতি দেয় যা আগে তৈরি করা যায়নি, যেমন একক-অর্ডার ফিল্টার; যাইহোক, IIRFilterNode ব্যবহার করার জন্য IIR ফিল্টারগুলি কীভাবে কাজ করে সে সম্পর্কে কিছু গভীর জ্ঞানের প্রয়োজন, এবং সেগুলি BiquadFilterNodes-এর মতো নির্ধারিত নয়।

পূর্ববর্তী পরিবর্তন

আমি কিছু উন্নতি উল্লেখ করতে চাই যা আগে হয়েছে: ক্রোম 48-এ, BiquadFilter নোড অটোমেশন অডিও হারে চলতে শুরু করেছে। এটি করার জন্য API মোটেও পরিবর্তন করেনি, তবে এর মানে হল আপনার ফিল্টার সুইপগুলি আরও মসৃণ শোনাবে। এছাড়াও Chrome 48-এ, আমরা যে নোডের সাথে সংযোগ করছি সেটি ফিরিয়ে দিয়ে AudioNode.connect() পদ্ধতিতে চেইনিং যুক্ত করেছি। এটি নোডের চেইন তৈরি করা সহজ করে তোলে, যেমন এই উদাহরণে :

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

যে আপাতত সব, এবং দোলনা রাখা!