STF

Введение

Это оригинальный некомпилированный модуль 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 байт:
+0x0032 байта амплитуды
+0x2032 байта шум и маски (биты0-4 – период шума, бит7 – шум, бит6 – тон, bit5 – env).
+0x4032 слова тон (bit0-11 – отклонение тона, bit12 – знак отклонения, 1 – показывается как минус, но реально плюс).
+0x80Начало цикла (нумерация не с нуля, а с 1), если 0 – не зациклен и играются все 32 тика.
+0x81Длина тела цикла (уменьшена на 1).
0x079E256 позиций (пары байт "номер_паттерна[1..31]:транспозиция[-128..127])", отсутствующие здесь паттерны перед сжатием удаляются, на их место сдвигаются оставшиеся, соответственно, после распаковки всё проделывается в обратном порядке.
0x099EКоличество активных позиций, уменьшено на 1.
0x099FПустой нулевой орнамент? (32 нуля).
0x09B1Орнаменты 1-15 (15 штук), каждый 32 байта:
+0Цикл.
+1Длина-1.
+230 отклонений в полутонах.
0x0B9FПустой нулевой орнамент? (32 нуля).
0x0BBFСкорость проигрывания.
0x0BC0Длины паттернов (всего 31 паттерн).
0x0BDFПозиция цикла.
0x0BE0Название (25 символов).
0x0BF9Паттерны (на строку по 3 байта на канал, на паттерн – 3*3*64=576 байт), неиспользованные паттерны перед сжатием удаляются (см. выше).
Формат строки паттерна для одного канала:
+00xF0 – R--, иначе bits4-7 – нота (0 – нет ноты, 1 – A, 2 – B, 3 – C), bits0-2 – октава, начиная с 0, бит3 – диез.
+1bits4-7 – сэмпл, bits0-3: 1/2 – понижение/повышение частоты тона, 3-7 – включает орнамент 0 (хотя заявлено, что ничего не делает), 8-Е огибающая (если с нотой, то громкость принудительно устанавливается в F), F – орнамент, при этом 3-F ещё и отключают slide тона.
+2bits4-7 – громкость, bits0-3 – орнамент (если стоит F ранее) либо все биты – или период огибающей (0..FF), или добавка к частоте тона для slide (0..7F – заявлено в описании, в реале – 80..FF тоже используется, просто меняется направление слайда).

Sound Tracker Pro 48K

Это адаптация Sound Tracker Pro для режима 48K, выполненная в 1998 году Олегом Ивановым (Saruman).

Сохраняет некомпилированные модули с расширением 'f' и адресом загрузки 25000. Я пока ещё не заглядывал внутрь, но, судя по описанию программы, они должны иметь структуру распакованного модуля STF.