Информатика и образование
  Мобильная версия сайта            
               
[Главная] [Новости]
[Статьи]
[Проекты]
[Ссылки]
[Автор]
               
    [Архив новостей]        
               
  [Форум] на форуме можно задать вопрос, посмотреть ответы на часто задаваемые вопросы  
       
  Здравствуйте! Вы попали на информационно-образовательный сайт посвященный информатике, информационным технологиям и компьютерным играм. Подробнее о целях и задачах сайта в разделе Главная. [English version of this page here...]    
       
  [Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi]    
  [Разработка компьютерной игры] [Пример игры Donuts3D]    
       
 

12/06/2008 Воспроизведение файлов в форматах *.it, *.xm, *.s3m, *.mod

Для воспроизведения используется интерфейс для библиотеки FMOD 3.75 (c) Firelight Technologies Pty, Ltd,
1994 - 2004
http://www.fmod.org

Автор конверсии на Delphi - Dragan Bocevski.

Полный список понимаемых библиотекой FMOD 3.75 файлов -

*.MOD;*.S3M;*.XM;*.IT;*.MID;*.RMI;*.SGT;*.WAV;*.MP2;*.MP3;*.OGG;*.WMA;*.ASF

   
       
 

Чем FMOD 3.75 отличается от miniFMOD?

miniFMOD - это прежде всего библиотека демо-проектов, обладающая минимальным объемом, но и минимумом возможностей. В частности даже отсутсвует возможность регулировки громкости проигрываемого трека.

FMOD 3.75 также распространяется на бесплатной основе, но возможности его несоизмеримо шире. Заметно, что качество звука воспроизводимого трека гарантированно выше, а возможности по настройкам и регулировкам - все какие только нужны: громкость, списки воспроизведения, регулировка позиции воспроизведения по паттернам, спектральный анализатор звуковой волны и многое другое, что потянет на использование уже не только в игровом проекте, но и для написания собственного медиа-плеера наподобие ModPlugPlayer или даже тректера наподобие ModPlugTracker. Правда следует отметить, что ModPlugPlayer и ModPlugTracker написаны совсем на другой основе (по крайней мере не на основе FMOD), хотя и используют те же ставшие стандартом де-факто трекерские форматы - *.it, *.xm, *.s3m, *.mod и еще целый ряд подобных им.

   
       
 

Почему бы не взять для музыки OggVorbis и ограничиться этим?

Вполне можно, разработчики современного FMOD версии 4.17 пошли еще дальше и разработали формат OXM, который еще более компактен чем оригинальные XM-файлы за счет сжатия сэмплов в формате ogg. Если Вам это нужно, то можете использовать самые свежие версии FMOD.

Мы же здесь ограничимся рассмотрением использования версии FMOD 3.75 в игровом проекте Нечто: Необъяснимое.

В этом проекте планируется использовать OggVorbis преимущественно для воспроизведения длинных речевых диалогов. FMOD 3.75 - для воспроизведения оригинальных музыкальных треков в форматах *.it, *.xm и других.

В этом случае звуки речи будут более компактны за счет большего коэффициента сжатия с некоторым понижением качества, но зато с достаточной длительностью по времени.

Музыкальные файлы также будут компактны, за счет использования не слишком больших сэмплов и за счет того, что не будут экспортироваться в ogg, а будут оставаться в своем родном формате, в котором они были написаны в трекере!

Поскольку FMOD 3.75 умеет открывать и воспроизводить и файлы в формате OggVorbis, то использование отдельной библиотеки и ее файлов не потребуется!

   
       
  Что нужно для использования FMOD 3.75 ?    
       
 

В первую очередь, конечно, нужно создать свои треки, например в ModPlugTracker 1.16. Есть и несколько уроков, посвященных этой проблеме - введение в трекерскую музыку, введение в ModPlugTracker 1.16 и ряд других. Если файлы содержат речь или длинные наборы звуков, то их нужно пересохранить в более компактном формате - сначала экспортировать в Wav или mp3, а затем в Ogg. Поскольку FMOD 3.75 понимает и mp3 файлы, то можно оставить в формате mp3. Однако это целесообразно делать только для записей речи. Музыкальные файлы в трекерских форматах (*.it, *.xm, *.mod, *.s3m) более компактны чем mp3 или ogg поскольку содержат только наборы сэмплов и нот, а не непрерывную звуковую дорожку, которая должа играть на протяжении определенного времени как это имеет место в wav, mp3 и ogg. Правда mp3 и ogg позволяют сильно сократить объем по сравнению с wav. Но все-равно они проигрывают в объеме трекерским файлам.

Таким образом получается следующая картина - для коротких звуков лучше использовать формат wav, который легко воспроизводится средствами IDirectSound. Для более длинных звуков или записей речи нужно использовать mp3 или ogg. И наконец музыку, написанную в трекере можно использовать в своем собственном формате, учтя лишь тот факт, что размеры входящих в мелодию сэмплов должны быть не слишком большими, чтобы общий объем не превышал скажем 4Mb, а то и еще меньше. Иначе дистрибутив игры, особенно распространяемой через сеть, разрастется до непомерных размеров, а это актуально лишь для CD и DVD-версий игры. Игры же распространяемые по сети желательно делать как можно меньшими.

   
       
  На заре создания сайта Мега Информатик автором уже был создан компонент SXModPlayer2 на основе библиотеки MPPSDK.DLL, но по некоторым причинам - качество звука и некоторые ограничения не дают возможности полноценно использовать его в качестве успешного плеера музыки в игровых проектах. Главным образом из-за отсутствия открытого кода по библиотеке mppsdk.dll. Есть правда открытый код ModPlugTracker 1.16, но он написан на C++, знатоком которого автор к сожалению не является.    
       
  По этим причинам разыскивался аналогичный компонент и им стал FMOD 3.75.    
       
  Итак, перейдем к рассмотрению работы с библиотекой FMOD 3.75    
       
 

Для начала разберемся как это сделано в примере из дистрибутива fmodapi375win.rar -

допустим мы распаковали содержимое данного архива в папку fmodapi375win\

тогда мы рассмотрим сейчас реализацию примера из папки -

fmodapi375win\samplesdelphi\FMod

   
       
 

Здесь находится файл проекта testbed.dpr который без проблем открывается из Delphi 7.

Открываем этот файл из Delphi.

   
       
  В опциях проекта указываем ссылку на папку Search path - ..\..\api\delphi; (Project > Options > Directories\Conditionals)    
       
     
       
 

Из папки fmodapi375win\api копируем файл fmod.dll в папку fmodapi375win\samplesdelphi

В опциях проекта в поле Output directory укажите ..\ (см. рисунок) для того, чтобы скомпилированный exe-файл попал в папку fmodapi375win\samplesdelphi уже содержащую необходимую ему dll.

   
       
 

Нажимаем ОК, выполняем компиляцию.

Если всё сделано верно Вы должны получить следующее сообщение -

   
       
     
       
  Если Вы уже догадались, как исправить данную ошибку, то сделайте это сами.    
       
 

Если нет, то вот что нужно сделать -

Дело в том, что в данном массиве содержится на 1 меньше элемент, чем описано в его начале. Просто найдите тип TFSoundOutputTypes и обратите внимание какие константы описаны там.

Скопируйте элемент FSOUND_OUTPUT_PSP, вставьте его в массив OutputTypes который давал ошибку, заключив в кавычки и вставив после 'FSOUND_OUTPUT_GC' -

'FSOUND_OUTPUT_PSP',

Сохраните и снова откомпилируйте проект. Теперь результат должен быть ОК.

   
       
  Запустите полученный в папке fmodapi375win\samplesdelphi файл testbed.exe    
       
     
       
  Откройте какой-либо трекерский файл (*.it, *.xm, *.s3m или *.mod) нажав кнопку Load. Если под рукой нет ничего подходящего можете скачать примеры треков.    
       
  Теперь можете нажать кнопку Play и попробовать регулировать громкость, переключаться на последующие паттерны (-/+). Можно щелкнуть по окошку спектрального анализатора - Click for spectrum. Кнопочка Config позволит Вам выбрать другое устройство (драйвер) воспроизведения звука и кое-какие параметры фильтрации.    
       
  Сравнив звучание одной и той же мелодии например в трекере ModPlugTraker, а затем в данном тестовом приложении приходим к выводу, что оно более чем превосходит все наши ожидания, в чём-то даже звучание превосходит оригинал.    
       
  Рассмотрим как реализованы вызовы интерфейсов FMOD 3.75 в примере данного приложения.    
       
 

Проект testbed.dpr

Модуль main.pas

В методе создания окна формы - procedure TfrmMain.FormCreate

FMOD_Load(nil); метод загрузки динамической библиотеки - возвращает значение о том, загружена она или нет

Далее следует сравнение версий API в исходных файлах и версии библиотеки dll

{ Check version numbers }
if FMOD_VERSION > FSOUND_GetVersion then
begin
Application.MessageBox(PChar(Format('API version %3.2f is newer than DLL version %3.2f', [FMOD_VERSION, FSOUND_GetVersion])), 'Version mismatch', MB_OK or MB_ICONERROR);
Halt;
end;

Инициализируется FSound. FSound управляет параметрами звуковых буферов, в которые поступают результаты вывода звуковых потоков от FMusic. Т.е. объект FMusic получив it или ogg файл сначала выводит его в отведенный буфер производя микширование (в случае трекерского модуля) или декодирование в случае mp3 или ogg. Полученный в буфере кусочек звука воспроизводится средствами звука Windows или DirectSound - в зависимости от того, какой драйвер (устройство) для вывода звука будет выбрано.

Для начала выбираются настройки по умолчанию -

{ Initialize FSOUND }
try
if not FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND) then
//вывод через IDirectSound
raise Exception.Create('FSOUND_SetOutput failed');
if not FSOUND_SetDriver(0) then
//первое в списке устройство вывода
raise Exception.Create('FSOUND_SetDriver failed');
if not FSOUND_SetMixer(FSOUND_MIXER_QUALITY_AUTODETECT) then
//автоопределяемое качество микширования
raise Exception.Create('FSOUND_SetMixer failed');
if not FSOUND_SetHWND(Handle) then
//устанавливается обработчик окна приложения
raise Exception.Create('FSOUND_SetHWND failed');
except
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'Initialization', MB_OK or MB_ICONHAND);
raise;
end;

Если все прошло гладко, то FSound инициализируется со следующими параметрами - частота дискретизации микширования стерео-сигнала 22050 Гц, количество программных аудио-каналов - 128, флаги - 0

if not FSOUND_Init(22050, 128, 0) then
begin
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'FSOUND_Init', MB_OK or MB_ICONHAND);
Halt;
end;

   
       
 

Очищается список воспроизведения - количество файлов не должно превышать 512. К слову сказать, FMOD умеет выводить полифонию, т.е. файлы, содержащиеся в списке могут воспроизводиться одновременно! Это очень удобно, особенно с той точки зрения, когда нужно будет чтобы играла музыка и в то же время персонаж что-нибудь говорил. Это не потребует создания отдельных объектов fmod!

{ Initialize song list to empty }
for Index := 0 to MAX_SONGS - 1 do
begin
FSongs[Index].Module := nil;
FSongs[Index].Stream := nil;
FSongs[Index].Channel := -1;
end;

Номер текущего трека, число треков, состояние CD-плеера - FMOD умеет работать и с CD!!!

FTrackNumber := 0;
FNumTracks := 0;
FCDPaused := False;
FCDPlaying := False;

   
       
 

Спектральный анализатор, вообще-то в игре это и не нужно, но, в плеере, например будет очень полезно, а вот если использовать как-то выходные параметры анализатора в игре, например, для влияния на количество врагов и т.п. Тогда становится еще интереснее!

FSpectrum := TMiniSpectrum.Create(nil);
FSpectrum.Parent := pnlSpectrum;
FSpectrum.Align := alClient;
FSpectrum.Enabled := False;
FSpectrum.OnClick := pnlSpectrumClick;

   
       
  Оставшиеся строки кода актуальны только для примера testbed.dpr    
       
  [далее] - продолжаем рассмотрение работы с FMOD 3.75 из проектов Delphi    
       
  [Назад] [Все уроки]    
       
       
 

Обновления и новости о развитии Delphi DirectX проекта
смотри на сайтах:

http://www.megainformaticsite.pochta.ru

http://www.megainformatic.boom.ru

http://www.megainformatic.narod.ru

 

   
       
 

Cвои пожелания, вопросы или заметки отправляйте на:

megainformatic@mail.ru

 
     
   Обмен ссылками  
     
     
             
 
 
         
(с) МЕГА ИНФОРМАТИК 2006-2009
Hosted by uCoz