SQT

Введение

Это компилированные модули 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, близка к логарифмической.

Формат модуля

СмещениеРазмерОбозначениеОписание
+02SizeРазмер модуля
+22SamsPtrУказатель на смещения сэмплов (уменьшен на 2, нумерация сэмплов с 1)
+42OrnsPtrУказатель на смещения орнаментов (уменьшен на 2, нумерация орнаментов с 1)
+62PatsPtrУказатель на смещения паттернов (уменьшен на 2, нумерация паттернов с 1)
+82PossPtrУказатель на список позиций
+102LoopPtrУказатель на позицию цикла
+(SamsPtr+2)?SamPtrsСмещения сэмплов по порядку (по 2 байта на сэмпл)
+(OrnsPtr+2)?OrnPtrsСмещения орнаментов по порядку (по 2 байта на орнамент)
+(PatsPtr+2)?PatPtrsСмещения паттернов каналов по порядку (по 2 байта на паттерн)
+SamPtrs[]?SamplesСэмплы друг за другом (описан далее)
+OrnPtrs[]?OrnamentsОрнаменты друг за другом (описан далее)
+PatPtrs[]?PatternsПаттерны канала друг за другом (описан далее)
+PossPtr?PositionsСписок позиций в порядке проигрывания (по 6 байт на позицию, описана далее). Заканчивается позицией со всеми обнулёнными байтами.

Сэмпл

СмещениеРазмерОписание
+01Точка цикла (0..31) или запрет зацикливания (32).
+11Длина тела цикла в тиках.
+29632 трёхбайтовых тика друг за другом. Каждый тик:
+0 Биты 7–4: старшие биты периода шума. Биты 3–0: амплитуда; огибающие допускаются только для амплитуды 0.
+1 Бит 7: младший бит периода шума. Бит 6: маска тона: Бит 5: маска шума (период шума используется только если шум разрешён маской). Бит 4: знак отклонения периода тона (1 – плюс, 0 – минус). Биты 3–0: старшие биты отклонения периода тона.
+2 Младший байт отклонения периода тона.

Орнамент

СмещениеРазмерОписание
+01Точка цикла (0..31) или взять точку и тело цикла из текущего сэмпла (32).
+11Длина тела цикла в тиках.
+23232 однобайтовых тика орнамента (число со знаком).

Паттерн канала

СмещениеОписание
+0Количество строк в паттерне.
+1Тело паттерна.

Тело паттерна канала

В квадратных скобках – необязательный байт.

БайтыОписание
0x00..0x5F, Cmd, [Prm], [Prm2]Установить ноту 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.