GLScene. За кулисами BASS и FMOD

Несколько секунд — и вы в любимой игре. Нервно ждёте загрузку – и наконец, перед глазами предстало знакомое 3D-окружение. Нет, чего-то не хватает… Ага! Включаете колонки, поворачиваете потенциометр громкости до максимума – всё, теперь погружение в игру полное.

Да. Всё-таки некоторую долю геймплея привносит и звуковое сопровождение игры. Помните – даже в CompMan звучала какая-никакая, но всё-таки музыка. Может «Сапёру» и «Косынке» простительна такая оплошность, но всем остальным, что от «Космических Рэйнджеров» и старше, – ни-ни! Поэтому быстренько перетряхиваем альбомы любимых групп, чтобы…

Оркестр гремит BASS’ами
Думаю, о звуковом движке BASS вы уже не раз слышали – его используют многие современные аудиопроигрыватели. Для создания «звучной» составляющей игр он подходит ничуть не хуже, чем для создания медиа-ПО. Дело в том, что BASS, как и ODE, можно легко использовать в комплекте с GLScene.
Но для начала — установим необходимые компоненты. В каталоге GLScene\Delphi7 запускаем GLSS_BASS7.dpk. Далее привычно щёлкаем сперва Compile, а затем – Install. Не забудьте поместить файл bass.dll (его можно скачать с сайта un4seen.com) в каталог GLScene\Source\SoundAPIs или Windows\system32. Также советую скопировать эту библиотеку в папку с разрабатываемым проектом – не у всех пользователей вашей игры в системе найдётся такая DLL-ка.
Библиотека BASS хороша всем, но за право её использования в коммерческих проектах придётся заплатить разработчикам кругленькую сумму. Поэтому создатели GLScene предусмотрели возможность использования ещё одного звукового движка — FMOD.
FMOD и BASS – движки практически идентичные. Чтобы проверить это, запустите «родную» демку GLScene из GLScene\Demos\Sound\3dsound\. Демонстрационная программа предлагает опробовать оба звуковых движка в действии. Обратите внимание на заголовок программы – там указывается FPS и загрузка процессора тем или иным движком.
Думаю, остановили выбор вы всё-таки на BASS, но если проект будет серьёзным, а денег жаль, то стоит присмотреться к FMOD: его разработчики сговорчивее и просят за свой движок намного меньше. Впрочем, к freeware-программам всё это не относится: если сидеть тихо и никому не говорить, что у вас поставлен пиратский компилятор Delphi, то всё пройдёт гладко.

Трубач выдувает FMOD
Устанавливается FMOD абсолютно аналогично — компилируем пакет GLSS_FMOD7 и копируем файл fmod.dll.
От разговоров переходим к делу. Создаём новый проект Delphi и кидаем на форму «стандартные» компоненты – GLScene, GLCadencer и GLSceneViewer. Также нам понадобятся компоненты GLSMBASS и GLSoundLibrary, расположенные неподалёку.
Сразу хочу предупредить, что используя нижеприведённый метод, можно проигрывать только моно-треки. Пример для стерео смотрите далее.
Добавьте в список объектов GLSphere и GLCube. Поместите их на сцене так, чтобы между ними было расстояние. Активируйте BASS: свойство Active у компонента GLSMBASS должно быть True.
В FormCreate пишем:

GLSoundLibrary.Samples.AddFile({имя звукового файла});
Добавьте на форму кнопку. В процедуре Click пишем:
with GLSound.TGLBSoundEmitter.Create(GLSphere1.Behaviours) do
begin
 Source.SoundLibrary:=GLSoundLibrary1;
 Source.SoundName:={имя_файла_записанное_в_SoundLibrary1};
 Playing:= True;
end;

Это всё. С таким же успехом вместо GLSMBASS на форму можно добавить GLSMFMOD.

Думайте сами, решайте сами
Для использования стереозвуков нужно работать непосредственно с BASS. А как это? Да очень просто. Для начала прописываем в Uses заветное слово Bass. На форме оставьте все компоненты с предыдущего примера. Также поставьте на форму Timer, свойство Interval=1000. У самой формы я прописал Name=SoundPlayer.

var
 Str: HSTREAM;
 Path: string;
 length: QWORD;
procedure TSoundPlayer.Initialize;
begin
 // путь к папке с музыкой
 path:=ExtractFilePath(Application.ExeName)+’Data\Music\’;
 // инициализация движка BASS
 BASS_Init(-1, 44100, 0, Application.Handle, 0);
 // стартуем движок
 BASS_Start;
end;

procedure TsoundPlayer.PlayMusic
(music: string);
begin
 // создаём звуковой поток
 Str:=BASS_StreamCreateFile(FALSE, PChar(path+music), 0, 0, 0);
 // узнаём длину звуковой дорожки
 length:=BASS_StreamGetLength(Str);
 // переводим длину в секунды
 length:=(length div 1000) div 20;
 // запускаем таймер
 MusicTime.Enabled:=True;
 // проигрываем звук
 BASS_StreamPlay(Str, false, 0);
end;
procedure TSoundPlayer.MusicTimeTimer
(Sender: TObject);
begin
 // один интервал таймера – 1 секунда,
 // поэтому уменьшаем длину файла
 // на единицу
 dec(length);
 // если длина равна нулю, значит
 // проигрывание файла остановилось
 if length=0 then
 begin
  ShowMessage(’StopMusic’);
  MusicTime.Enabled:=False;
 end;
end;

Вышеприведённый код можно назвать ядром аудиопроигрывателя. Впрочем, никто не запрещает вам, изучив данную статью, создать ещё одного монстра навроде AIMP. И ведь правда: достаточно только добавить на форму ListBox и OpenDialog, прописать для них необходимые процедуры, сделать вывод на экран информации о текущем треке – и новоиспечённый плеер готов. Помнится, как-то наш главред рассказывал про раскраску ListBox’а в нужный цвет или даже добавления на него картинок – почему бы и не воспользоваться этой статьёй (см. «МБ»  №25’2006)?


Рекомендуем почитать: