Это компилированные модули SQ Tracker (Scalex Qjeta Tracker), проект Jiri Koudelka (George K.).
Проект популярен в основном в Восточной Европе. Как и многие проекты, альтернативные популярному тогда Sound Tracker, появился во второй четверти 90-х – в 1993 году. Претензия на трекер нового поколения получилась не такая мощная, как у ASC Sound Master, но тем не менее по возможностям он сопоставим с PT2, до появления которого было ещё достаточно много времени.
В отличие от других форматов, в паттернах которых данные каналов A, B и C сгруппированы, образуя единую структуру, в SQT каждый паттерн канала независим. Музыкант по своему усмотрению заполняет позицию в списке проигрывания тремя паттернами (по числу каналов) и другими параметрами, которые делают данную позицию уникальной структурой, аналогов которой нет ни в одном другом трекере ZX Spectrum.
Некоторые особенности SQT выдают прототип (ST): например, в заголовке присутствует поле с размером модуля; длина сэмпла и орнамента фиксирована и равна 32 (всегда отыгрываются эти 32 тика, и только потом происходит зацикливание с определённой точки и размером цикла); орнамент кроме собственных параметров цикла, может быть зациклен и в стиле ST.
В то же время, формат компилированного паттерна спроектирован иначе, в нём нет, как во многих трекерах, побайтового циклического перебора вариантов с каждым встреченным байтом. Вместо этого анализатор работает по принципу "Зашёл, выполнил один из наборов стандартных действий, вышел". Есть оптимизация в виде повтора предыдущего действия нужное число раз, в результате и паттерн компактнее, и выход из анализатора происходит практически сразу.
И при этом в родном плеере можно увидеть какие-то избыточные действия и даже предположить отсутствие каких-то данных в формате, так как, если бы они были, был бы сбой. То есть с точки зрения плеера (с которой я и проводил реверс-инжиниринг) формат может показаться сложнее и непонятнее, чем он есть на самом деле.
Модуль SQT может быть привязан к адресу компиляции (при сохранении из Ay_Emul производится отвязка). Но даже в привязанном модуле этот адрес определяется однозначно, т.к. SamsPtr всегда указывает на 10-й байт от начала модуля (см. ниже).
Громкость каналов регулируется без использования сложных формул или таблиц (как это сделано во многих других трекерах): через простое вычитание из амплитуды значения "15-громкость" (данное значение в уже вычисленном виде хранится в теле паттерна). Это корректно, так как выходная характеристика ЦАП и AY, и тем более YM, близка к логарифмической.
Смещение | Размер | Обозначение | Описание |
---|---|---|---|
+0 | 2 | Size | Размер модуля |
+2 | 2 | SamsPtr | Указатель на смещения сэмплов (уменьшен на 2, нумерация сэмплов с 1) |
+4 | 2 | OrnsPtr | Указатель на смещения орнаментов (уменьшен на 2, нумерация орнаментов с 1) |
+6 | 2 | PatsPtr | Указатель на смещения паттернов (уменьшен на 2, нумерация паттернов с 1) |
+8 | 2 | PossPtr | Указатель на список позиций |
+10 | 2 | LoopPtr | Указатель на позицию цикла |
? | SamPtrs | Смещения сэмплов по порядку (по 2 байта на сэмпл) | |
? | OrnPtrs | Смещения орнаментов по порядку (по 2 байта на орнамент) | |
? | PatPtrs | Смещения паттернов каналов по порядку (по 2 байта на паттерн) | |
+SamPtrs[] | ? | Samples | Сэмплы друг за другом (описан далее) |
+OrnPtrs[] | ? | Ornaments | Орнаменты друг за другом (описан далее) |
+PatPtrs[] | ? | Patterns | Паттерны канала друг за другом (описан далее) |
+PossPtr | ? | Positions | Список позиций в порядке проигрывания (по 6 байт на позицию, описана далее). Заканчивается позицией со всеми обнулёнными байтами. |
Смещение | Размер | Описание |
---|---|---|
+0 | 1 | Точка цикла (0..31) или запрет зацикливания (32). |
+1 | 1 | Длина тела цикла в тиках. |
+2 | 96 | 32 трёхбайтовых тика друг за другом. Каждый тик: +0 Биты 7–4: старшие биты периода шума. Биты 3–0: амплитуда; огибающие допускаются только для амплитуды 0. +1 Бит 7: младший бит периода шума. Бит 6: маска тона: Бит 5: маска шума (период шума используется только если шум разрешён маской). Бит 4: знак отклонения периода тона (1 – плюс, 0 – минус). Биты 3–0: старшие биты отклонения периода тона. +2 Младший байт отклонения периода тона. |
Смещение | Размер | Описание |
---|---|---|
+0 | 1 | Точка цикла (0..31) или взять точку и тело цикла из текущего сэмпла (32). |
+1 | 1 | Длина тела цикла в тиках. |
+2 | 32 | 32 однобайтовых тика орнамента (число со знаком). |
Смещение | Описание |
---|---|
+0 | Количество строк в паттерне. |
+1 | Тело паттерна. |
В квадратных скобках – необязательный байт.
Байты | Описание |
---|---|
Установить ноту 0..95. Обработать байты Cmd, [Prm], [Prm2] (см. ниже "Проверка наличия сэмпла, орнамента и эффекта"). Выйти. | |
0x60..0x6E, Prm | Установить эффект 0..14 с параметром. Выглядит странно (возможно в этом месте в плеере ошибка, т.к. эффект 0 лишний, а 15 наоборот не хватает). Выйти. |
0x6F..0x7F, Prm | Отключить канал. Для 0x70..0x7F установить 1..16 эффект соответственно (с параметром Prm), для 0x6F Prm игнорируется. Выйти. |
0x80..0x9F, Prm | Изменить ноту на указанное количество полутонов. Биты 3–0: абсолютное количество полутонов. Бит 4: 0 для добавления, 1 для вычитания. Повторить установку сэмпла, орнамента (при наличии) и эффекта (при наличии, описано ниже). Выйти. |
0xA0..0xAF | Выйти. Пропустить 0..15 строк. |
0xB0 | Повторить установку сэмпла, орнамента (при наличии) и эффекта (при наличии). Выйти. |
0xB1..0xBF | Повторить установку сэмпла, орнамента (при наличии) и эффекта (при наличии). Выйти. При последующих входах 1..15 раз повторять установку тех же сэмпла, орнамента (при наличии) и эффекта (при наличии) и выходить. |
0xC0..0xFF | Установить сэмпл 0..31 (хотя фактически, 0-го сэмпла нет в формате). Выйти. |
После команды установки ноты следует от 1 до 3 байт (Cmd, [Prm], [Prm2]), в которых могут быть закодированы сэмпл, орнамент и эффект. Ниже описано то, как их декодировать.
Проверить наличие ненулевого номера сэмпла (если в Cmd установлен бит 7, номер находится в битах 5–1), установить при наличии. Проверить наличие ненулевого орнамента (если в Cmd установлены биты 7 и 6, в бит 0 находится старший бит номера, а в битах 7–4 Prm – младшие биты), установить при наличии. Проверить наличие ненулевого номера эффекта с параметром (если в Cmd не установлен бит 7, то номер эффекта находится в битах 6–0, а параметр – в Prm, если в Cmd установлены биты 7 и 6, то номер эффекта находится в битах 3–0 Prm, а параметр – в Prm2), установить при наличии (описание далее).
Формат паттерна позволяет повторить действие байтов <0xC0..0xFF> (установка сэмпла) и <0x00..0x5F, Cmd, [Prm], [Prm2]> (последнее без изменения ноты, только проверка наличия сэмпла, орнамента и эффекта).
При каждом входе в анализатор паттерна уменьшается счётчик повторов, и пока он не обнулился, вместо продолжения анализа паттернов и производится повтор установки и выход.
Эффекты 1–6 можно запретить в списке позиций.
1. Громкость канала (значение 0..15 в битах 3–0). 0 – максимальная громкость, 15 – минимальная.
2. Добавка к громкости канала (берутся только биты 3–0 результата).
3. Громкость для всех каналов (аналогично 1).
4. Добавка к громкости всех каналов (аналогично 2).
5. Скорость проигрывания (значение 0..31 в битах 4–0, 0 заменить 32).
6. Добавка к скорости проигрывания (берутся только биты 4–0 результата, 0 заменить 32).
7. Глисс тона вверх каждое прерывание с шагом в параметре (т.е. параметр вычитается из накопления сдвига тонового периода).
8. Глисс тона вниз (аналогично 7, но параметр прибавляется).
9–15. Разрешить огибающие. Номер эффекта – это увеличенный на 1 тип огибающей, а параметр – младший байт периода (старший байт всегда 0).
Примечание: теоретически плеер может передать в подпрограмму установки эффекта любой номер от 0 до 127, всё, что за пределами диапазона [1..8] за вычетом единицы превращается в тип огибающей (4 младших бита результата). По косвенным признакам, штатный тип огибающих в SQ Tracker должен быть в пределах [8..14].
Размер 6 байт, на каждый канал по 2 байта:
Смещение | Описание |
---|---|
+0 | Бит 7: 1, если эффекты разрешены. Биты 6–0: номер паттерна канала. |
+1 | Биты 7–4: транспозиция в полутонах (0 – без транспозиции, 1..8 – вверх; 9..15 – вниз на 1..7 соответственно). Биты 3–0: начальная громкость канала. |
В некоторых программах на ZX Spectrum встречаются необычные SQT-модули. Играет их модифицированный под проигрывание нескольких модулей плеер (номер мелодии передаётся на входе процедуры инициализации).
За плеером друг за другом следуют обычные с виду SQT-модули, однако они имеют ссылки друг на друга на совпадающие структуры. Если их просто разъединить на отдельные модули, полноценными получатся только те, которые не используют ничего из других модулей.
Пока такие "сборки" в Ay_Emul не поддержаны, и для добавления в Tr_Songs они просто конвертируются в формат AY.