مثال ۸.۰۲: ایجاد یک موج نوسانگر (Oscillator Waveform)

توی این مثال قراره ببینیم چطور میشه یک موج نوسانگر ساده توی جاوا اسکریپت ایجاد کرد و اون رو به دستگاه خروجی صدای سیستم فرستاد. بریم شروع کنیم:

۱- بیاید با ایجاد یک زمینه صدا و اضافه کردن node های oscillator و volume شروع کنیم. کد زیر رو توی قسمت کنسول گوگل کروم بنویسید/کپی-پیست کنید:

// create the audio context
let context = new AudioContext();
// create a gain node
let gain = context.createGain();
// connect the gain node to the context destination
gain.connect(context.destination);
// create an oscillator node
let osci = context.createOscillator();

۲- حالا نوع نوسانگر (oscillator) رو مقدار 'sawtooth' در نظر میگیریم و فرکانس نوسان رو روی 100 میگذاریم. به جای sawtooth میتونید نوع oscillator رو روی sine و square و triangle هم بگذارید. همینطور میتونید یذره فرکانس ها رو هم دستکاری کنید:

// set the oscillation type
osci.type = 'sawtooth';
// set the oscillation frequency
osci.frequency.value = 100;


نکته: فرکانس موج به این اشاره میکنه که هر چند وقت یه بار یه دوره یا چرخه از موج کامل میشه، مثلا 1Hertz یعنی 1 بار در ثانیه. در صورتی که صدا زیرتر (high pitch تر) باشه امواج صدا با فرکانس بیشتری دریافت میکنیم.


۳- در نهایت oscillator رو به gain node اضافه میکنیم و متد ()start از oscillator رو کال میکنیم:

// connect the oscillator node to the gain node
osci.connect(gain);
// start the oscillation node playing
osci.start();

اگه این کد رو با ولوم زیاد اجرا کنید، باید یه صدای نوسانی پی در پی به گوشتون برسه (این صدا شبیه نویز استاتیکی هست که توی رادیو موقع در دسترس نبودن کانال رادیویی میشنوید). بعضی از مرورگر ها با Audio API تا زمانی که توسط کاربر تعاملی با صفحه صورت نگرفته باشه هیچ صدایی پخش نمیکنن. این بخاطر اینه که از پخش صداهای ناخواسته و بدون اطلاع کاربر توسط توسعه دهنده ها جلوگیری کنن. اگه به این مشکل برخوردید، قبل از اجرای کد یه جایی از صفحه رو همینطوری کلیک کنید.

ما میتونیم چندین node سورس مختلف اضافه کنیم، چه از یک نوع باشن (توی مثال ما یک oscillator) یا از چندین نوع مختلف باشن و همچنین میشه هر کدوم از اونا رو به صورت جداگونه کنترل کرد یا node های دیگه مثل pan و gain رو باهاشون به اشتراک گذاشت. البته میتونیم یه کاری کنیم که زمینه های صدامون به یه ورودی خارجی واکنش نشون بدن، مثل ورودی های کاربر یا رویداد های زمانی.