При помощи DirectSound Вы можете легко реализовать в своём приложении эффект трёхмерного звука, а также эффект Доплера.
Как Вы помните, ранее для воспроизведения звука мы пользовались объектами класса DirectSoundSecondaryBuffer8. Для придания звучанию "трёхмерности" используем объект такого же класса, но созданный с флагом DSBCAPS_CTRL3D.
'ds - инициализированный объект класса DirectSound8
'dsbSource - объект класса DirectSoundSecondaryBuffer8
Dim BufferDesc As DSBUFFERDESC
BufferDesc.lFlags = DSBCAPS_CTRL3D
Set dsbSource = ds.CreateSoundBufferFromFile(App.Path + "\Sound1.wav", BufferDesc)
Далее поставим в соответствие обычному буферу буфер "трёхмерный".
'ds3dBuffer - объект класса DirectSound3DBuffer8
Set ds3dBuffer = dsbSource.GetDirectSound3DBuffer
Звук у нас уже есть. Но надо же его кому-то и слушать? Теперь хитрым образом инициализируем объект класса DirectSound3DListener8.
'dsPrimaryBuffer - объект класса DirectSoundPrimaryBuffer8
'ds3dListener - объект класса DirectSound3DListener8
Dim pBufferDesc As DSBUFFERDESC
pBufferDesc.lFlags = DSBCAPS_PRIMARYBUFFER Or DSBCAPS_CTRL3D
Set dsPrimaryBuffer = ds.CreatePrimarySoundBuffer(pBufferDesc)
Set ds3dListener = dsPrimaryBuffer.GetDirectSound3DListener
Инициализация необходимых объектов закончена.
Теперь необходимо настроить объекты классов DirectSound3DBuffer8 и DirectSound3DListener8, после чего можно воспроизводить звук методом Play класса DirectSoundSecondaryBuffer8.
Ниже пречислены основные методы объекта DirectSound3DBuffer8.
Метод | Описание |
SetPosition |
Устанавливает точку пространства, в которой будет воспроизведён звук. Последний параметр - одна из двух констант: DS3D_DEFERRED DS3D_IMMEDIATE |
GetPosition | Работает в паре с предыдущим методом. |
SetVelocity |
Устанавливает координаты вектора скорости буфера (это не двигает точку пространства, где расположен буфер, а только используется эффектом Доплера). Параметры этого метода совпадают с параметрами метода SetPosition. |
GetVelocity |
Работает в паре с предыдущим методом. Далее методы, начинающиеся с "Get" приводится не будут, т.к. все они соответствуют какому-то методу, начинающемуся с "Set". |
SetConeAngles |
Устанавливает пару целых чисел - углы в градусах, задающие конусы, которые будут определять, как будет слышен звук в различных точках пространства (см. рис.). |
SetConeOrientation |
Устанавливает координаты вектора, который вместе с двумя вышеупомянутыми углами задаёт конус. |
SetConeOutsideVolume |
Устанавливает громкость за пределами конуса (первый параметр - целое число, громкость измеряется в сотых долях децибела). |
SetMinDistance |
Устанавливает значение минимального расстояния (см. рис.) - вещественное число. Значение по умолчанию - 1. |
SetMaxDistance |
Устанавливает значение максимального расстояния. Значение по умолчанию - 109. |
Здесь приведён рисунок, на котором показано, что из себя представляют конусы, параметры которых задаются методами SetConeAngles и SetConeOrientation.
Звук без направления имеет одинаковую громкость в любой точке на заданном расстоянии. Ориентированный звук громче в некотором направлении. Звук внутри внутреннего конуса такой, каким бы он был, если бы не было никаких конусов (громкость зависит только от расстояния). Громкость звука снаружи внешнего конуса меньше нормальной громкости звука. На сколько - задаётся методом SetConeOutsideVolume. Параметр этого метода должен быть отрицательным числом (0 - значение по умолчанию - нормальная громкость). По умолчанию все источники звука являются неориентированными (значения углов, задающих конусы - по 360 градусов). Значение громкости звука между конусами является промежуточным и уменьшается с увеличением угла.
Следующий рисунок иллюстрирует понятия минимального и максимального расстояния для звуков. На рисунке изображены зависимости от расстояния громкостей звуков, которые издают пчела и самолёт.
При приближении к источнику звука звук становится громче. Громкость звука увеличивается во столько раз, во сколько уменьшилось расстояние. Минимальное расстояние - расстояние, на котором звук слышен с той громкостью, с которой он был записан. При дальнейшем уменьшении расстояния громкость звука не увеличивается. Максимальное расстояние - такое расстояние, на котором громкость звука становится самой маленькой и дальше не уменьшается.
Осталось настроить объект DirectSound3DListener8. Далее будут перечислены основные его методы.
Метод | Описание |
SetPosition |
Устанавливает координаты слушателя в трёхмерном пространстве. |
SetVelocity |
Устанавливает координаты вектора скорости слушателя в трёхмерном пространстве. |
SetOrientation |
Устанавливает ориентацию слушателя в пространстве. Параметры метода - координаты векторов, задающих соответственно направления "вперёд" и "вверх" для слушателя. |
SetRolloffFactor |
Устанавливает, как громкость звука будет уменьшаться с увеличением расстояния до его источника. Параметр метода - вещественное число в диапазоне то 0.0 до 10.0, значение 1.0 означает такое уменьшение громкости звука, какое имеет место в реальном мире, 0.0 означает, что громкость звука с увеличением расстояния не изменяется. |
SetDopplerFactor |
Метод этот практически повторяет предыдущий за тем отличием, что устанавливает он силу эффекта Доплера, который проявляется, если слушатель и источник звука двигаются относительно друг друга. |
SetDistanceFactor |
Устанавливает количество метров в единице измерения, используемой в DirectSound. Параметр - вещественное число, значение по умолчанию - 1.0. |
Вот, пожалуй, и всё. Если хотите посмотреть, как некоторые из вышеупомянутых эффектов реализуются на практике, то Вы можете скачать с сайта игру "Пинг-понг".