Воспроизведение музыки
формата XM и библиотека MiniFMOD
[Версия 1.0]
В статье рассматриваются некоторые
аспекты использования музыкального
сопровождения в программном
обеспечении. Предлагается
портированная под Delphi библиотека
воспроизведения трекерной музыки
формата XM.
Введение
Часто в разрабатываемом
программном обеспечении требуется
обеспечить некий музыкальный фон,
создающий у пользователя то или иное
настроение. Как правило, особенно
остро эта необходимость
присутствует в играх и
развлекательном программном
обеспечении.
Музыкальное сопровождение обычно
реализуется одним из следующих
традиционных технических решений.
- Если программное обеспечение
поставляется и запускается с CD
или DVD диска, музыкальное
сопровождение можно реализовать в
виде обычных аудио-трэков,
проигрываемых на аппаратном
уровне приводом диска. Такой
подход обеспечивает максимальное
качество звукового сопровождения
и практически полное отсутствие
расходов вычислительной мощности
процессора. Недостаток подхода -
необходимость постоянного
присутствия диска в приводе.
- Если программное обеспечение
поставляется на физическом
носителе (CD или DVD диске) и вопрос о
компактности дистрибутива не
актуален, можно поставлять
музыкальное сопровождение в виде
упакованных (форматы MP3, WMA, OGG и
другие) звуковых файлов. Для
воспроизведения этих файлов можно
воспользоваться большим
количеством программных библиотек.
Такой подход обеспечивает высокое
качество музыкального
сопровождения, однако требует
значительного увеличения размера
дистрибутива.
- Если программное обеспечение
распространяется через сеть
интернет, а требование к
компактности дистрибутива
является основным, музыкальное
сопровождение может быть
реализовано в виде MIDI-файлов, а их
воспроизведение обеспечено либо
штатными средствами операционной
системы, либо специализированными
библиотеками. Недостатки этого
подхода - невыразительность
звучания MIDI-композиций на
большинстве звуковых карт (даже с
программным wavetable-синтезом) и
сильные вариации звучания
композиции, в зависимости от типа
установленной звуковой платы.
Однако существует альтернативный
вариант реализации музыкального
сопровождения, который, с одной
стороны, обеспечивает высокое
качество и повторяемость звучания, а
с другой стороны, компактность
музыкальных файлов. Это так
называемая трекерная музыка.
Трекерная музыка, как особая форма,
зародилась давно, еще на заре
становления компьютеров и техно-музыки,
и начиналась с компьютеров Atari.
Существует множество форматов
трекерной музыки (IT, XM, SM, S3M, MOD) и
редакторов для нее. Однако, общий
принцип трекерной музыки одинаков - в
файл помещаются короткие фрагменты
звуков реальных или синтезированных
инструментов (так называемые сэмплы)
и инструкции по их воспроизведению (ноты,
эффекты, громкость, панорама, вибрато,
тремоло).
Трекерная музыка обеспечивает
высокое качество звучания и
повторяемость, однако для
воспроизведения этой музыки
необходимы специальные библиотеки,
которые будут обрабатывать
сохраненные в файле сэмплы по
таблицам инструкций воспроизведения.
Нельзя сказать, что такой алгоритм
очень сложен и ресурсоемок, однако
еще 4-5 лет назад воспроизведение
трекерной музыки (как и
воспроизведение музыки MP3, OGG)
практически не применялось из-за
нехватки вычислительных ресурсов
компьютера (как правило, все ресурсы
уходили на графику -
видеоускорителей еще не было).
В интернете существует большое
количество ресурсов, посвященных
трекерной музыке - с бесплатными
редакторами, сэмплами, документацией
и примерами трекерной музыки.
Существуют даже специальные хит-парады
для энтузиастов.
Трекерный способ создания музыки
применялся профессионалами на заре
техно-музыки, как относительно
качественный и дешевый способ.
Однако сейчас такой способ
профессионалами практически не
применяется из-за большой
распространенности и доступности
качественного MIDI-оборудования и
аппаратных сэмплеров.
Библиотеки для
воспроизведения музыкального
сопровождения
На рынке программного обеспечения
существует множество библиотек для
воспроизведения музыкального
сопровождения различных форматов.
Стоит отметить, что многие
библиотеки обеспечивают гораздо
большую функциональность, чем
простое проигрывание музыкальных
файлов. Некоторые библиотеки
обеспечивают возможности по
многоканальному воспроизведению
звуковых фрагментов с наложением
эффектов, синхронизации действия на
экране со звуком, записи и упаковки
аудио-данных в различных форматах и
многое другое.
- FMOD (http://www.fmod.org/)
- Мультиплатформенная библиотека
для проигрывания многоканального
музыкального сопровождения и
аудио эффектов. Поддерживает
форматы WAV, MP3, OGG, WMA, AIFF, XM, S3M, MOD, IT и
другие. Существует возможность
расширять функциональность
собственными аудио-фильтрами и
алгоритмами обработки звука. Есть
заголовочные файлы для Delphi.
Бесплатна для некоммерческого
использования. Активно и стабильно
развивается уже несколько лет
- MIDAS (http://www.s2.org/s2/midas/)
- Мультиплатформенная библиотека
для проигрывания трекерной музыки
в форматах XM, S3M, MOD, IT. Бесплатна для
некоммерческого использования. В
настоящее время название
библиотеки изменено на Housemarque Audio
System.
- XASDK (http://www.xaudio.com/)
- Коммерческая многоплатформенная
библиотека для воспроизведения
аудио в форматах MP1, MP2, MP3.
Библиотека MiniFMOD
Библиотека FMOD, пожалуй, самая
мощная и гибкая среди всех
рассматриваемых библиотек. Ее можно
свободно и без ограничений
использовать в некоммерческих
продуктах, а также испытывать ее
возможности в коммерческом продукте
до его выпуска в продажу.
Единственным недостатком для Delphi-программистов
является необходимость поставлять
со своей программой еще и
дополнительный DLL-модуль этой
библиотеки. Кроме того, приобретение
лизензии на использование этой
библиотеки в коммерческом продукте
выльется в довольно большую сумму.
Кроме основной библиотеки FMOD,
разработчики предоставляют некий
"побочный" продукт своих
исследований, а именно мини-библиотеку
MiniFMOD. Эта библиотека поставляется в
исходных кодах на языке С и может
быть свободно использована как в
некоммерческих продуктах, так и в
коммерческих. Единственное
предназначение библиотеки
заключается в воспроизведении
трекерных файлов формата XM. Однако,
по утверждению авторов, библиотека
MiniFMOD проигрывает такие файлы
несколько хуже "основной"
библиотеки FMOD, в которой
предлагаются гораздо более
качественные и точные алгоритмы
воспроизведения.
Большим достоинством библиотеки
MiniFMOD является ее компактность.
Скомпилированный код библиотеки
занимает чуть более 15Кб. Такой размер
позволяет использовать эту
библиотеку в любых приложениях,
включая такие экстремальные случаи,
как DEMOSCENE-программы.
При портировании библиотеки MiniFMOD
для Delphi автор столкнулся с
серьезными трудностями. Оказалось,
что напрямую получить объектные
модули для подключения к ObjectPascal/Delphi
невозможно, так как компилятор Borland C
5.5 не смог скомпилировать исходный
текст этой библиотеки. Можно конечно
было создать динамический модуль DLL с
помощью компилятора MSVC++ 6.0, однако
тогда все преимущества библиотеки
MiniFMOD были бы потеряны.
Было принято следующее техническое
решение. С помощью компилятора MSVC++ 6.0
был получен ассемблерный листинг
модулей библиотеки, скорректирован
согласно стандарту ассемблера Borland
BASM, и скомпилирован этим ассемблером
в объектные модули, совместимые с
компилятором ObjectPascal/Delphi. Кроме того,
в интерфейсном модуле пришлось
реализовать некоторые функции
семейства ANSI C, отсутствующие в
ObjectPascal/Delphi.
<<<
Портированная библиотека MiniFMOD и
пример к ней
Рассмотрим пример использования
библиотеки MiniFMOD. Для начала
необходимо создать ресурсный файл с
трекерной композицией. Созданим файл
описания ресурсов "Resources.rc" и
создадим в нем ресурсный элемент с
именем "XMMUSIC" и типом "RCDATA".
Этот ресурсный элемент будет
указывать на внешний файл с
трекерной композицией. При
компиляции этого описания
компилятором ресурсов мы получим
готовый ресурсный файл с этой
композицией.
\Resources\Resources.rc
XMMUSIC RCDATA XMMUSIC.XM
До инициализации библиотеки MiniFMOD
функцией FSOUND_Init, мы должны передать
библиотеке указатели на наши
потоковые функции - те функции
которые обеспечивают загрузку,
чтение и закрытие трекерной
композиции, как бинарного потока
данных.
Реализованные в портированной
версии потоковые функции оперируют
трекерными композициями только из
ресурсов приложения. Можно создать и
передать библиотеке указатели на
другие потоковые функции, которые
будут загружать трекерные
композиции из файлов на диске или из
блоков в памяти.
Загрузка трекерной композиции
осуществляется с помощью функции
FMUSIC_LoadSong, а воспроизведение
запускается функцией FMUSIC_PlaySong. В
качестве идентификатора трекерной
композиции мы должны передать имя
ресурсного элемента, содержащего эту
композицию.
...
// Инициализация библиотеки
FSOUND_File_SetCallbacks(@XMFile_OpenCallback, @XMFile_CloseCallback,
@XMFile_ReadCallback, @XMFile_SeekCallback, @XMFile_TellCallback);
FSOUND_Init(44100, 0);
// Начинаем проигрывание файла из ресурсов приложения
MusicPlayer := FMUSIC_LoadSong('XMMUSIC', nil);
FMUSIC_PlaySong(MusicPlayer);
...
Воспроизведение трекерной
композиции завершается функцией
FMUSIC_FreeSong, а деинициализация
библиотеки осуществляется функцией
FSOUND_Close.
...
// Завершаем проигрывание музыки
FMUSIC_FreeSong(MusicPlayer);
FSOUND_Close;
...
© Николай Мазуркин, 2003 http://mazurkin.virtualave.net
|