میکسر صوتی

image

تصویری از محیط بازی Terraria

یک بازی پلتفرمر را در نظر بگیرید. فرض کنید صحنه‌ای از این بازی دارای سه کامپوننت Audio Source بوده که «موسیقی متن بازی»، «صدای کاراکتر دشمن» و «صدای طبیعت موجود در بازی» را پخش می‌کنند. می‌خواهیم در هنگام پریدن پلیر درون آب صدای موسیقی متن بازی کم شود، صدای کاراکتر دشمن بم‌تر شده و صدای طبیعت قطع شود. بدیهی است که امکان انجام این کار توسط کد و با استفاده از متد GetComponent<AudioSource> به ازای هر کامپوننت امکان‌پذیر است؛ اما این روش به هیچ عنوان استاندارد نبوده، امکان تغییر تدریجی مقدار داده‌ها (به آسانی) وجود نداشته و در مواردی که تعداد کامپوننت‌ها زیاد باشد عملاً غیرقابل استفاده است. به همین جهت برای انجام این کار از میکسرهای صوتی استفاده می‌کنیم.

میکسر صوتی (Audio Mixer) در یونیتی یک asset (فایلی با فرمت mixer در پروژه) بوده که وظیفه‌ی میکس سیگنال‌های صوتیِ درون بازی (کامپوننت‌های Audio Source)، اعمال افکت‌های صوتی بر روی آن‌ها و مسترینگ را بر عهده دارد. یک پروژه می‌تواند صفر، یک یا چندین میکسر داشته باشد.

با استفاده از میکسر صوتی می‌توان کنترل بیشتری بر پردازش صدا در بازی داشت

هر کامپوننت Audio Source در یونیتی می‌تواند مستقیماً و بدون هیچ واسطه‌ای توسط کامپوننت Audio Listener شنیده شود و یا ابتدا به یک میکسر وارد شده و سپس خروجی میکسر به سمع Audio Listener رسانده شود.

image

برای مدیریت Audio Mixerهای موجود در پروژه از ابزاری به همین نام استفاده می‌شود که در پنجره‌ی Audio Mixer قرار دارد. این پنجره از طریق منوی Window > Audio > Audio Mixer یا با دوبار کلیک بر روی یک asset میکسر باز می‌شود:

image

پنجره‌ی Audio Mixer چهار پنل اصلی دارد که به بررسی آن‌ها می‌پردازیم:

Mixers

image

در این پنل فایل‌های میکسر موجود در پروژه لیست می‌شوند. برای ایجاد یک فایل میکسر جدید بر روی دکمه‌ی + این پنل کلیک کرده و یا از طریق منوی Create پنجره‌ی Project گزینه‌ی Audio Mixer را انتخاب می‌کنیم. در این لیست امکان ایجاد سلسله‌مراتب برای میکسرها (با استفاده از drag and drop) وجود دارد که در این صورت هر میکسر فرزند از تنظیمات میکسر والد خود تبعیت می‌کند.

با کلیک بر روی هرکدام از میکسرهای موجود در این لیست، آن میکسر به حالت انتخاب درآمده و جزئیات آن در پنجره نمایش داده می‌شود.

Groups

image

یک میکسر از چندین group تشکیل می‌شود؛ هر group می‌تواند یک کامپوننت AudioSource را در خود جای دهد. این بخش نیز از سلسله‌مراتب پشتیبانی می‌کند و به همین منظور پس از ساخت میکسر یک group پیش‌فرض با نام Master از قبل در آن وجود خواهد داشت که groupهای جدید زیرمجموعه‌ی آن قرار می‌گیرند تا در صورت لزوم امکان تنظیم گروهی آن‌ها وجود داشته باشد. برای ایجاد یک group بر روی دکمه‌ی + این پنل کلیک کرده و نام دلخواه خود را برای آن وارد می‌کنیم.

در نهایت برای نسبت دادن یک کامپوننت Audio Source به یک group در پراپرتی Output کامپوننت، group موردنظر خود را انتخاب می‌کنیم.

نکته

در حالت عادی groupهای Master تنها به این منظور ایجاد شده‌اند که والد سایر groupها باشند و از این رو در آن‌ها نباید کامپوننت AudioSource قرار داد.

StripView

هر group علاوه بر پنل Groups در قالب نوارهایی در قسمت سمت راست پنجره‌ی Audio Mixer نیز قابل مشاهده است:

image

این نوارها که Strip View نام دارند امکان تنظیم بلندی صدا و افزودن افکت به groupها را فراهم می‌کنند.

هر Strip View دارای سه دکمه با نام‌های S و M و B بوده که وظایف زیر را بر عهده دارند:

  • S یا Solo: صدای سایر groupهای میکسر را قطع می‌کند.

  • M یا Mute: صدای group را قطع می‌کند.

  • B یا Bypass: تاثیر افکت‌ها بر روی group را از بین می‌برد.

نکته

این دکمه‌ها به منظور تست کردن خروجی میکسر و تنها در هنگام توسعه کاربرد دارند

افزودن افکت به groupها: برای افزودن افکت به groupها از منوی Add واقع در پایین هر Strip View استفاده می‌شود. در پایین Strip View لیستی از افکت‌های اعمال شده بر روی این group نیز نمایش داده می‌شود.

هر افکت دارای فیلدهای مختلف بوده که با انتخاب group در پنجره‌ی Inspector امکان مشاهده و تغییر مقادیرشان وجود دارد. برای انتخاب یک group، آن را از پنل Groups انتخاب کرده و یا بر روی Strip View آن کلیک می‌کنیم. Strip View انتخاب شده با کادری آبی متمایز می‌شود.

نوار لغزنده‌ی عمودی واقع در Strip View که در Inspector نیز با نام Volume (به عنوان یکی از فیلدهای افکت Attenuation) قرار دارد میزان صدای group را تعیین می‌کند. افکت Attenuation به طور پیش‌فرض در تمام groupها قرار دارد.

تمام اعمالی که توسط Strip View انجام می‌شوند توسط Inspector مربوط به group هم قابل انجام شدن هستند؛ Strip View تنها دسترسی را ساده‌تر می‌کند

میکسرهای فرزند: همانطور که گفته شد، امکان ایجاد سلسله‌مراتب بین میکسرها در یونیتی وجود دارد. در این حالت میکسر فرزند در قالب یک group در میکسر والد قرار می‌گیرد. به منظور ایجاد این سلسله‌مراتب ابتدا یک group در میکسر والد ایجاد می‌کنیم؛ سپس در پنل Mixers میکسر فرزند را بر روی میکسر والد drag and drop کرده و در پنجره‌ی باز شده group تازه ایجاد شده در میکسر والد را به عنوان ورودی میکسر فرزند انتخاب می‌کنیم.

Snapshots

مثال بازی پلتفرمر را در نظر بگیرید. در این بازی دو حالت «خارج از آب» و «درون آب» متصور شده‌ایم که در حالت دوم تغییراتی در groupها داده‌ایم. در هر حالت هرکدام از تنظیمات groupها می‌توانند در وضعیت متفاوتی قرار داشته باشند. به هر یک از این حالت‌ها یک snapshot گفته می‌شود.

پنل Snapshots لیستی از وضعیت‌های مختلف میکسر که ذخیره شده‌اند را نمایش می‌دهد. برای افزودن یک snapshot جدید به این لیست بر روی دکمه‌ی + پنل کلیک کرده و پس از انتخاب نام برای snapshot تنظیمات موردنظر را بر روی groupها انجام می‌دهیم. تنظیمات وارد شده در هر snapshot از سایر snapshotها مستقل است.

در هنگام اجرای بازی در ابتدا snapshot استارت (که در این پنل با آیکون ستاره متمایز شده است) بر روی سیگنال‌های صوتی اعمال می‌شود که سپس با استفاده از کد می‌توان به سایر snapshotها گذار کرد. برای تعیین یک snapshot به عنوان snapshot استارت بر روی نام آن در لیست Snapshots راست کلیک کرده و گزینه‌ی Set as start Snapshot را انتخاب می‌کنیم.

نکته

groupها و snapshotهای یک میکسر به عنوان زیرمجموعه‌های آن در asset میکسر واقع در پنجره‌ی Project قرار می‌گیرند:

image

این دو مفهوم در اسکریپت‌های یونیتی در قالب اشیایی از کلاس‌های AudioMixerGroup و AudioMixerSnapshot (در فضای نام UnityEngine.Audio) قابلیت تعریف دارند. به عنوان مثال برای گذار به یک snapshot جدید (تبدیل مقادیر snapshot فعلی به مقادیر snapshot جدید) از طریق اسکریپت ابتدا یک پراپرتی از نوع AudioMixerSnapshot (با نام فرضی myAudioMixerGroup) ایجاد کرده و snapshot مدنظر خود را به آن نسبت می‌دهیم. سپس از قطعه کد myAudioMixerGroup.TransitionTo(1.0f); استفاده می‌کنیم. ورودی متد TransitionTo مدت زمان گذار بر حسب ثانیه را تعیین می‌کند.

Views

در پنل Groups در کنار نام هر group یک آیکون چشم قرار دارد که عملکردی مانند پنل لایه‌های فتوشاپ داشته و با استفاده از آن می‌توان groupها را نمایان/مخفی کرد.

در صورتی که تعداد groupهای میکسر زیاد باشد پیدا کردن strip view یک group وقت‌گیر خواهد بود. برای برطرف کردن این مشکل می‌توان از پنل Views استفاده کرد. این پنل وضعیت نمایان/مخفی بودن groupها را در خود ذخیره می‌کند. به این منظور ابتدا groupهایی که قصد مخفی کردنشان در یک حالت را داریم مخفی کرده و سپس بر روی دکمه‌ی + این پنل کلیک می‌کنیم.

با استفاده از این قابلیت می‌توان در هر حالت تنها groupهای مرتبط به هم را نمایش داد و از جستجوی بی‌مورد خودداری کرد. وضعیت نمایانی groupها تاثیری بر میکسر نداشته و تنها برای راحتی کار با ابزار Audio Mixer قرار داده شده است.

expose کردن پارامترها

برای تغییر مقادیر فیلدهای موجود در Inspector هر یک از groupها توسط کد از قابلیتی به نام Exposed Parameters استفاده می‌شود. به این منظور بر روی نام فیلد موردنظر در Inspector راست کلیک کرده و گزینه‌ی Expose …sth… to script را انتخاب می‌کنیم:

image

پس از انجام expose، فیلد به لیست Exposed Parameters واقع در نوار کنترل پنجره‌ی Audio Mixer اضافه می‌شود. برای مشاهده‌ی لیست بر روی دکمه‌ی Exposed Parameters کلیک کنید.

image

یونیتی به ازای هر فیلد expose شده در این لیست یک نام (رشته) به آن اختصاص می‌دهد. این نام که به طور پیش‌فرض MyExposedParam است با دوبار کلیک شدن بر رویش قابلیت rename شدن دارد.

بعد از انجام این مراحل در اسکریپت موردنظر (بعد از وارد کردن فضای نام UnityEngine.Audio) یک پراپرتی از نوع AudioMixer (با نام فرضی myAudioMixer) ایجاد کرده و میکسر حاوی group را به آن نسبت می‌دهیم. حال با استفاده از قطعه کد

myAudioMixer.SetFloat("MyExposedParam", 1.0f);

امکان تغییر یک Exposed Parameter وجود خواهد داشت. در این متد ورودی اول نام رشته در لیست Exposed Parameters و ورودی دوم مقدار مدنظر برای تغییر می‌باشد.