Получение названий трекерных композиций на Ассемблере
Получение названий трекерных композиций на Ассемблере
Трекерная музыка занимает промежуточное место между цифровым звуком и нотной записью. Она популярна еще со времен MS-DOS, ее часто используют при оформлении различных патчей и кейгенов, а также в демосцене. Как правило, внутренний формат у этих музыкальных файлов не очень сложный и потому не поддерживает привычные метаданные. Тем не менее, информация о названии трека в них чаще всего содержится. В этой статье я расскажу, как можно извлечь эту информацию из наиболее популярных форматов трекерных композиций.
ProTracker (расширение .MOD). Описание формата находится здесь, а примеры трекерной музыки в формате ProTracker можно найти здесь. Корректность файла проверяется следующим образом: по смещению 438h от начала файла должна находиться одна из строк "M.K.", "4CHN", "6CHN", "8CHN", "FLT4" или "FLT8". Название трека записано в первых 20 байтах файла.
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,1000h
- ; Проверить корректность файла
- mov esi,buff
- mov eax,dword [esi+438h]
- cmp eax,'M.K.'
- je @f
- cmp eax,'4CHN'
- je @f
- cmp eax,'6CHN'
- je @f
- cmp eax,'8CHN'
- je @f
- cmp eax,'FLT4'
- je @f
- cmp eax,'FLT8'
- je @f
- jmp loc_close
- @@:
- ; Скопировать название трека
- mov ecx,20
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- cmp dword [esi+14h],'!Scr'
- jne loc_close
- cmp dword [esi+18h],'eam!'
- jne loc_close
- ; Скопировать название трека
- mov ecx,20
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- cmp word [esi+1Ch],101Ah
- jne loc_close
- cmp dword [esi+2Ch],'SCRM'
- jne loc_close
- ; Скопировать название трека
- mov ecx,28
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,'Exte'
- jne loc_close
- lodsd
- cmp eax,'nded'
- jne loc_close
- lodsd
- cmp eax,' Mod'
- jne loc_close
- lodsd
- cmp eax,'ule:'
- jne loc_close
- ; Скопировать название трека
- inc esi
- mov ecx,20
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,104D544Dh
- jne loc_close
- ; Скопировать название трека
- mov ecx,20
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,'IMPM'
- jne loc_close
- ; Скопировать название трека
- mov ecx,26
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,'MAS_'
- jne loc_close
- lodsd
- cmp eax,'UTra'
- jne loc_close
- lodsd
- cmp eax,'ck_V'
- jne loc_close
- lodsw
- lodsb
- ; Скопировать название трека
- mov ecx,32
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,500h
- ; Проверить корректность файла
- mov esi,buff
- cmp word [esi],'if'
- je @f
- cmp word [esi],'JN'
- jne loc_close
- @@:
- ; Скопировать название трека
- mov ecx,108
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,0E464D41h
- jne loc_close
- ; Скопировать название трека
- mov ecx,32
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,'DDMF'
- jne loc_close
- ; Версия и трекер
- lodsb
- lodsd
- lodsd
- ; Скопировать название трека
- mov ecx,30
- mov edi,title
- rep movsb
- ; Скопировать название автора
- mov ecx,20
- mov edi,author
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- invoke PathRemoveBlanks,author
- ; title - название трека
- ; author - название автора
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,0FE524146h
- jne loc_close
- ; Скопировать название трека
- mov ecx,40
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- lodsd
- cmp eax,'FMTr'
- jne loc_close
- lodsd
- cmp eax,'acke'
- jne loc_close
- lodsb
- cmp al,'r'
- jne loc_close
- lodsw
- cmp ax,0x0101
- jne loc_close
- ; Пропустить название трекера
- add esi,20
- ; Скопировать название трека
- mov ecx,32
- mov edi,title
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- ; title - название трека
- loc_close:
- invoke CloseHandle,[desc]
Code (Assembler) : Убрать нумерацию
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,100h
- ; Проверить корректность файла
- mov esi,buff
- cmp dword[esi],0FE4D4447h
- jne loc_close
- cmp dword[esi+47h],'GMFS'
- jne loc_close
- lodsd
- ; Скопировать название трека
- mov ecx,32
- mov edi,title
- rep movsb
- ; Скопировать название автора
- mov ecx,32
- mov edi,author
- rep movsb
- ; Удалить начальные и конечные пробелы
- invoke PathRemoveBlanks,title
- invoke PathRemoveBlanks,author
- ; title - название трека
- ; author - название автора
- loc_close:
- invoke CloseHandle,[desc]
В приложении примеры программ с исходными текстами, которые выводят названия треков различных форматов.
Просмотров: 339 | Комментариев: 3
Метки: Assembler, мультимедиа
Добавить комментарий
Заполните форму для добавления комментария