Использование музыки в ваших программах несомненно добавит им привлекательности. Особенно если речь идет о компьютерных играх или кейгенах :) Для различных форматов музыки используются различные библиотеки, в том числе и самописные. Самописные, как правило, приватные и доступны только ограниченному кругу лиц, а качественных и удобных из числа публичных всего две - BASS и uFMOD.
Для качественной музыки используется внешняя библиотека
BASS, последняя версия 2.4.2. Это кроссплатформенная библиотека для воспроизведения потоковой музыки (MP3, MP2, MP1, OGG, WAV, AIFF), трекерной (XM, IT, S3M, MOD, MTM, UMX), Internet-вещания (HTTP, FTP), а также некоторых других форматов через внешние модули расширения. При всем богатстве функционала библиотека занимает всего около 100 килобайт на диске. Библиотека обычно используется в аудиоплеерах и компьютерных играх. Скачать последнюю версию можно
с офсайта, в архиве имеется подробнейшая документация по всем API библиотеки. Дополнительные модули расширения можно скачать оттуда же с офсайта. Для нас особый интерес представляет пример использования API библиотеки BASS на Flat Assembler'е, скачать его можно также
с офсайта. Это плеер с минимальными функциями, но в архиве содержатся необходимые inc-файлы, которые надо будет поместить в соответствующие папки FASM для использования в других проектах. Минусы использования библиотеки BASS в том, что в любом случае приходится таскать за собой 100-килобайтный файл bass.dll. Для больших проектов это погоды не сделает, а для небольших может оказаться критичным. Конечно, можно хранить файл bass.dll внутри исполняемого файла и записывать в системную директорию по мере надобности (именно так и поступает патчер dUP2), но многие антивирусы расценят подобную активность как подозрительную. Со всеми вытекающими. Также к недостаткам можно отнести закрытый код библиотеки и навешанный на нее протектор.
Для трекерной музыки, а также в проектах, когда размер имеет значение, лучше использовать библиотеку
uFMOD, последняя версия на момент публикации 1.25.2. Это компактная, шустрая, надежная, мультиплатформенная библиотека для качественного воспроизведения аудио в формате XM, разработанная полностью на ассемблере. XM-модуль может храниться в отдельном файле, в ресурсах или быть предварительно загружен в память. Поддерживаются также битые и не совсем стандартные файлы. Библиотека бесплатна для любого использования, распространяется с открытым исходным кодом и примерами для различных компиляторов, в том числе для FASM. Скачать библиотеку можно
с офсайта. В своих проектах я использую именно uFMOD, поэтому настроил ее для своего удобства следующим образом. Структура программы с использованием музыки получается примерно такая (оставлены только участки кода, непосредственно отвечающие за музыку):
; Сегмент данных
section '.data' data readable writeable
; Подключить музыкальный файл
xm file '%music%\jamers.xm'
xm_length = $ - xm
; Сегмент кода
section '.code' code readable executable
; Запустить файл на воспроизведение
stdcall uFMOD_PlaySong, xm, xm_length, XM_MEMORY
....
; Тут какие-то действия программы
....
; Остановить воспроизведение
stdcall uFMOD_PlaySong, 0, 0, 0
; Таблица импорта
section '.idata' import data readable writeable
; Подключить функции для работы со звуком
library winmm,'WINMM.DLL'
include "apia\winmm.inc"
; Подключить все необходимые модули uFMOD
include '%ufmod%\ufmod.inc'
Файл winmm.inc для удобства использования размещен в папке include\apia вместе с другими подключаемыми файлами. Его содержимое такое:
;--------------------------------------
; Файл winmm.inc
;--------------------------------------
import winmm,\
waveOutGetPosition,'waveOutGetPosition',\
waveOutOpen,'waveOutOpen',\
waveOutPrepareHeader,'waveOutPrepareHeader',\
waveOutReset,'waveOutReset',\
waveOutUnprepareHeader,'waveOutUnprepareHeader',\
waveOutWrite,'waveOutWrite',\
waveOutClose,'waveOutClose'
Файл ufmod.inc размещен в папке include\music, там же лежат файлы core.asm, data.inc, eff.inc, equs.inc, fasm.asm, ufmod.asm.
;--------------------------------------
; Файл ufmod.inc
;--------------------------------------
include '%ufmod%\eff.inc'
include '%ufmod%\data.inc'
macro PUBLIC symbol {} ; hide all publics
macro thnk nm { nm equ [nm] }
include '%ufmod%\fasm.asm'
Код файла data.inc приведен ниже, остальные файлы можно взять из скачанной библиотеки из папки ufmodlib\src. Тут лучше ничего без надобности не менять.
;--------------------------------------
; Файл data.inc
;--------------------------------------
; uFMOD setup:
UF_OUTPUT equ WINMM ; Set output driver to WINMM (WINMM, OPENAL, DIRECTSOUND)
UF_FREQ equ 48000 ; Set sampling rate to 48KHz (22050, 44100, 48000)
UF_RAMP equ STRONG ; Select STRONG interpolation (NONE, WEAK, STRONG)
UF_UFS equ ANSI ; Select ANSI encoding (ANSI, UNICODE)
UD_MODE equ UNSAFE ; Select UNSAFE mode (NORMAL, UNSAFE, BENCHMARK)
VB6 equ 0 ; Disable VisualBasic 6 extensions
PBASIC equ 0 ; Disable PureBasic extensions
EBASIC equ 0 ; Disable Emergence BASIC extensions
BLITZMAX equ 0 ; Disable BlitzMax extensions
NOLINKER equ 1 ; Select "no linker" mode
UF_FMT equ 0 ; Disable DLL entry point
; uFMOD constants:
XM_RESOURCE = 0
XM_MEMORY = 1
XM_FILE = 2
XM_NOLOOP = 8
XM_SUSPENDED = 16
uFMOD_MIN_VOL = 0
uFMOD_MAX_VOL = 25
uFMOD_DEFAULT_VOL = 25
Более подробно о значениях параметров, вспомогательных утилитах для uFMOD и методах оптимизации размера файлов можно прочитать в
официальной документации на русском языке.
Огромный архив бесплатной трекерной музыки в формате XM, IT, S3M и MOD можно найти на сайте
The Mod Archive. Обновления каждый день! Библиотека uFMOD работает только с форматом XM, файлы других форматов можно сконвертировать в XM при помощи бесплатной программы
Open Modplug Tracker. Последняя версия 1.17.02.48, скачать можно
с офсайта. К сожалению, процесс конвертирования нигде толком не описан, пришлось разбираться самому.
Открываете файл в редакторе, на вкладке "General" нажимаете кнопку "Song Properties...". В открывшемся окне выбираете формат файла "FastTracker XM".
Нажимаете "ОК", а затем через меню "File" - "Save As..." сохраняете сконвертированный файл в формате XM. И все, никаких лишних движений делать не надо.