GLScene - Трехмерный звук
Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru
В этой статье мы рассмотрим использование трёхмерного звука. Для этого мы будем использовать два звуковых менеджера: FMOD и BASS. Для этого нам понадобятся две библиотеки: fmod.dll и bass.dll. Их вы можете найти в папке SoundAPIs (в вашем каталоге GLScene\Source) например: “C:\GLScene\Source\SoundAPIs”.
Их можно копировать в папку с вашей программой, или поместить в папку System (C:\WINDOWS\system).
Займёмся внешним видом программы:
Помещаем на форму GLScene, GLSoundLibrary, GLCadencer, GLSMFMOD и GLSMBASS. Так же добавим на форму две RadioButton (FMOD и BASS), и две обычных кнопки(MP3 и Wav). С внешним видом разобрались. Должно получиться что-то вроде этого:
Далее создадим одну камеру(Camera), источник света(LightSource), куб(cube) и круг(sphere).
Зададим координаты круга(он будет издавать звук):
X = 2
Y = 0,5
Z = 0
Координаты камеры(не забудьте направить её на куб):
X = 0
Y = 5
Z = 10
Направьте источник света на куб. Задайте значение RadioButton2.Cecked = True ведь BASS менеджер будет активен с самого начала. Далее переходим к кодингу. В раздел uses Добавим Geometry. При создании формы добавим нашу музыку (или звуки) в звуковую библиотеку:
procedure TForm1.FormCreate(Sender: TObject);
begin
GLSoundLibrary1.Samples.AddFile('Susl.wav');
GLSoundLibrary1.Samples.AddFile('Wolf.mp3');
end;
Заставим вращаться круг вокруг куба, это и будет наше 3D:
procedure TForm1.GLCadencer1Progress(Sender: TObject;
const deltaTime, newTime: Double);
begin
Sphere1.Position.SetPoint(sin(60 * DegToRad(newTime)) * 2, 0.5,
cos(60 * DegToRad(newTime)) * 5);
end;
Далее при нажатии на радио кнопки будут меняться звуковые менеджеры:
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if GLSMFMOD1 <> GLSound.ActiveSoundManager then
begin
ActiveSoundManager.Active := False;
GLSMFMOD1.Active := True;
GLSound.GetOrCreateSoundEmitter(Cube1).Playing := True;
end;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
if GLSMBASS1 <> GLSound.ActiveSoundManager then
begin
ActiveSoundManager.Active := False;
GLSMBASS1.Active := True;
GLSound.GetOrCreateSoundEmitter(Cube1).Playing := True;
end;
end;
А при нажатии на кнопки проигрываются звуки:
procedure TForm1.Button1Click(Sender: TObject);
begin
with GLSound.TGLBSoundEmitter.Create(Sphere1.Behaviours) do
begin
Source.SoundLibrary := GLSoundLibrary1;
Source.SoundName := 'Wolf.mp3';
Playing := True;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with GLSound.TGLBSoundEmitter.Create(Sphere1.Behaviours) do
begin
Source.SoundLibrary := GLSoundLibrary1;
Source.SoundName := 'Susl.wav';
Playing := True;
end;
end;
Всё. Не так сложно как кажется!
Вот исходник (без библиотек)
|