ITHACK 1.0 ИНСТРУКЦИЯ ПО РАБОТЕ (c) Андрей Бобин, Май 1999 1. Что такое утилита ITHack. 2. Как этим пользоваться. 3. Условия распространения. ------------------------------------------------------------------------ 1. Что такое утилита ITHack. В модулях для музыкального трэкера IMPULSE TRACKER есть недокументированная область, так называемый "протокол работы с модулем" (ПРМ). Там хранится информация о всех сеансах редактирования данного модуля, а именно: время загрузок модуля и длительность сеансов. Подробная информация о структуре этой области содержится в файле ITUNDOC.TXT. Утилита ITHack предназначена для работы с этим самым ПРМ. Она может копировать его в текстовые файлы, может удалять его из модулей. ------------------------------------------------------------------------ 2. Как этим пользоваться. Параметры командной строки для запуска ITHACK: ITHACK.EXE [/l ] [/s] [/clear] /l = copy log from module to textfile ; /s = show total module edit time; /clear = clear the log in module. /l - создает текстовый файл с именем (не забудьте указать его после /l через пробел), в который в удобочитаемом виде копирует содержимое протокола из модуля ; /s - выводит на экран общее время редактирования модуля ; оно определяется как сумма времени по всем сеансам редактирования. /clear - очищает (забивает нулями) протокол в модуле ; защита от записи (Read Only) не является помехой. Параметры можно комбинировать, пример: ITHACK.EXE mymodule.it /clear /l mylog.txt /s /s /s /clear /s Сначала будет создан файл mylog.txt с ПРМ, затем выведется на экран общее время редактирования, затем ПРМ будет обнулен. Q.: А что будет, если после очистки протокола модуль загрузить в IT и попытаться пересохранить? Не приведет ли это к ошибке или порче модуля? A.: Нет. IT "подумает", что модуль только что создан, и начнет вести протокол заново, с первой строчки, выкинув при этом все нули, появившиеся после очистки. Правда, забавно? На сохранности данных это никак не отражается, так как при очистке с помощью ITHack протокол просто забивается нулями. К тому же, ПРМ не является обязательной частью модуля. Q.: А я вот пытался посмотреть ПРМ в одном моем старом it-модуле, а ITHack сказала, что это старый формат, и не стала ничего показывать. Что представляет из себя этот старый формат? A.: Дело в том, что ранние версии IT не вели ПРМ. Поэтому модули, созданные в этих версиях трэкера, его не содержат. Об этом вам и сообщила ITHack. О том, как она определяет отсутствие ПРМ в модулях, можно почитать в файле ITUNDOC.TXT. ------------------------------------------------------------------------ 3. Условия распространения. Утилита ITHack распространяется абсолютно свободно, при этом запрещается: - внесение любых изменений в код программы и документацию; - получение коммерческой выгоды от распространения утилиты или документации к ней. Утилита ITHack распространяется в соответствии с общепринятым в компьютерной практике принципом AS IS, означающим, что за проблемы, возникшие в процессе эксплуатации утилиты ITHack, автор никакой ответственности не несет. Если вас лично это не устраивает - не используйте ее. Автор утилиты: Andrew Bobin aka Virtex e-mail: anbo@newmail.ru 2:5057/29.49@FidoNet НЕКОТОРЫЕ НЕДОКУМЕНТИРОВАННЫЕ ПОЛЯ ФАЙЛОВ ФОРМАТА .IT (IMPULSE TRACKER MUSIC MODULE) (c) Андрей Бобин, Май 1999 Всякий, кто имеет то или иное отношение к созданию музыки на PC, наверняка знаком с прекрасным музыкальным редактором-трэкером Impulse Tracker by Jeffrey Lim. И наверняка предпочитает хранить свои модули в родном формате этого трэкера (файлы *.it). Структура этих файлов описана JL в документации к IT (файл ittech.doc). Но мало кто догадывается о том, что файлы эти имеют области, о которых нет совершенно никакого упоминания в (официальной) документации. Ниже пойдет речь об одной из таких, той, что я назвал "протокол работы с модулем" (ПРМ). Итак, вот выдержка из файла ittech.doc: IMPULSE HEADER LAYOUT 0 1 2 3 4 5 6 7 8 9 A B C D E F ┌───┬───┬───┬───┬───────────────────────────────────────────────┐ 0000: │'I'│'M'│'P'│'M'│ SONG NAME, MAX 26 CHARACTERS, INCLUDES NULL │ ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤ 0010: │.......................................................│ X │ X │ ├───────┬───────┬───────┬───────┬───────┬───────┬───────┼───┴───┤ 0020: │ORDNUM │INSNUM │SMPNUM │PATNUM │ CWT/V │ CMWT │ FLAGS │SPECIAL│ ├───┬───┼───┬───┼───┬───┼───────┼───────┴───────┼───┬───┼───┬───┤ 0030: │GV │MV │IS │IT │SEP│(0)│MSGLGTH│MESSAGE OFFSET │ X │ X │ X │ X │ ├───┴───┴───┴───┴───┴───┴───────┴───────────────┴───┴───┴───┴───┤ 0040: │ CHNL PAN (64 BYTES)...........................................│ ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤ ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤ 0080: │ CHNL VOL (64 BYTES)...........................................│ ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤ ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤ 00C0: │ ORDERS, LENGTH = ORDNUM │ ├───────────────────────────────────────────────────────────────┤ XXXX: │ 'LONG' OFFSET OF INSTRUMENTS, LENGTH = INSNUM*4 (1) │ ├───────────────────────────────────────────────────────────────┤ XXXX: │ 'LONG' OFFSET OF SAMPLES HEADERS, LENGTH = SMPNUM*4 (2) │ ├───────────────────────────────────────────────────────────────┤ XXXX: │ 'LONG' OFFSET OF PATTERNS, LENGTH = PATNUM*4 (3) │ └───────────────────────────────────────────────────────────────┘ YYYY: По сути, в файле после описания смещений инструментов, сэмплов и паттернов должны начинаться собственно сами инструменты, сэмплы, паттерны (со смещения, обозначенного YYYY). Но на самом деле это не так. Начиная со смещения YYYY, в файле расположен тот самый ПРМ, о котором и идет речь. Таким образом, смещение ПРМ в файле вычисляется косвенно следующим образом: YYYY = C0h + ORDNUM + (INSNUM + SMPNUM + PATNUM)*4 Как мне удалось установить, ПРМ имеет следующую структуру: ПРОТОКОЛ РАБОТЫ С МОДУЛЕМ 0 1 2 3 4 5 6 7 8 9 A B C D E F ┌───────┬───────────────────────────────┬───────────────────────┐ 0000: │RECNUM │ RECORD N1 ------------------> │ RECORD N2 ------------- ├───────┼───────────────────────────────┼───────────────────────┤ 0010: ------> │ RECORD N3 ------------------> │ RECORD N4 ------------- ├───────┼───────────────────────────────┼───────────────────────┘ 0020: ------> │ RECORD N5 ------------------> │....................... └───────┴───────────────────────────────┘ Т.е. в начале указано количество записей RECNUM размером 2 байта (WORD), далее идут сами записи. Длина каждой записи 8 байт. Биты в каждой записи имеют следующее назначение: НАЗНАЧЕНИЕ БИТОВ ЗАПИСИ ПРМ ДЛИТЕЛЬНОСТЬ СЕАНСА РАБОТЫ НАЧАЛО СЕАНСА РАБОТЫ BYTE 7 BYTE 6 BYTE 5 BYTE 4 BYTE 3 BYTE 2 BYTE 1 BYTE 0 ┌──────┐┌──────┐┌──────┐┌──────┐ ┌──────┐┌──────┐ ┌──────┐┌──────┐ 76543210765432107654321076543210 7654321076543210 7654321076543210 ├┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘ └┴┴┴┤└┴┴┴┴┤└┴┴┴┤ └┴┴┴┴┴┤└┴┴┤└┴┴┴┤ ╘════─ TIMER_TICS │ HOUR (0..23) ─═══╛ │ │ │ │ │ (0..2^32-1) │ MINUTE (0..59) ─═══════╛ │ │ │ │ │ SEC/2 (0..29) ─═════════════╛ │ │ │ │ YEAR-1980 (0..127) ─════════════════╛ │ │ │ MONTH (1..12) ─═════════════════════════╛ │ │ DAY (1..31) ─════════════════════════════════╛ Думаю, назначение полей байтов 0-3 не вызывает вопросов. Это классическая схема упаковки даты-времени, используемая, к примеру, в MS-DOS для хранения даты и времени модификации файлов. Каждый раз, когда модуль загружается в IT, запоминается время его загрузки, и при сохранении модуля оно записывается в байты 0-3 очередной записи. Обратите внимание: сохраняется именно время загрузки, а не время сохранения. Насчет байтов 4-7. IT перехватывает прерывание от таймера, устанавливая свой обработчик на Int08h или Int1Ch. Обработчик каждый раз при вызове увеличивает на единицу значение некоторого 32-битного счетчика. Когда в IT загружается очередной модуль, этот счетчик обнуляется. Когда же осуществляется сохранение модуля, содержимое счетчика копируется в байты 4-7 очередной записи. А теперь о том, как перевести это в привычные нам секунды. Таймер 'тикает' с интервалом 55 мс. Таким образом: SECONDS = TIMER_TICS * 0.055 Ну а дальше, деля на 60 или 3600, из этого можно получить минуты или часы. И еще. Ранние версии IT не вели ПРМ, поэтому старые модули (~95-й год) его не имеют. Как определить, есть в файле ПРМ или нет? В своей утилите ITHack, предназначенной для работы с ПРМ (копирование в текстовый файл, очистка и др. функции), я использовал следующий метод. Начиная со смещения C0h + ORDNUM, в файле перечисляются смещения инструментов, сэмплов и паттернов. Обозначим именем FIRSTOFFS значение первого из перечисляемых смещений. Оно занимает 4 байта (LONG) и находится прямо по смещению C0h + ORDNUM. Еще. Если в модуле присутствует MESSAGE (сообщение, которое можно добавить, нажав SHIFT + F9), то оно располагается в файле (по смещению MESSAGE_OFFSET) сразу после перечисления всех этих смещений. Так вот: ЕСЛИ (YYYY = FIRSTOFFS) OR (YYYY = MESSAGE_OFFSET), ТО В ФАЙЛЕ _НЕТ_ ПРМ. Вот, вроде бы, и все, что мне удалось узнать о ПРМ в модулях IT. Надеюсь, и вы теперь будете знать об этом не меньше...