Это оригинальный модуль Pro Tracker v2.x – музыкальный AY редактор для ZX Spectrum, автор Николай Худенцов (Nick).
История началась с Pro Tracker 1.1 (см. описание формата PT1). Формат стал развитием его идей: добавлены глисы, портаменто, управление шумом из трека (а не только из сэмпла), независимое от сэмплов зацикливание орнаментов. И в совокупности с возможностями, унаследованными от PT1, получился мощный инструмент, признанный большинством музыкантом второй половины 90-х.
Формат PT2 хорошо описал VfNG в электронной газете Echo № 2 (приведён в конце; изучите, чтобы понимать некоторые обозначения далее).
По структуре модули этого редактора ничем не отличаются от других версий Pro Tracker v2.x, но осуществлена привязка модуля к адресу компиляции, а именно к смещениям PAT, SAMP_A и ORN_A добавлен адрес загрузки модуля в ОЗУ.
Такие модули можно загружать и использовать в Ay_Emul как обычно, и при необходимости – сохранять как обычные PT2 (уже без привязки к адресу).
Далее приведена немного отредактированная выдержка из статьи VfNG в газете Echo № 2 (с примечаниями автора Ay_Emul).
---------------------------cut here-------------------
QUARK: те элементы, из которых состоят SAMPLES, ORNAMENTS.
QUANT: число QUARKS в каждом элементе PATTERN. Фактически – скорость проигрывания.
PATTERN: куплет.
POSITION LIST: порядок проигрывания PATTERNS.
POSITION: позиция в POSITION LIST.
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.
В описании могут быть отдельные неточности, которые нетрудно обнаружить и скорректировать.
Теперь о том, как вообще происходит проигрывание музыки. Берётся значение DELAY и записывается в спец. переменную. При каждом вызове проигрывателя это значение уменьшается на 1. Если оно больше 2-х, то параметры каналов не меняются. Если 2, то проверяется на конец канал. Если конец, то обрабатывается следующая позиция, устанавливаются новые значения в переменные, указывающие на текущие позиции в каналах. Обрабатывается канал А. Если 1, то обрабатывается канал B. Если 0, то обрабатывается канал C и полученные данные в результате обработки всех трех каналов (номера SAMPLES, ORNAMENTS, etc...) устанавливаются на проигрывание, переменная снова получает значение DELAY (прим. Сергея Бульбы: такой подход к оптимизации по скорости, который потом повторяли и в других проектах, создал проблему для музыкантов – невозможность установить скорость проигрывания меньше 3; в Ay_Emul и плеерах PTxTools данное ограничение снято).
---------------------------cut here-------------------