( تعداد نمایش : 1685 )

آموزش DirectXAudio

موضوع : پخش افکتهای صوتی در برنامه های مالتی مدیا

مقدمه : در سلسله مباحث DirectXAudio شما تکنیکهای لازم برای اضافه کردن موزیک و افکتهای صوتی سریع و دینامیک را به بازیها و برنامه های مالتی مدیا خواهید آموخت . DirectXAudio جایگزینی برای بخشهای DirectSound ، DirectSound3D و DirectMusic موجود در DirectX 7 می باشد و دارای امکانات بهتر و سریعتری بوده و برنامه نویسی آن نیز ساده تر است .
در اولین درس از DirectXAudio چگونگی پخش افکتهای صوتی را در برنامه هایتان خواهید آموخت .

Initial کردن DirectSound :
DirectSound اولین مبحثی است که آنرا توضیح خواهم داد . گرچه DirectXAudio یک نام عمومی برای امکانات صوتی DirectX8 می باشد اما بین Sound و Music تفاوت وجود دارد .
DirectSound با پخش افکتهای صوتی ارتباط دارد . DirectSound همانند Direct3D از یکسری device سخت افزاری و نرم افزاری استفاده می کند و افکتهای صوتی در یکسری بافر ذخیره می شوند .
اولین قدم برای برپاسازی DirectSound ، اضافه کردن کتابخانه DirectX8 به پروژه تان می باشد . قدم بعدی تعریف متغیرها و object های موردنیاز است . برای استفاده از DirectSound به متغیرهای زیر نیاز داریم :

Private DX As DirectX8
Private DS As DirectSound8
Private DSBuffer As DirectSoundSecondaryBuffer8
Private DSEnum As DirectSoundEnum8
Private bLoaded As Boolean


DirectX شی کنترل کننده مرکزی است . DirectSound8 واسط مراقب برای تمام interface های پخش صدا است . DirectSoundSecondaryBuffer8 داده audio واقعی را برای پخش ذخیره می کند . DirectSoundEnum8 اجازه می دهد که اطلاعاتی را در مورد device های سخت افزاری/نرم افزاری استخراج کنید و متغیر bLoaded یک flag وضعیت می باشد .
حال در برنامه باید لیست تمام device های در دسترس را مشخص کنیم . ( این امر کاملاً امکان پذیر است که یک کامپیوتر بیش از یک device برای DirectSound داشته باشد ) :

Private Sub Form_Load()x
bLoaded = False
Dim I As Long
Set DX = New DirectX8
Set DSEnum = DX.GetDSEnum
For I = 1 To DSEnum.GetCount
MsgBox(DSEnum.GetDescription(I))x
Next I
End Sub


فرض کنیم که یکی از device های شناخته شده را انتخاب کردیم . حال بایستی device را واقعاً برپا کنیم :

If bLoaded Then
Set DSBuffer = Nothing
Set DS = Nothing
Set DX = Nothing
End If
Dim DSBDesc As DSBUFFERDESC
Set DX = New DirectX8
Set DS = DX.DirectSoundCreate(DSEnum.GetGuid(devicenumber))x
DS.SetCooperativeLevel frmMain.hWnd, DSSCL_NORMAL


متغیر devicenumber شماره device ای است که شما می خواهید با آن کار کنید . DSBDesc فایل صوتی شما را توصیف می کند .
——————————–

موضوع : پخش افکتهای صوتی در برنامه های مالتی مدیا

ساخت بافر و play کردن آن : تاکنون ما توانستیم DirectSound را initial کنیم . همانطور که می دانید در تمام component های DirectX داده ها در یکسری بافر ذخیره می شوند . در مورد DirectSound نیز ما یک بافر با نام DirectSoundSecondaryBuffer8 می سازیم و داده های صوتی را در آن قرار می دهیم . برخی پارامتر ها هستند که باید برای بافر تنظیم شوند مثل : stereo یا mono بودن بافر ، ۸ بیتی یا ۱۶ بیتی بودن بافر ، فرکانس صوتی ( ۲۲khz ، ۴۴khz و غیره ) . اگر این پارامترها را مشخص نکنیم DirectSound از اطلاعات فایل صوتی استفاده می کند .
در یک کاربرد ساده ، ما تنها یک بافر صوتی از یک فایل ایجاد می کنیم اما امکان ایجاد چندین بافر بطور همزمان و نیز پخش چندین صدا بطور همزمان نیز وجود دارد :

DSBDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & “\Sample.wav”, DSBDesc)x
MsgBox “SOUND BUFFER CREATED:”x
MsgBox “Buffer Size: ” & DSBDesc.lBufferBytes & “bytes (” & Round(DSBDesc.lBufferBytes / 1024, 3) & “kb)”x
MsgBox “Buffer Channel Count:” & DSBDesc.fxFormat.nChannelsIIf(DSBDesc.fxFormat.nChannels = 1, ” (Mono)”, ” (Stereo)”)x
MsgBox “Buffer Bits per channel: ” & DSBDesc.fxFormat.nBitsPerSample & ” bits”x


در بالا یک بافر صوتی ایجاد شده و اطلاعات صدا از فایل به بافر load شده است .
حال بایستی داده صوتی موجود در بافر را play کنیم :
دستور لازم برای Play کردن بافر بصورت loop :

DSBuffer.Play DSBPLAY_LOOPING


دستور لازم برای Play کردن بافر بدون loop :

DSBuffer.Play DSBPLAY_DEFAULT


دستورات لازم برای Stop کردن بافر :

DSBuffer.Stop
DSBuffer.SetCurrentPosition 0


دستور لازم برای Pause کردن بافر :

DSBuffer.Stop


تنظیم خصوصیات بافر : سه خصوصیت وجود دارد که در مورد بافر تنظیم می شود pannig ، volume و frequency
محدوده مقادیر pannig بین اعداد زیر است :
DSBPAN_LEFT = -10,000
DSBPAN_CENTER = 0
DSBPAN_RIGHT = 10,000
توسط متد SetPan می توان pannig بافر را تنظیم کرد :

DSBuffer.SetPan yourValue


DirectSound صدا را تقویت نمی کند بلکه آنرا تضعیف می نماید بنابراین ماکزیمم volume عبارت است از volume ای که فایل صوتی با آن ضبط شده است . بعبارت دیگر محدود مقادیر volume بین اعداد زیر است :
DSBVOLUME_MAX = 0
DSBVOLUME_MIN = -10000
توسط متد SetVolume می توان volume بافر را تنظیم کرد :

DSBuffer.SetVolume yourValue


محدود فرکانسی DirectSound عبارت است از :
DSBFREQUENCY_MIN = 100 (hz)x
DSBFREQUENCY_MAX = 100000 (hz) = 100khz x
توسط متد SetFrequency می توان فرکانس بافر را تنظیم کرد :

DSBuffer.SetFrequency yourValue


—————————————

موضوع : پخش موزیک توسط DirectMusic

مقدمه :

در اولین درس از آموزش DirectXAudio با چگونگی پخش افکتهای صوتی آشنا شدید . اکنون این توانایی را دارید که یک engine ساده صوتی بنویسید . در این بخش مبانی پخش موزیک را فرا خواهید گرفت . پس از این درس شما می توانید یک ماژوال برای پخش موزیکهای پس زمینه و افکتهای صوتی برای برنامه هایتان ایجاد کنید .

Initil کردن DirectMusic8 :

قبل از هر کار بایستی ماژول DirectMusic8 را مقداردهی اولیه کنید . اینکار بصورت زیر انجام می شود :

Option ExplicitImplements DirectXEvent8
Private oDX As DirectX8
Private oDMPerf As DirectMusicPerformance8
Private oDMLoader As DirectMusicLoader8
Private oDMSeg As DirectMusicSegment8

Dim dmParams As DMUS_AUDIOPARAMS
Set oDX = New DirectX8
Set oDMPerf = oDX.DirectMusicPerformanceCreate
Set oDMLoader = oDX.DirectMusicLoaderCreate
oDMPerf.InitAudio frmMain.hWnd, DMUS_AUDIOF_ALL, dmParams, Nothing, DMUS_APATH_DYNAMIC_STEREO, 128
oDMPerf.SetMasterAutoDownload True


شی DirectMusicLoader8 کمک می کند تا موزیک درون بافر load شود .
شی DirectMusicSegment8 مموزیکی را که باید پخش شود ذخیره می کند .
کد فوق کافی است یکبار زمانیکه برنامه آغاز می شود ، اجرا گردد .
اکنون ما یک واسط مقدار دهی شده از DirectMusic داریم اما قبل از اینکه موزیک را Load کرده و پخش کنیم چگونگی terminate کردن DirectMusic را در زیر می بینید :

If ObjPtr(oDMSeg)Then Set oDMSeg = Nothing
If ObjPtr(oDMLoader)Then Set oDMLoader = Nothing
If Not (oDMPerf Is Nothing) Then
oDMPerf.CloseDown
Set oDMPerf = Nothing
End If
If ObjPtr(oDX) Then Set oDX = Nothing

پیغامها :

در برخی از component های DirectX8 مثل Input , Sound , Music و Play برنامه شما بایستی یک سیستم messaging را برپا کند تا DirectX زمان وقوع برخی رخدادهای خاص را بشما گزارش دهد . این مطلب بخصوص زمانیکه یک موزیک را پخش می کنید مفید است برای مثال می تواند زمان خاتمه یافتن موزیک را به شما اطلاع دهد و آنگاه شما می توانید قطعه موزیک بعدی را پخش کنید .
پیغامها توسط یک سیستم callback انجام می شوند . کد زیر را در تابع InitDMusic تان پس از initial کردن DirectMusic8 قرار دهید :

oDMPerf.AddNotificationType DMUS_NOTIFY_ON_SEGMENT
hEvent = oDX.CreateEvent(Me)x
oDMPerf.SetNotificationHandle hEvent


اولین سطر به DirectMusic می گوید چه نوع پیغامهایی را می خواهید به برنامه تان بفرستد . چندین نوع پیغام وجود دارد :
DMUS_NOTIFY_ON_SEGMENT = اطلاعات موزیک فعلی ( شروع پخش ، پایان پخش و غیره )
DMUS_NOTIFY_ON_CHORD = اطلاعات تغییر chord موزیک
DMUS_NOTIFY_ON_COMMAND = زمانیکه یک event فرمانی صدا زده شود .
DMUS_NOTIFY_ON_MEASUREANDBEAT = اطلاعات beat/measure مربوط به موزیک فعلی
DMUS_NOTIFY_ON_PERFORMANCE = که event مربوط به سطح performance می باشد .
DMUS_NOTIFY_ON_RECOMPOSE = که recomposition event می باشد .
آخرین بخش از پیغام دهی ، تابع اصلی آن می باشد . همانطور که در بخش Initial کردن DirectMusic دیدید یک توصیف بصورت Implements DirectXEvent8 داشتیم . بخش اصلی تابع callback مربوط به DirectXEvent8 ، شامل یک select case است که بین پیغامهای مختلف سوئیچ می کند :

Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)x
If eventid = hEvent Then
Dim dmMSG As DMUS_NOTIFICATION_PMSG
If Not oDMPerf.GetNotificationPMSG(dmMSG) Then
Else
Select Case dmMSG.lNotificationOption
Case DMUS_NOTIFICATION_SEGABORT
Case DMUS_NOTIFICATION_SEGALMOSTEND
Case DMUS_NOTIFICATION_SEGEND
Case DMUS_NOTIFICATION_SEGLOOP
Case DMUS_NOTIFICATION_SEGSTART
Case Else
End Select
End If
End If
End Sub

پخش موزیک / متوقف کردن موزیک :

برای پخش یک موزیک ابتدا بایستی آنرا load کنید . اینکار توسط کد زیر انجام می شود :

oDMLoader.SetSearchDirectory App.Path & “\”x
Set oDMSeg = oDMLoader.LoadSegment(App.Path & FILENAME)oDMSeg.SetStandardMidiFile


DirectMusic تنها چهار نوع فرمت صوتی را می پذیرد : WAV ، MID ، RMI و SEG .
برای پخش فایلهای MP3 بایستی از DirectXShow استفاده کنید که آنرا در درسهای بعدی خواهید دید .
اکنون که داده های فایل صوتی درون بافر load شد می توانید آنرا پخش کنید :

oDMSeg.SetRepeats 0
oDMPerf.PlaySegmentEx oDMSeg, DMUS_SEGF_DEFAULT, 0


تعداد پخش شدن فایل را با متد SetRepets تنظیم کنید . اگر این مقدار صفر باشد ، آهنگ تنها یکبار پخش می شود و اگر ۱- باشد بطور ممتد پخش خواهد شد .
برای متوقف کردن موزیک از کد زیر استفاده کنید :

oDMPerf.StopEx oDMSeg, 0, DMUS_SEGF_DEFAULT


برای تنظیم میزان صدا از متد SetMasterVolume استقاده کنید :

oDMPerf.SetMasterVolume yourvalue


رنج صدا بین ۲۰+ دسی بل تا ۲۰۰- دسی بل است .
برای تنظیم Tempo از متد SetMasterTempo استفاده کنید :

oDMPerf.SetMasterTempo yourvalue/ 100


بطور نرمال tempo برابر ۱ می باشد . عدد ۲ سرعت را دو برابر می کند و عدد ۰ موزیک را قطع می کند .
——————————-

موضوع : ایجاد صدای سه بعدی توسط DirectSound3D

مقدمه

تاکنون با چگونگی پخش افکتهای صوتی و موسیقی پس زمینه توسط DirectXAudiuo آشنا شدید . این مطالب برای کاربردهای ساده مناسبند اما اینکه فقط ما صدای استریو داشته باشیم کافی نیست و در کاربردهاب حرفه ای بایستی از صداهای کاملاً سه بعدی استفاده کنیم .
با استفاده از افکتهای صوتی سه بعدی می توانیم صدا را در تمام جهتها برای کاربر شبیه سازی کنیم اما با همه مزایای صدای سه بعدی ، دو اشکال برای آن وجود دارد : اول اینکه پخش صدای سه بعدی پیچیده تر از پخش صدای عادی است و تنها کارت های سخت افزاری جدید بطور کاملاً واقعی از آن پشتیبانی می کنند و دوم اینکه صدای سه بعدی با ۴ بلندگو یا بیشتر حاصل می شود – کیفیت حالت ۲ بلندگو بد نیست اما در مقایسه با حالت ۴ بلندگو ، بسیار کیفیت صدای سه بعدی پایین است .

برپاسازی DirectSound3D

برپاسازی صدای سه بعدی چندان پیچیده نیست اما هر بافر صوتی که برای یک صدای سه بعدی می سازید ، یک overhead را به سیستم تان اضافه می کند . همچنین برخی درایورها هستند که تنها اجازه ایجاد تعداد محدودی بافر سه بعدی را در یک لحظه می دهند و نیز اغلب درایورها تعداد بافرهای سه بعدی که می توان در یک لحظه پخش کرد را محدود می کنند ( معمولاً ۸ تا ۱۶ بافر ) .
اولین قدم در استفاده از صدای سه بعدی تعریف متغیرها و اشیا زیر است :

Dim DSBuffer As DirectSoundSecondaryBuffer8
Dim DSBuffer3D As DirectSound3DBuffer8
Dim DSBListener As DirectSound3DListener8


تنها دو شی آخر برای شما جدید هستند . شی DirectSound3dBuffer8 یک ارائه سه بعدی از بافرهای عادی است . ما همچنان از DirectSoundSecondaryBuffer8 برای نگهداری داده صوتی استفاده می کنیم و از DirectSound3Dbuffer8 برای نگهداری پارامترهای سه بعدی و تنظیمات سه بعدی استفاده می کنیم . شی DirectSound3Dlistener8 نیز یک listener است و برای تنظیم کردن سرعت و جهت صدا و برخی پارامترهای دیگر استفاده می شود .
مرحله دوم ، ساخت بافر صوتی است . این کار در دو بخش انجام می شود . اول ما یک بافر صوتی نرمال می سازیم و سپس یک واسط بافر صوتی سه بعدی را از آن بدست می آوریم :

If Not (DSBuffer Is Nothing) Then DSBuffer.Stop
Set DSBuffer = Nothing
DSBDesc.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_CTRLVOLUME
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & “\blip.wav”, DSBDesc)x
If DSBDesc.fxFormat.nChannels > 1 Then
MsgBox “You can only use mono (1 channel) sounds with DirectSound3D”x
End If
If optLow.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_NO_VIRTUALIZATION
If optMedium.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_HRTF_LIGHT
If optHigh.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_HRTF_FULL
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & “\blip.wav”, DSBDesc)x
Set DSBuffer3D = DSBuffer.GetDirectSound3DBuffer()x


سه نکته است که باید به آن دقت شود :
۱ – اضافه کردن DSBCAPS_CTRL3D بسیار مهم است . شما اگر این پارامتر را بکار نبرید ، قادر نخواهید بود که واسط سه بعدی را بدست آورید .
۲ – ما بایستی تنها از افکتهای صوتی Mono ( تک کاناله ) استفاده کنیم زیرا افکت صوتی استریو در صدای سه بعدی معنا ندارد زیرا صدا از یک نقطه در فضای سه بعدی می آید .
۳ – سطح الگوریتم سه بعدی – که در پارامتر DSBDesc.guid3Dalgorhthm آمده . حالت NO VIRTULIZATION تنها از CPU استفاده می کند و روی تمام سیستم ها کار می کند اما افکتها مینیمم هستند . حالت HRTF LIGHT هم از CPU و هم سخت افزار کارت صوتی استفاده می کند و کیفیت بهتری را نسبت به خالت اول ارائه می دهد . حالت HRTF FULL بهترین حالت است اما در صورتی درست کار می کند که یک سخت افزار سه بعدی داشته باشید .
آخرین پارامتری که باید تنظیم کنیم شی listener است :

DSBDesc_2.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_PRIMARYBUFFER
Set DSBPrimary = DS.CreatePrimarySoundBuffer(DSBDesc_2) x
Set DSBListener = DSBPrimary.GetDirectSound3Dlistener
DSBListener.SetOrientation 0#, 0#, 1#, 0#, 1#, 0#, DS3D_IMMEDIATE


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

چند پارامتر وجود دارد که می توان آنها را تغییر داد :
۱ – Volume : عدد ۰ بیشترین میزان صدا و عدد ۳۰۰۰ – کمترین میزان صدا را دارد :

If DSBuffer Is Nothing Then Exit Sub
DSBuffer.SetVolume scrlVolume.Value


2 – Position : تنظیم محل listener :

DSBuffer3D.SetPosition Src_X, 0, Src_Y, DS3D_IMMEDIATE
DSBListener.SetPosition Src_X, 0, Src_Y, DS3D_IMMEDIATE


3 – Velocity : تنظیم سرعت و جهت منبع صدا :

DSBuffer3D.SetVelocity X, Y, Z, DS3D_IMMEDIATE
DSBListener.SetVelocity X, Y, Z, DS3D_IMMEDIATE


4 – Dppler Effect : انحراف صدا از مسیری که می پیماید انحراف سرعت حرکت صدا :

DSBListener.SetDopplerFactor CSng(scrlDoppler.Value), DS3D_IMMEDIATE


5 – Rolloff Effect : rolloff چگونگی تضعیف صدا با تغییر فاصله است .

DSBListener.SetRolloffFactor CSng(scrlRolloff.Value), DS3D_IMMEDIATE


6 – Distance : ماکزیمم فاصله ای که یک صدا می تواند شنیده شود :

DSBuffer3D.SetMaxDistance 250, DS3D_IMMEDIATE
DSBuffer3D.SetMinDistance 0.01, DS3D_IMMEDIATE

————————–

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن