PT2

Введение

Это оригинальный модуль Pro Tracker v2.x – музыкальный AY редактор для ZX Spectrum, автор Николай Худенцов (Nick).

История началась с Pro Tracker 1.1 (см. описание формата PT1). Формат стал развитием его идей: добавлены глисы, портаменто, управление шумом из трека (а не только из сэмпла), независимое от сэмплов зацикливание орнаментов. И в совокупности с возможностями, унаследованными от PT1, получился мощный инструмент, признанный большинством музыкантом второй половины 90-х.

Формат PT2 хорошо описал VfNG в электронной газете Echo № 2 (приведён в конце; изучите, чтобы понимать некоторые обозначения далее).

Особенности модулей Pro Tracker 2.4 Phantom Family

По структуре модули этого редактора ничем не отличаются от других версий Pro Tracker v2.x, но осуществлена привязка модуля к адресу компиляции, а именно к смещениям PAT, SAMP_A и ORN_A добавлен адрес загрузки модуля в ОЗУ.

Такие модули можно загружать и использовать в Ay_Emul как обычно, и при необходимости – сохранять как обычные PT2 (уже без привязки к адресу).

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

Далее приведена немного отредактированная выдержка из статьи VfNG в газете Echo № 2 (с примечаниями автора Ay_Emul).

---------------------------cut here-------------------

Tерминология:

QUARK: те элементы, из которых состоят SAMPLES, ORNAMENTS.

QUANT: число QUARKS в каждом элементе PATTERN. Фактически – скорость проигрывания.

PATTERN: куплет.

POSITION LIST: порядок проигрывания PATTERNS.

POSITION: позиция в POSITION LIST.

Формат компилированного модуля:

+0
DELAY – число QUARKS, за которое проигрывается 1 QUANT;
+1
MUS_LEN – число позиций в мелодии;
+2
LOOP TO POSITION – номер позиции, в которую будет производиться зацикливание по проигрывании всей мелодии (0–#FF);
+3,64
SAMP_A – смещения от +0 до каждого из 32-х SAMPLE. SAMPLE с номером 0 – не описан. Его номер используется для заглушения канала.
+67,32
ORN_A – аналогично SAMP_A для 16 орнаментов. Орнамент номер 0 – отсутствие орнамента.
+99,2
PAT_OFFSET – смещение от +0 до первого описателя PATTERN'ов PAT.
+101,30
NAME – имя музыки в ASCII.
+131
POSITION LIST – список позиций – номера PATTERN для каждой позиции. Окончание таблицы – #FF.
+?
PAT – описатели PATTERN'ов. Каждый PATTERN состоит из 3-х каналов. В этой таблице – смещения от +0 до описателей каналов каждого PATTERN. Таким образом по 6 байт/PATTERN. Окончание таблицы – #0000.
+?
CHAN – описатели каналов. Канал представлен в виде списка байтов, которые анализируются следующим образом:
LOOP   LD A,(DE)
       INC DE
       ADD A,#20
       JR C,L1
       ADD A,#60
       JR C,L2
       ADD A,#10
       JR C,L3
       ADD A,#10
       JR C,L4
       ADD A,#40
       JR C,L5
       ADD A,#10
       JR C,L6
       INC A
       JR Z,L7
       INC A
       JR Z,L8
       INC A
       JR Z,L9
       INC A
       JR NZ,L10
L11

Отключение команд (прим. Сергея Бульбы: а именно – GLISSADE или PORT) и переход на LOOP.

L10

Извлечь следующий байт – в нем значение прибавления к частоте NOISE. Затем на LOOP.

L9

Извлечь три байта. В 1-м значение PORT, т.е. то число, которое будет прибавляться к текущей частоте ноты. Следует учесть, что значение частоты самой высокой ноты самое маленькое, а самой низкой – самое большое, значит: положит. 128–255, отриц. 0–127. Во 2-м и 3-м байтах (прим. Сергея Бульбы: в Ay_Emul игнорируются, т.к. точно вычислить на стадии компиляции невозможно при чередовании разных паттернов) – разница в значениях частоты новой (той на которой вызван PORT) и предыдущей ноты. Существует ошибка компилятора, который неверно определяет это значение, если новая нота стоит в начале PATTERN (прим. Сергея Бульбы: это не ошибка компилятора, а просчёт в самом формате; если разницу частот вычислять прямо во время проигрывания, то ошибки не возникает). Команду следует выключить, когда сумма прибавлений из +1 превысит значение +2,+3. Переход на LOOP.

L8

Извлечь 1 байт. В нем значение GLISSADE. Знаки – аналогично PORT. Затем переход на LOOP.

L7

Извлечь 1 байт. В нем значение для DELAY (скорость проигрывания). Затем переход на LOOP.

L6

В А – громкость (0–F). Это значение умножается на 16 и прибавляется к началу таблицы TABL1 (прим. Сергея Бульбы: см. в газете или в исходных кодах Ay_Emul). К полученному значению следует относиться как к началу 16-байтовой таблицы, где содержатся значения для регистров амплитуды сопроцессора для каждого значения извлекаемого из SAMPLE. Затем переход на LOOP.

L5

В А – сколько QUANTS не надо проводить анализ канала, т.е. расстояние в QUANTS между очередными изменениями параметров канала. Затем на LOOP.

L4

В А – номер орнамента. Если равен 0, то отсутствие орнамента. Переход на LOOP.

L3

Если А=0 то выход. Если 0<А<F, то установка типа огибающей, затем извлечение 2-х следующих байт с периодом огибающей, переход на LOOP. Если А=F, то отключение огибающих, переход на LOOP.

L2

В А – номер ноты. Всего 8 октав по 12 нот, итого 96 нот. Значения частоты для каждой из нот в таблице TABL2 (по 2 байта/каждая, прим. Сергея Бульбы: см. в газете или в исходных кодах Ay_Emul). Переход на LOOP.

L1

В А – номер SAMPLE. Если=0, то отключение канала, выход. Иначе установка номера SAMPLE и переход на LOOP.

+?
SAMPLES – описатели SAMPLES. Каждый SAMPLE состоит из:
 ++0 Число QUARKS в SAMPLE.
 ++1 Номер QUARK в SAMPLE, на который производится зацикливание по окончании SAMPLE.
 ++2 Описатели QUARKS по 3 байта каждый:
  +++0
   Биты 7–3 – частота NOISE (0–31);
   Бит 2 – знак вибрато (1="-", 0="+");
   Бит 1 – маска TONE;
   Бит 0 – маска NOISE.
  +++1
   Биты 7–4 – амплитуда (0–15);
   Биты 3–0 – старшая часть значения частотного вибрато.
  +++2
   Биты 7–0 – младшая часть значения частотного вибрато.
+?
ORNAMENTS – описатели орнаментов. Они состоят из:
 ++0 – Длина орнамента в QUARKS;
 ++1 – Номер QUARK в орнаменте, на который надо перейти по окончании ORNAMENT;
 ++2 – Отклонения от текущего значения ноты в полутонах. Значения 0–63. Старший бит – знаковый: 0='+', 1='-'.

В описании могут быть отдельные неточности, которые нетрудно обнаружить и скорректировать.

Теперь о том, как вообще происходит проигрывание музыки. Берётся значение DELAY и записывается в спец. переменную. При каждом вызове проигрывателя это значение уменьшается на 1. Если оно больше 2-х, то параметры каналов не меняются. Если 2, то проверяется на конец канал. Если конец, то обрабатывается следующая позиция, устанавливаются новые значения в переменные, указывающие на текущие позиции в каналах. Обрабатывается канал А. Если 1, то обрабатывается канал B. Если 0, то обрабатывается канал C и полученные данные в результате обработки всех трех каналов (номера SAMPLES, ORNAMENTS, etc...) устанавливаются на проигрывание, переменная снова получает значение DELAY (прим. Сергея Бульбы: такой подход к оптимизации по скорости, который потом повторяли и в других проектах, создал проблему для музыкантов – невозможность установить скорость проигрывания меньше 3; в Ay_Emul и плеерах PTxTools данное ограничение снято).

---------------------------cut here-------------------