Модулей данного формата не много. Они встречаются в небольшом количестве программ 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). Многоточия в таблице ниже обозначают, что с этого места друг за другом следуют аналогичные описанной выше структуры.
Указатели относительные (от начала модуля). Однако, после вызова инициализации проигрывания в родном плеере, смещения до тела орнаментов и сэмплов привязываются к адресу загрузки модуля.
Смещение | Размер | Обозначение | Описание |
---|---|---|---|
+0 | 1 | tempo | Скорость проигрывания. |
+1 | 2 | posptr | Указатель на список позиций. |
+3 | 2 | samptr | Указатель на список сэмплов. |
+5 | 2 | ornptr | Указатель на список орнаментов. |
+7 | 2 | patptr | Указатель на список паттернов. |
Сэмплы (структура описана в конце). | |||
+9=sam0ptr | 130 | sam0 | Тело сэмпла 0. |
+sam1ptr | 130 | sam1 | Тело сэмпла 1. |
... | |||
+posptr | 1 | len | Количество позиций (есть модули, где len уменьшен на 1, и выпавшая в результате позиция в худшем случае ссылается на несуществующий паттерн). |
+posptr+1 | 2 | transposition,(pat-1)*6 | Транспозиция и номер паттерна в позиции 1. |
+posptr+3 | 2 | transposition,(pat-1)*6 | Транспозиция и номер паттерна в позиции 2. |
... | |||
+samptr | 1 | len | Количество элементов в списке сэмплов (нумерация сэмплов не с 1 как в ST1, а с нуля, указатели могут быть привязаны к адресу загрузки модуля). |
+samptr+1 | 2 | sam0ptr | Указатель на сэмпл 0, обычно равен +9. |
+samptr+3 | 2 | sam1ptr | Указатель на сэмпл 1. |
... | |||
Орнаменты (каждый по структуре как обычный орнамент в STC). | |||
+orn0ptr | 32 | orn0 | Тело орнамента 0 (должно быть 32 нуля). |
+orn1ptr | 32 | orn1 | Тело орнамента 1. |
... | |||
+ornptr | 1 | len | Количество элементов в списке орнаментов (указатели могут быть привязаны к адресу загрузки модуля). |
+ornptr+1 | 2 | orn0ptr | Указатель на орнамент 0. |
+ornptr+3 | 2 | orn1ptr | Указатель на орнамент 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 на конце. |
... | |||
? | 1 | unknown | Неизвестный байт (в одном модуле 0, в другом 0x76, а в TheLast1.st3 его вообще нет). |
+patptr | 6 | pat1ptrA,pat1ptrB,pat1ptrC | Указатели паттерна 1 на тела паттернов каждого из каналов. |
+patptr+6 | 6 | pat2ptrA,pat2ptrB,pat2ptrC | Указатели паттерна 2 на тела паттернов каждого из каналов. |
... |
Чтобы не хранить лишние 130 байт на каждый неиспользуемый сэмпл, используемые сэмплы перенумерованы, начиная с 0. Соответственно в паттерне канала есть ссылки на нулевой сэмпл, что сбивает с толку некоторые декомпиляторы STC.
Тем не менее, это обычный паттерн STC и при конвертации из ST3 в STC достаточно его просто скопировать без изменений.
А для правильно написанного декомпилятора (для такого, как например в Vortex Tracker II) подобная перенумерация сэмплов проблем не вызывает, так как она полностью совместима с оригинальным плеером STC.
Смещение | Размер | Обозначение | Описание |
---|---|---|---|
+0 | 1 | lpbegin | Начало цикла (0..31). |
+1 | 1 | lpend | Конец цикла (0..31). Если lpbegin = lpend = 0 – не зациклен. |
+2 | 2 | tone0 | 0-й тик: отклонение тона (-0xFFF..0xFFF). |
+4 | 1 | ampmsk0 | Биты 0..3 – амплитуда, бит 4 – маска тона, бит 7 – маска шума. |
+5 | 1 | noise0 | Биты 0..4 – период шума. |
+6 | 2 | tone1 | 1-й тик: отклонение тона (-0xFFF..0xFFF). |
+8 | 1 | ampmsk1 | Биты 0..3 – амплитуда, бит 4 – маска тона, бит 7 – маска шума. |
+9 | 1 | noise1 | Биты 0..4 – период шума. |
... |
В отличие от родного плеера STC, в плеере ST3 незацикленные сэмплы на 33-м тике глушатся другим способом, а каналы выводятся в обратном порядке от C к A (в результате меняется приоритет установки частоты шума из сэмпла). Поэтому если вы запишите и сравните PSG этих плееров на одних и тех же модулях, в общем случае увидите разницу на соответствующих тиках.
В различных коллекциях музыки встречаются ST3 с авторской строкой внутри. Это копия строки из тела плеера. Вставляется она по смещению +9 (в то место, где в исходном модуле находится тело сэмпла 0).
Модификация модуля производится в несколько шагов: