\\ Home : Articoli : Stampa
DirectSound - Audio 3D
Di RobyDx (del 16/12/2007 @ 12:11:12, in DirectX9, linkato 3303 volte)

Negli ultimi anni abbiamo assistito al rapido sviluppo del settore videoludico soffermandoci tuttavia solo sull'aspetto grafico. Numerosi progressi sono stati comunque apportati anche all'audio che nei giochi, ma soprattutto per altri tipi di applicazioni multimediali, rimane un elemento molto importante. Tra i tanti miglioramenti uno di quelli che attira maggiormente è l'audio 3D che come si può facilmente capire è la simulazione del suono reale che proviene alle nostre orecchie da tutte le direzioni dandoci quindi la possibilità di percepire la direzione da cui proviene il suono. DirectX offre la possibilità di creare audio in cui settare la posizione ed altre caratteristiche al fine di ottenere un suono il più possibile reale. Ovviamente molta della qualità dipenderà anche dal tipo di sistema stereofonico a nostra disposizione. Infatti se con un normale sistema a 2 casse possiamo solo vagamente renderci conto della direzione, con un sistema dolby surround riusciremo a sentire perfettamente da dove arrivano i passi del nemico che sta per colpirci.
DirectSound gestisce l'audio in modo molto semplice: a partire da un normale secondaryBuffer si crea un controllo 3D che gestisce automaticamente il suono in base alla posizione e ad altre caratteristiche come ad esempio la velocità per l'effetto doppler (il suono di una sirena che si avvicina e si allontana). A completare il sistema c'è poi un ultimo oggetto che gestisce la posizione dell'ascoltatore. Importantissimo: per essere eseguiti i file wave devono essere di tipo mono e non stereo. Questo perchè i suoni stereo sono già 3D. Controllate quindi le proprietà del file.

Codice

Innanzitutto dichiarate questi tre oggetti

Dim suono3D As Buffer3D
Dim ascoltatore As Listener3D
Dim suono As SecondaryBuffer

Il primo è il buffer3D che controlla la gestione tridimensionale del suono ma non è il suono. Il secondo è l'ascoltatore che serve a gestire la posizione dell'ascoltatore e le sue caratteristiche (l'ascoltatore potrebbe essere in movimento). L'ultimo è un normale secondaryBuffer in cui caricare il suono. E' questo che viene riprodotto.
Potete caricare molti suoni ognuno con il suo buffer3D di controllo. L'ascoltatore è invece unico e quindi non vanno caricati più di uno.

Carichiamo il suono

Dim description As New BufferDescription()
description.Control3D = True
description.ControlVolume = True
description.ControlFrequency = True
description.Guid3DAlgorithm = DSoundHelper.Guid3DAlgorithmHrtfFull
Dim suono As New SecondaryBuffer(filesrc, description, DirectSound)

Come vedete è simile a quanto fatto per il suono normale (i flags lì ho inseriti tramite le apposite proprietà). Notate che non ho espresso il controllo del Pan perchè il bilanciamento tra le casse lo deve fare DirectSound. Il guid serve per regolare come il suono debba essere gestito

Guid3DAlgorithmDefault = Default della scheda
Guid3DAlgorithmHrtfFull = massima qualità e pesanteza
Guid3DAlgorithmHrtfLight = minore qualità ma minore consumo
Guid3DAlgorithmNoVirtualization = bassissima qualità e considerà solo suoni a destra e sinistra (per due casse) e non alti e bassi.

Ora da questo generiamo il buffer3D

suono3D = New Buffer3D(suono)
suono3D.Mode = Mode3D.HeadRelative

Facile no? La modalità serve a specificare le proprietà
HeadRelative: il suono 3D considera la posizione del suono e dell'ascoltatore
Normal: il suono 3D considera l'ascoltatore in posizione 0,0,0
Disable: il suono verrà riprodotto normalmente e non in 3D (utile per disabilitare momentaneamente).

Ora l'ascoltatore

Dim ascoltatore As Listener3D
Dim buff As Buffer = Nothing 'si riceve il buffer primario per la creazione dell'ascoltatore
Dim descriptionP As New BufferDescription()
descriptionP.PrimaryBuffer = True
descriptionP.Control3D = True
buff = New Buffer(descriptionP, DirectSound)
ascoltatore = New Listener3D(buff)
ascoltatore.Position = New Vector3(0, 0, 0) 'posizione
Dim orientamento As Listener3DOrientation 'orientamento
orientamento.Front = New Vector3(0, 0, 1)
orientamento.Top = New Vector3(0, 1, 0)
ascoltatore.Orientation = orientamento

Creo un buffer vuoto e un descrittore. Lo impostiamo come primario e lo creiamo tramite il directSound.device creato all'inizializzazione. Creiamo poi l'ascoltatore tramite il buffer e lo settiamo. Importante è settare la posizione dell'ascoltatore tramite un vector3 e l'orientamento. Su queste ci arriverò dopo.
Ora tutto è pronto, impostate le caratteristiche che fra poco vi elencherò e fate il play del suono (default, looping come volete). Ed il suono avrà caratteristiche tridimensionali. Ecco come settare il buffer3D e l'ascoltatore.

.::Suono3D::.

Posizione

suono3D.Position = New Vector3(x,y,z)

In questo modo settate la posizione nel piano cartesiano.

Zona udibile

suono3D.MaxDistance = n 'default 1 miliardo
suono3D.MinDistance = n2 'default 1

Impostano la massima distanza e la minima distanza a cui un suono è udibile.

Velocità

suono3D.Velocity = New Vector3(vx, vy, vz)

Velocità del suono espressa come vettore. Dovete quindi calcolare la velocità per ogni direzione e può quindi assumere anche valori negativi (direzione opposta). Usata per gli effetti doppler.

Direzione

Per la direzione si imposta l'orientamento del cono del suono.

suono3D.ConeOrientation = New Vector3(oX, oY, oZ)
Dim angolo As Angles
suono3D.ConeAngles = angolo

tramite angolo potrete variare l'angolo in gradi del cono interno (inside) o esterno (outside). Nel cono interno si avrà piena potenza mentre in quello esterno si avrà una diminuzione progressiva del suono. Il default è 360° (suono completo in tutte le direzioni quindi mancanza di una direzione).

suono3d.ConeOutsideVolume = n

Con questa regolerete il volume del suono quando si trova esterno al cono esterno in modo da regolare l'attenuazione tra i due coni.

.::Ascoltatore::.

Posizione e velocità

Come per il suono 3D si settano posizione e velocità

ascoltatore.Position = New Vector3(px, py, pz)
ascoltatore.Velocity = New Vector3(vx, vy, vz)

Orientamento

Dim orientamento As Listener3DOrientation 'orientamento
orientamento.Front = New Vector3(0, 0, 1)
orientamento.Top = New Vector3(0, 1, 0)
ascoltatore.Orientation = orientamento

Per l'orientamento dobbiamo impostare un vettore con la direzione dell' "avanti" e dell' "alto". Ad esempio qui setto la Z positiva per l'avanti e la Y positiva per l'alto. Queste vanno impostate a 90° ma directX in genere fa la correzione automatica.

Unità di misura

ascoltatore.DistanceFactor = n
ascoltatore.DistanceFactorDefault()
ascoltatore.DistanceFactorMax()
ascoltatore.DistanceFactorMin()

Con la prima si imposta il valore in metri dell'unità di misure. Se impostata ad esempio a 0.01 (centesimo di metro quindi centimetri) tutte le unità per buffer3D ed ascoltatore saranno centimetri. Le altre sono i valori massimi, minimi e di default calcolati dalla scheda e da inserire nel factor quando si usano questi.

RollOut e Doppler

ascoltatore.RolloffFactor = da 0 a 10 da settare ad 1 per il mondo reale

Esprime il modo con cui si attenua il suono lungo la distanza.

ascoltatore.DopplerFactor = da 0 a 10 da settare ad 1 per il mondo reale

DirectSound gestisce automaticamente l'effetto Doppler che senza scendere in particolari di fisica è quell'effetto di distorsione del suono che sentiamo quando il suono si avvicina o allontana dall'ascoltatore o viceversa. L'esempio classico è la sirena di polizia ed ambulanza. Il doppler dipende dalla posizione e soprattutto dalla velocità di ascoltatore e sorgente. Entrambe possono muoversi indipendentemente. Molto utile per i giochi d'auto in cui i motori generano suoni con il fenomeno del doppler.

Ultime note

frequenza e volume vengono gestite da DirectSound quindi se cambiate le posizioni dovrete settarle di nuovo. Questo però non renderà le cose reali quindi in genere il volume non si setta da soli.
Potete cambiare posizioni e velocità continuamente senza problemi
L'audio 3D è più pesante dell'audio normale. Detto questo ho detto tutto.
Vi lascio al classico e semplice esempio del suono che gira intorno all'ascoltatore.

Esempio VB.Net