ST3

Введение

Модулей данного формата не много. Они встречаются в небольшом количестве программ ZX Spectrum.

Внутри кодов проигрывателя данного формата можно обнаружить авторскую строку длиной 55 байт, начинающуюся с "KSA SOFTWARE COMPILATION OF ". В отличие от аналогичных строк в других плеерах, в нём нет фиксированного тега " BY ".

В различных коллекциях музыки для обозначения формата получило распространение расширение имени файла ST3.

Мне неизвестна причина, по которой данный формат приписывают Sound Tracker 3. Я проанализировал редакторы Sound Tracker 3 из самых разных источников и не обнаружил ни одного, который компилирует в формат, отличный от стандартного.

Доступные мне версии Sound Tracker 3 к стандартному STC добавляют плеер с авторской строкой, начинающейся с другого идентификатора: "SOUND TRACKER COMPILATION OF ", в котором тэг " BY " находится в фиксированном месте.

По сути, формат ST3 представляет собой альтернативный способ компиляции ST1. Также, как и с форматом FLS, есть подозрение, что никакого отдельного редактора не существует, а есть простая перекомпиляция STC. И поэтому также возможен процесс обратной перекомпиляции в STC без потерь. Так, Ay_Emul позволяет сохранить загруженные ST3 из окна плейлиста в виде STC, при этом найденные авторские строки не теряются и вставляются в тело модуля.

Структура модуля

Структура похожа на STC, терминология используется та же (см. описание STC или ST1). Многоточия в таблице ниже обозначают, что с этого места друг за другом следуют аналогичные описанной выше структуры.

Указатели относительные (от начала модуля). Однако, после вызова инициализации проигрывания в родном плеере, смещения до тела орнаментов и сэмплов привязываются к адресу загрузки модуля.

СмещениеРазмерОбозначениеОписание
+01tempoСкорость проигрывания.
+12posptrУказатель на список позиций.
+32samptrУказатель на список сэмплов.
+52ornptrУказатель на список орнаментов.
+72patptrУказатель на список паттернов.
Сэмплы (структура описана в конце).
+9=sam0ptr130sam0Тело сэмпла 0.
+sam1ptr130sam1Тело сэмпла 1.
...
+posptr1lenКоличество позиций (есть модули, где len уменьшен на 1, и выпавшая в результате позиция в худшем случае ссылается на несуществующий паттерн).
+posptr+12transposition,(pat-1)*6Транспозиция и номер паттерна в позиции 1.
+posptr+32transposition,(pat-1)*6Транспозиция и номер паттерна в позиции 2.
...
+samptr1lenКоличество элементов в списке сэмплов (нумерация сэмплов не с 1 как в ST1, а с нуля, указатели могут быть привязаны к адресу загрузки модуля).
+samptr+12sam0ptrУказатель на сэмпл 0, обычно равен +9.
+samptr+32sam1ptrУказатель на сэмпл 1.
...
Орнаменты (каждый по структуре как обычный орнамент в STC).
+orn0ptr32orn0Тело орнамента 0 (должно быть 32 нуля).
+orn1ptr32orn1Тело орнамента 1.
...
+ornptr1lenКоличество элементов в списке орнаментов (указатели могут быть привязаны к адресу загрузки модуля).
+ornptr+12orn0ptrУказатель на орнамент 0.
+ornptr+32orn1ptrУказатель на орнамент 1.
...
Далее идут тела паттернов канала (дубли отсеяны).
+pat1ptrA?patdataОбычный паттерн канала STC с 255 на конце.
+pat1ptrB?patdataОбычный паттерн канала STC с 255 на конце.
+pat1ptrC?patdataОбычный паттерн канала STC с 255 на конце.
+pat2ptrA?patdataОбычный паттерн канала STC с 255 на конце.
+pat2ptrB?patdataОбычный паттерн канала STC с 255 на конце.
+pat2ptrC?patdataОбычный паттерн канала STC с 255 на конце.
...
?1unknownНеизвестный байт (в одном модуле 0, в другом 0x76, а в TheLast1.st3 его вообще нет).
+patptr6pat1ptrA,pat1ptrB,pat1ptrCУказатели паттерна 1 на тела паттернов каждого из каналов.
+patptr+66pat2ptrA,pat2ptrB,pat2ptrCУказатели паттерна 2 на тела паттернов каждого из каналов.
...

Особенности нумерации сэмплов

Чтобы не хранить лишние 130 байт на каждый неиспользуемый сэмпл, используемые сэмплы перенумерованы, начиная с 0. Соответственно в паттерне канала есть ссылки на нулевой сэмпл, что сбивает с толку некоторые декомпиляторы STC.

Тем не менее, это обычный паттерн STC и при конвертации из ST3 в STC достаточно его просто скопировать без изменений.

А для правильно написанного декомпилятора (для такого, как например в Vortex Tracker II) подобная перенумерация сэмплов проблем не вызывает, так как она полностью совместима с оригинальным плеером STC.

Структура сэмпла (размер 130 байт = 2+4*32):

СмещениеРазмерОбозначениеОписание
+01lpbeginНачало цикла (0..31).
+11lpendКонец цикла (0..31). Если lpbegin = lpend = 0 – не зациклен.
+22tone00-й тик: отклонение тона (-0xFFF..0xFFF).
+41ampmsk0Биты 0..3 – амплитуда, бит 4 – маска тона, бит 7 – маска шума.
+51noise0Биты 0..4 – период шума.
+62tone11-й тик: отклонение тона (-0xFFF..0xFFF).
+81ampmsk1Биты 0..3 – амплитуда, бит 4 – маска тона, бит 7 – маска шума.
+91noise1Биты 0..4 – период шума.
...

Особенности родного проигрывателя

В отличие от родного плеера STC, в плеере ST3 незацикленные сэмплы на 33-м тике глушатся другим способом, а каналы выводятся в обратном порядке от C к A (в результате меняется приоритет установки частоты шума из сэмпла). Поэтому если вы запишите и сравните PSG этих плееров на одних и тех же модулях, в общем случае увидите разницу на соответствующих тиках.

Авторская строка внутри тела модуля

В различных коллекциях музыки встречаются ST3 с авторской строкой внутри. Это копия строки из тела плеера. Вставляется она по смещению +9 (в то место, где в исходном модуле находится тело сэмпла 0).

Модификация модуля производится в несколько шагов: