Это оригинальный некомпилированный модуль Sound Tracker Pro – музыкальный AY редактор для ZX Spectrum, автор Станислав Кузин (KSA). Разрабатывался методом улучшения возможностей Sound Tracker, поэтому во многом сохранил с ним обратную совместимость.
Также как и ST1, файл модуля STF – это дамп памяти редактора с адреса 25000, но предварительно подготовленный к сохранению и сжатый. В нём могут быть некоторые паттерны и все внутренние структуры, сэмплы и орнаменты.
Оригинальные файлы на дисках TR-DOS можно идентифицировать по расширению 'F' с адресом загрузки 25000.
Одним из недостатков предшественника Sound Tracker является большой размер некомпилированных модулей. Решение KSA оказалось достаточно прямолинейно: он исключил при сохранении неиспользуемые в списке позиций паттерны и упаковал выгружаемые данные методом RLE.
Алгоритм упаковки, возможно, не очень удачный, так как после распаковки в общем случае получается больше данных, чем необходимо. Тем не менее, к сбою это не приводит, а лишние данные можно просто игнорировать.
Применён метод сжатия типа RLE. Для того, чтобы понять, как распаковать сжатый блок, достаточно бит за битом его изучить, используя следующий псевдокод.
первый байт – на стек | |||
следующий байт | |||
bit0 | |||
1 | {bit1 | ||
1 | {bit2 | ||
1 | {(bit3-7)-1->[буфер распаковки]x2 раз | ||
} | |||
0 | {первый байт со стека в [буфер распаковки], конец | ||
} | |||
} | |||
0 | {bit2-4->B,bit5-7->C,перемещаем C байт из [буфер распаковки-(B*256+следующий байт)] в [буфер распаковки] | ||
} | |||
} | |||
0 | {bit1 | ||
1 | {bit2 | ||
1 | {bit3-7->C,перемещаем (С+1) байт в [буфер распаковки] | ||
} | |||
0 | {bit3-7->B,следующий байт->C,перемещаем C байт из [буфер распаковки-(B*256+следующий байт)] в [буфер распаковки] | ||
} | |||
} | |||
0 | {bit2 | ||
1 | {bit3-7->C,следующий байт->[буфер распаковки]x(C+3) раз | ||
} | |||
0 | {bit3-7->B,следующий байт->C,следующий байт->[буфер распаковки]x(BC+3) раз | ||
} | |||
} | |||
} |
В памяти редактора тела паттернов имеют одинаковый размер и идут друг за другом. Перед сжатием с помощью списка позиций определяются используемые паттерны, и только они попадают в сохраняемый файл.
После распаковки все сохранённые паттерны оказываются по соседству друг с другом (например, если не используется второй паттерн, то в распакованных данных за первым паттерном будет идти сразу третий). Поэтому в памяти родного редактора проделывается обратная операция: распакованные паттерны расставляются по своим местам.
Смещение | Описание | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | Сэмплы 1-15 (15 штук), каждый 0x82 байт:
| ||||||||||
0x079E | 256 позиций (пары байт "номер_паттерна[1..31]:транспозиция[-128..127])", отсутствующие здесь паттерны перед сжатием удаляются, на их место сдвигаются оставшиеся, соответственно, после распаковки всё проделывается в обратном порядке. | ||||||||||
0x099E | Количество активных позиций, уменьшено на 1. | ||||||||||
0x099F | Пустой нулевой орнамент? (32 нуля). | ||||||||||
0x09B1 | Орнаменты 1-15 (15 штук), каждый 32 байта:
| ||||||||||
0x0B9F | Пустой нулевой орнамент? (32 нуля). | ||||||||||
0x0BBF | Скорость проигрывания. | ||||||||||
0x0BC0 | Длины паттернов (всего 31 паттерн). | ||||||||||
0x0BDF | Позиция цикла. | ||||||||||
0x0BE0 | Название (25 символов). | ||||||||||
0x0BF9 | Паттерны (на строку по 3 байта на канал, на паттерн – 3*3*64=576 байт), неиспользованные паттерны перед сжатием удаляются (см. выше). Формат строки паттерна для одного канала:
|
Это адаптация Sound Tracker Pro для режима 48K, выполненная в 1998 году Олегом Ивановым (Saruman).
Сохраняет некомпилированные модули с расширением 'f' и адресом загрузки 25000. Я пока ещё не заглядывал внутрь, но, судя по описанию программы, они должны иметь структуру распакованного модуля STF.