Blog. Just Blog

Воспроизведение музыки в программах на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование музыки в ваших программах несомненно добавит им привлекательности. Особенно если речь идет о компьютерных играх или кейгенах :) Для различных форматов музыки используются различные библиотеки, в том числе и самописные. Самописные, как правило, приватные и доступны только ограниченному кругу лиц, а качественных и удобных из числа публичных всего две - 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, поэтому настроил ее для своего удобства следующим образом. Пути в файле конфигурации настроены как я уже писал раньше в статье про установку FASM. Структура программы с использованием музыки получается примерно такая (оставлены только участки кода, непосредственно отвечающие за музыку):
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; Подключить музыкальный файл
  5. xm file  '%music%\jamers.xm'
  6. xm_length = $ - xm
  7.  
  8. ; Сегмент кода
  9. section '.code' code readable executable
  10.         ; Запустить файл на воспроизведение
  11.         stdcall uFMOD_PlaySong, xm, xm_length, XM_MEMORY
  12.         ....
  13.         ; Тут какие-то действия программы
  14.         ....
  15.         ; Остановить воспроизведение
  16.         stdcall uFMOD_PlaySong, 0, 0, 0
  17.  
  18. ; Таблица импорта
  19. section '.idata' import data readable writeable
  20.  
  21. ; Подключить функции для работы со звуком
  22. library winmm,'WINMM.DLL'
  23.  
  24. include "apia\winmm.inc"
  25.  
  26. ; Подключить все необходимые модули uFMOD
  27. include '%ufmod%\ufmod.inc'
Файл winmm.inc для удобства использования размещен в папке include\apia вместе с другими подключаемыми файлами. Его содержимое такое:
  1. ;--------------------------------------
  2. ; Файл winmm.inc
  3. ;--------------------------------------
  4. import winmm,\
  5.        waveOutGetPosition,'waveOutGetPosition',\
  6.        waveOutOpen,'waveOutOpen',\
  7.        waveOutPrepareHeader,'waveOutPrepareHeader',\
  8.        waveOutReset,'waveOutReset',\
  9.        waveOutUnprepareHeader,'waveOutUnprepareHeader',\
  10.        waveOutWrite,'waveOutWrite',\
  11.        waveOutClose,'waveOutClose'
Файл ufmod.inc размещен в папке include\music, там же лежат файлы core.asm, data.inc, eff.inc, equs.inc, fasm.asm, ufmod.asm.
  1. ;--------------------------------------
  2. ; Файл ufmod.inc
  3. ;--------------------------------------
  4. include '%ufmod%\eff.inc'
  5. include '%ufmod%\data.inc'
  6. macro PUBLIC symbol {} ; hide all publics
  7. macro thnk nm { nm equ [nm] }
  8. include '%ufmod%\fasm.asm'
Код файла data.inc приведен ниже, остальные файлы можно взять из скачанной библиотеки из папки ufmodlib\src. Тут лучше ничего без надобности не менять.
  1. ;--------------------------------------
  2. ; Файл data.inc
  3. ;--------------------------------------
  4. ; uFMOD setup:
  5. UF_OUTPUT equ WINMM  ; Set output driver to WINMM    (WINMM, OPENAL, DIRECTSOUND)
  6. UF_FREQ   equ 48000  ; Set sampling rate to 48KHz    (22050, 44100, 48000)
  7. UF_RAMP   equ STRONG ; Select STRONG interpolation   (NONE, WEAK, STRONG)
  8. UF_UFS    equ ANSI   ; Select ANSI encoding          (ANSI, UNICODE)
  9. UD_MODE   equ UNSAFE ; Select UNSAFE mode            (NORMAL, UNSAFE, BENCHMARK)
  10. VB6       equ 0      ; Disable VisualBasic 6 extensions
  11. PBASIC    equ 0      ; Disable PureBasic extensions
  12. EBASIC    equ 0      ; Disable Emergence BASIC extensions
  13. BLITZMAX  equ 0      ; Disable BlitzMax extensions
  14. NOLINKER  equ 1      ; Select "no linker" mode
  15. UF_FMT    equ 0      ; Disable DLL entry point
  16.  
  17. ; uFMOD constants:
  18. XM_RESOURCE       = 0
  19. XM_MEMORY         = 1
  20. XM_FILE           = 2
  21. XM_NOLOOP         = 8
  22. XM_SUSPENDED      = 16
  23. uFMOD_MIN_VOL     = 0
  24. uFMOD_MAX_VOL     = 25
  25. uFMOD_DEFAULT_VOL = 25
Более подробно о значениях параметров, вспомогательных утилитах для uFMOD и методах оптимизации размера файлов можно прочитать в официальной документации на русском языке.

Огромный архив бесплатной трекерной музыки в формате XM, IT, S3M и MOD можно найти на сайте The Mod Archive. Обновления каждый день! Библиотека uFMOD работает только с форматом XM, файлы других форматов можно сконвертировать в XM при помощи бесплатной программы Open Modplug Tracker. Последняя версия 1.17.02.48, скачать можно с офсайта. К сожалению, процесс конвертирования нигде толком не описан, пришлось разбираться самому. Но как оказалось, это делается очень просто:

Конвертирование файла в Open Modplug Tracker
Конвертирование файла в Open Modplug Tracker

Открываете файл в редакторе, на вкладке "General" нажимаете кнопку "Song Properties...". В открывшемся окне выбираете формат файла "FastTracker XM".

Выбор нужного формата файла
Выбор нужного формата файла

Нажимаете "ОК", а затем через меню "File" - "Save As..." сохраняете сконвертированный файл в формате XM. И все, никаких лишних движений делать не надо.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 8622 | Комментариев: 6

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
alancor (30.12.2010 в 02:33):
Привет всем, а особенно тому, кто посвятил эту тему в жизнь!!
За частую, в кейгенах звучит прекрасные мелодии, думаю, что с этим все будут согласны, так вот - я тоже занялся такой задачей, как то, чтобы рипнуть трекеры из кейгенов. Нашёл в интернете целый сайт посвящённый этой теме, но там не было ничего сказано про конвертацию уже рипнутых трекеров из *.xm to *.mp3.
Помогла вот эта статья. Только тут расписано, как сделать трекер *.xm, но эта же прога и конвертит трекер в *.mp3...
Рассказываю, как:
Открываем прогу, закрываем внутри проги добавочное рабочее окно файла, теперь..., мышкой перетаскиваем файл в область пустого окна проги, и появляется рабочее окно данного файла, далее - File ---> Export as MP3, после клика вылетет контекстное окно с доп. настройками, как за правило, битрейт, частотные характеристики и прочая фигня, ничего не трогаем, а просто указываем сохранение на рабочий стол - вот и всё!! радуемся любимому трекеру, но уже в МР3, можно и на мобилу поставить в виде вызова. Всем удачи!! )))
ManHunter (13.08.2009 в 23:02):
s0ph0kl3s, read oficial manuals in Spanish:
http://ufmod.sourceforge.net/ind_es.htm
or in English:
http://ufmod.sourceforge.net/index.html
All exampes, including C++, you can find inside archive:
ufmod-1.25.2a-win32.7z\Examples\C
s0ph0kl3s (13.08.2009 в 22:55):
привет от русского языка, не понимают ничего, но я читаю ваш блог, и я хотел бы знать, каким образом я могу осуществить uFMOD LIB в C + + компилятор haaa благодаря и Вашей очень хорошая статья

mail s0ph0kl3s@gmail.com

gracias por tu colaboracion
Vovka (30.03.2009 в 21:39):
Для кейгенов лучше использовать не BASS, а BASSMOD с того же сайта, он весит чуть больше 30кб и проигрывает только треккерную музыку. Минус uFMOD в том, что он играет только XM, а после конвертации из других форматов не всегда хороший результат получается.
Дмитрий (24.03.2009 в 10:25):
Спасибо, я тоже искал! Но нашел тока на delphi)
Zummenix (23.03.2009 в 16:06):
Спасибо, как раз то, что я искал ! :)

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0032 сек.) / Память: 4.5 Mb
Наверх