Blog. Just Blog

Получение названий трекерных композиций на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Получение названий трекерных композиций на Ассемблере
Получение названий трекерных композиций на Ассемблере

Трекерная музыка занимает промежуточное место между цифровым звуком и нотной записью. Она популярна еще со времен MS-DOS, ее часто используют при оформлении различных патчей и кейгенов, а также в демосцене. Как правило, внутренний формат у этих музыкальных файлов не очень сложный и потому не поддерживает привычные метаданные. Тем не менее, информация о названии трека в них чаще всего содержится. В этой статье я расскажу, как можно извлечь эту информацию из наиболее популярных форматов трекерных композиций.

ProTracker (расширение .MOD). Описание формата находится здесь, а примеры трекерной музыки в формате ProTracker можно найти здесь. Корректность файла проверяется следующим образом: по смещению 438h от начала файла должна находиться одна из строк "M.K.", "4CHN", "6CHN", "8CHN", "FLT4" или "FLT8". Название трека записано в первых 20 байтах файла.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,1000h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.  
  7.         mov     eax,dword [esi+438h]
  8.         cmp     eax,'M.K.'
  9.         je      @f
  10.         cmp     eax,'4CHN'
  11.         je      @f
  12.         cmp     eax,'6CHN'
  13.         je      @f
  14.         cmp     eax,'8CHN'
  15.         je      @f
  16.         cmp     eax,'FLT4'
  17.         je      @f
  18.         cmp     eax,'FLT8'
  19.         je      @f
  20.  
  21.         jmp     loc_close
  22. @@:
  23.         ; Скопировать название трека
  24.         mov     ecx,20
  25.         mov     edi,title
  26.         rep     movsb
  27.  
  28.         ; Удалить начальные и конечные пробелы
  29.         invoke  PathRemoveBlanks,title
  30.  
  31.         ; title - название трека
  32.  
  33. loc_close:
  34.         invoke  CloseHandle,[desc]
Scream Tracker 2 (расширение .STM). Описание формата находится здесь, а примеры трекерной музыки в формате Scream Tracker 2 можно найти здесь. Корректность файла проверяется по наличию строки "!Scream!" по смещению 14h от начала файла. Название композиции записано в первых 20 байтах файла.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         cmp     dword [esi+14h],'!Scr'
  7.         jne     loc_close
  8.         cmp     dword [esi+18h],'eam!'
  9.         jne     loc_close
  10.  
  11.         ; Скопировать название трека
  12.         mov     ecx,20
  13.         mov     edi,title
  14.         rep     movsb
  15.  
  16.         ; Удалить начальные и конечные пробелы
  17.         invoke  PathRemoveBlanks,title
  18.  
  19.         ; title - название трека
  20.  
  21. loc_close:
  22.         invoke  CloseHandle,[desc]
Scream Tracker 3 (расширение .S3M). Описание формата находится здесь, а примеры трекерной музыки в формате Scream Tracker 3 можно найти здесь. Корректность файла проверяется в два этапа: по смещению 1Ch от начала файла должны быть символы 1Ah и 10h, а по смещению 2Ch - строка "SCRM". Название композиции записано в первых 28 байтах файла.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         cmp     word [esi+1Ch],101Ah
  7.         jne     loc_close
  8.         cmp     dword [esi+2Ch],'SCRM'
  9.         jne     loc_close
  10.  
  11.         ; Скопировать название трека
  12.         mov     ecx,28
  13.         mov     edi,title
  14.         rep     movsb
  15.  
  16.         ; Удалить начальные и конечные пробелы
  17.         invoke  PathRemoveBlanks,title
  18.  
  19.         ; title - название трека
  20.  
  21. loc_close:
  22.         invoke  CloseHandle,[desc]
Fast Tracker 2 Extended Module (расширение .XM). Описание формата находится здесь, а примеры трекерной музыки в формате Fast Tracker 2 можно найти здесь. Файл должен начинаться с 17-байтной строки "Extended Module: ", за которой следуют 20 байт названия трека.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,'Exte'
  8.         jne     loc_close
  9.         lodsd
  10.         cmp     eax,'nded'
  11.         jne     loc_close
  12.         lodsd
  13.         cmp     eax,' Mod'
  14.         jne     loc_close
  15.         lodsd
  16.         cmp     eax,'ule:'
  17.         jne     loc_close
  18.  
  19.         ; Скопировать название трека
  20.         inc     esi
  21.         mov     ecx,20
  22.         mov     edi,title
  23.         rep     movsb
  24.  
  25.         ; Удалить начальные и конечные пробелы
  26.         invoke  PathRemoveBlanks,title
  27.  
  28.         ; title - название трека
  29.  
  30. loc_close:
  31.         invoke  CloseHandle,[desc]
MultiTracker (расширение .MTM). Описание формата находится здесь, а примеры трекерной музыки в формате MultiTracker можно найти здесь. Первые 4 символа файла - сигнатура модуля, строка "MTM" и символ 10h. Сразу за ней записаны 20 байт названия композиции.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,104D544Dh
  8.         jne     loc_close
  9.  
  10.         ; Скопировать название трека
  11.         mov     ecx,20
  12.         mov     edi,title
  13.         rep     movsb
  14.  
  15.         ; Удалить начальные и конечные пробелы
  16.         invoke  PathRemoveBlanks,title
  17.  
  18.         ; title - название трека
  19.  
  20. loc_close:
  21.         invoke  CloseHandle,[desc]
Impulse Tracker (расширение .IT). Описание формата находится здесь, а примеры трекерной музыки в формате Impulse Tracker можно найти здесь. Первые 4 символа файла - сигнатура модуля, строка "IMPM". Сразу за ней следуют 26 байт названия трека.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,'IMPM'
  8.         jne     loc_close
  9.  
  10.         ; Скопировать название трека
  11.         mov     ecx,26
  12.         mov     edi,title
  13.         rep     movsb
  14.  
  15.         ; Удалить начальные и конечные пробелы
  16.         invoke  PathRemoveBlanks,title
  17.  
  18.         ; title - название трека
  19.  
  20. loc_close:
  21.         invoke  CloseHandle,[desc]
UltraTracker (расширение .ULT). Описание формата находится здесь, а примеры трекерной музыки в формате UltraTracker можно найти здесь. Первые 12 символов файла - строка "MAS_UTrack_V", затем три цифры - версия трекера (в описании ошибка, там написано про 11 и 4 символов). На практике я встречал версии "002" и "003". За строкой версии находятся 32 символа названия.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,'MAS_'
  8.         jne     loc_close
  9.         lodsd
  10.         cmp     eax,'UTra'
  11.         jne     loc_close
  12.         lodsd
  13.         cmp     eax,'ck_V'
  14.         jne     loc_close
  15.         lodsw
  16.         lodsb
  17.  
  18.         ; Скопировать название трека
  19.         mov     ecx,32
  20.         mov     edi,title
  21.         rep     movsb
  22.  
  23.         ; Удалить начальные и конечные пробелы
  24.         invoke  PathRemoveBlanks,title
  25.  
  26.         ; title - название трека
  27.  
  28. loc_close:
  29.         invoke  CloseHandle,[desc]
UNIS Composer (расширение .669). Описание формата находится здесь, а примеры трекерной музыки в формате UNIS Composer можно найти здесь. Первые 2 символа модуля должны быть "if" или "JN", за ними следует аж 108 байт комментария или названия трека.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,500h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         cmp     word [esi],'if'
  7.         je      @f
  8.         cmp     word [esi],'JN'
  9.         jne     loc_close
  10. @@:
  11.         ; Скопировать название трека
  12.         mov     ecx,108
  13.         mov     edi,title
  14.         rep     movsb
  15.  
  16.         ; Удалить начальные и конечные пробелы
  17.         invoke  PathRemoveBlanks,title
  18.  
  19.         ; title - название трека
  20.  
  21. loc_close:
  22.         invoke  CloseHandle,[desc]
Advanced Module File (расширение .AMF). Примеры трекерной музыки в формате Advanced Module File можно найти здесь. Файл начинается с 4-байтной сигнатуры - строка "AMF" и символ 0Eh. За сигнатурой находятся 32 символа названия композиции.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,0E464D41h
  8.         jne     loc_close
  9.  
  10.         ; Скопировать название трека
  11.         mov     ecx,32
  12.         mov     edi,title
  13.         rep     movsb
  14.  
  15.         ; Удалить начальные и конечные пробелы
  16.         invoke  PathRemoveBlanks,title
  17.  
  18.         ; title - название трека
  19.  
  20. loc_close:
  21.         invoke  CloseHandle,[desc]
X-Tracker (расширение .DMF). Описание формата находится здесь, а примеры трекерной музыки в формате X-Tracker можно найти здесь. Файл начинается с 4-байтной сигнатуры - строка "DDMF", после нее идет байт версии и 8 байт названия трекера, эти данные могут меняться. Затем идет 30 байт названия композиции и 20 байт имени автора.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,'DDMF'
  8.         jne     loc_close
  9.         ; Версия и трекер
  10.         lodsb
  11.         lodsd
  12.         lodsd
  13.  
  14.         ; Скопировать название трека
  15.         mov     ecx,30
  16.         mov     edi,title
  17.         rep     movsb
  18.         ; Скопировать название автора
  19.         mov     ecx,20
  20.         mov     edi,author
  21.         rep     movsb
  22.  
  23.         ; Удалить начальные и конечные пробелы
  24.         invoke  PathRemoveBlanks,title
  25.         invoke  PathRemoveBlanks,author
  26.  
  27.         ; title - название трека
  28.         ; author - название автора
  29.  
  30. loc_close:
  31.         invoke  CloseHandle,[desc]
Farandole Composer (расширение .FAR). Описание формата находится здесь, а примеры трекерной музыки в формате Farandole Composer можно найти здесь. Файл начинается с 4-байтной сигнатуры - строка "FAR" и символ FEh, затем записаны 40 байт названия трека.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,0FE524146h
  8.         jne     loc_close
  9.  
  10.         ; Скопировать название трека
  11.         mov     ecx,40
  12.         mov     edi,title
  13.         rep     movsb
  14.  
  15.         ; Удалить начальные и конечные пробелы
  16.         invoke  PathRemoveBlanks,title
  17.  
  18.         ; title - название трека
  19.  
  20. loc_close:
  21.         invoke  CloseHandle,[desc]
FMT - достаточно редкий формат треков, которые создаются в FM Tracker за авторством Davey W Taylor. Внутреннюю структуру файлов можно посмотреть в исходниках библиотеки OpenMPT. Некоторые треки в этом формате можно найти на сайте The Mod Archive. Файл начинается с сигнатуры "FMTracker", за которой следуют два символа 01h. 20 символов после сигнатуры - название трекера, на них ориентироваться не надо. А вот следующие 32 символа отведены под название трека.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         lodsd
  7.         cmp     eax,'FMTr'
  8.         jne     loc_close
  9.         lodsd
  10.         cmp     eax,'acke'
  11.         jne     loc_close
  12.         lodsb
  13.         cmp     al,'r'
  14.         jne     loc_close
  15.         lodsw
  16.         cmp     ax,0x0101
  17.         jne     loc_close
  18.  
  19.         ; Пропустить название трекера
  20.         add     esi,20
  21.  
  22.         ; Скопировать название трека
  23.         mov     ecx,32
  24.         mov     edi,title
  25.         rep     movsb
  26.  
  27.         ; Удалить начальные и конечные пробелы
  28.         invoke  PathRemoveBlanks,title
  29.  
  30.         ; title - название трека
  31.  
  32. loc_close:
  33.         invoke  CloseHandle,[desc]
BWSB General Digital Music (расширение .GDM) также встречается нечасто, тут он больше для коллекции. Несколько файлов можно найти в этом репозитории, там же в исходниках есть и описание структуры файла. Первые четыре символа файла являются сигнатурой, это строка "GDM" и символ 0FEh. По смещению 47h от начала файла записана вторая сигнатура - строка "GMFS". После первой сигнатуры записаны 32 символа с названием композиции, а сразу после них 32 символа с названием исполнителя.
  1.         ; Прочитать заголовок файла
  2.         invoke  _lread,[desc],buff,100h
  3.  
  4.         ; Проверить корректность файла
  5.         mov     esi,buff
  6.         cmp     dword[esi],0FE4D4447h
  7.         jne     loc_close
  8.         cmp     dword[esi+47h],'GMFS'
  9.         jne     loc_close
  10.  
  11.         lodsd
  12.  
  13.         ; Скопировать название трека
  14.         mov     ecx,32
  15.         mov     edi,title
  16.         rep     movsb
  17.         ; Скопировать название автора
  18.         mov     ecx,32
  19.         mov     edi,author
  20.         rep     movsb
  21.  
  22.         ; Удалить начальные и конечные пробелы
  23.         invoke  PathRemoveBlanks,title
  24.         invoke  PathRemoveBlanks,author
  25.  
  26.         ; title - название трека
  27.         ; author - название автора
  28.  
  29. loc_close:
  30.         invoke  CloseHandle,[desc]
Общее правило для всех вариантов - после получения строки названия надо обязательно обрезать начальные и конечные пробелы. Удобнее всего это сделать при помощи штатной функции PathRemoveBlanks.

В приложении примеры программ с исходными текстами, которые выводят названия треков различных форматов.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

Parse.Tracker.Modules.Demo.zip (670,739 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 339 | Комментариев: 3

Комментарии

Отзывы посетителей сайта о статье
ManHunter (31.08.2024 в 19:41):
Добавил форматы FMT и GDM, архив обновлен.
ManHunter (12.05.2024 в 15:33):
Добавил форматы AMF, FAR и DMF, архив обновлен.
ManHunter (11.05.2024 в 20:32):
Добавил форматы STM, 669 и ULT, архив обновлен.

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

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

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