Дата последней редакции - 03.05.2007

Терминология.
-------------

Модуль (module) - совокупность паттернов, порядок проигрывания которых
определяется списком позиций. В модуль входят все используемые во время
проигрывания сэмплы и орнаменты, номер таблицы нот, строки с названием песни и
именем автора, заголовок файла и начальная скорость проигрывания.

Список позиций (position list) - список номеров паттернов в порядке
проигрывания. В список позиций входит также номер позиции цикла. Максимальная
длина списка - 256 позиций.

Паттерн (pattern) - совокупность строк с нотами, командами и параметрами.
Строка паттерна имеет регулярную структуру, описанную ниже. Если смотреть по
вертикали, то паттерн - это совокупность треков (дорожек).

Длина паттерна - количество строк в паттерне.

Сэмпл (sample) - ключевая структура Pro Tracker 3. Это совокупность параметров,
полностью определяющих звучание ноты (амплитуду, шум, огибающие и частоту) во
времени.

Орнамент (оrnament) - частный случай сэмпла, определяет только частоту ноты во
времени. В отличие от сэмпла, частота регулируется в полутонах. В большинстве
случаев используется для имитации аккордов.

Тоновая таблица, таблица нот (tone table, note table) - список значений,
записываемых в тоновые регистры микросхемы AY-3-8910/12 (или YM2149F, далее AY)
для каждой ноты. Эта таблица определяет частоту каждой ноты, используемой в Pro
Tracker 3. Всего нот 96 (от C-1 до B-8). Имеется четыре тоновые таблицы (номера
от 0 до 3).

Заголовок файла - строка, идентифицирующая модуль. В данный момент известны два
типа заголовка: 'ProTracker 3.x compilation of ', где x - номер подверсии Pro
Tracker 3, и 'Vortex Tracker II 1.0 module: '. Vortex Tracker II по заголовку
при загрузке может определить, какой способ интерпретации команды 3xxx
использовать для данного модуля.

Позиция цикла (loop position) - позиция списка позиций, к которой осуществляется
переход по достижении конца списка при проигрывании.

Скорость проигрывания (speed, tempo) - количество прерываний на строку паттерна.
На ZX Spectrum прерывания идут с частотой около 50 Гц (для разных моделей
по-разному).

Паттерн.
--------

На рисунке 1 схематически представлена структура одной строки паттерна.

             Рисунок 1 - Структура строки паттерна

          00|....|..|--- .... ....|--- .... ....|--- .... ....

          11 2222 33 444 5555 6666 444 5555 6666 444 5555 6666
                        Канал A       Канал B       Канал C

Точка обозначает цифру ноль (0). Вертикальные линии отделяют колонки треков.

Трек обозначенный '11' используется для простой нумерации строк, этот трек не
редактируется.

Трек '2222' определяет частоту огибающих, записанное здесь шестнадцатеричное
значение записывается в регистры R11R12 AY (только при наличии соответствующей
команды в позиции '5555').

Трек '33' определяет смещение шума (шестнадцатеричное число от 0 до 1F). Это
число прибавляется к соответствующему значению из проигрываемого сэмпла и
записывается в регистр R6 AY.

Остальные три трека идентичны друг другу, они управляют звуком в каждом из трех
каналов A, B и C AY.

Ячейка '444' предназначена для записи ноты. Нота имеет следующую структуру:

  C-1 или C#2
  123     123

1 - латинское название ноты (в данном случае ДО).
2 - может содержать знак диез (#), в противном случае там стоит прочерк (-).
3 - номер октавы. Имеется восемь октав с номерами от 1 до 8. Октава 1 является
контроктавой.

Три прочерка (---) символизируют отсутствие ноты в данной ячейке, в этом случае
ячейка '444' не влияет на звучание в канале.

Ячейка '444' может содержать команду выключения звука в канале (R--).

Ячейки '5555' имеют следующую структуру:

  QF1E

'Q' - номер сэмпла, используется только при наличии ноты или команды выключения
звука в ячейке '444'. Всего имеются 31 сэмпл, нумерация начинается с 1.
Используется система счисления с основанием 32 (0-9,А-V). Нулевое значение (.)
означает отсутствие сэмпла, в этом случае при наличии ноты в ячейке '444' будет
использован номер сэмпла, определенный ранее (в этом или в одном из предыдущих
по position list паттерне). Формат позволяет использовать так называемый
'нулевой сэмпл' (его можно обозначить как W), но пока эта возможность не
использована ни в одном из редакторов.

'F' - эта ячейка предназначена для записи типа огибающей. Если это число от 1 до
E, то это значение записывается в регистр R13 AY, при этом одновременно в R11R12
записывается содержимое трека '2222'. Значение F используется для выключения
огибающих, а 0 означает отсутствие команды в данной ячейке. Для работы команды
наличия ноты в ячейке '444' не обязательно.

'1' - номер орнамента (от 0 до F). Включает новый орнамент. Нулевой орнамент
включается при условии, что в предыдущей ячейке 'F' записано не нулевое значение
(то есть либо тип огибающей, либо отключение огибающей). И, соответсвенно,
орнаменты от 1 до 15 включаются независимо от ячейки огибающих (это новый
стандарт начиная с версии PT 3.69). Для работы команды наличия ноты в ячейке
'444' не обязательно. Обратите внимание, что можно совмещать орнамент с
огибающей, но надо иметь в виду, что орнамент действует лишь на частоту тона.

'E' - громкость звучания в канале. По аналогии, значение от 1 до F определяет
громкость, а 0 - использовать ранее установившуюся громкость. Для работы команды
наличия ноты в ячейке '444' не обязательно.

Ячейки '6666' предназначены для записи специальной команды.

   11.1
   NDPp

'N' - номер команды, в данном случае 1. 0 (.) означает отсутствие команды,
независимо от других значений ячейки '6666'.

'D' - для некоторых команд определяет параметр 'Delay' (период работы команды).

'Pp' - параметр команды (некоторые команды трактуют его как два параметра 'P' и
'p').

Специальные команды.
--------------------

Pro Tracker 3 позволяет использовать одну из специальных команд в каждой строке
трека канала. Тем не менее, формат PT3 позволяет использовать практически любое
число команд на строку, возможно когда-нибудь эта возможность будет
использоваться и в Vortex Tracker II.

Команда номер 1.

Постепенное уменьшение частоты звука в канале. Параметр Delay определяет период
(в прерываниях) изменений частоты, а параметр 'Pp' - величину каждого изменения
в единицах тонового регистра AY.

Команда номер 2.

Постепенное увеличение частоты звука в канале. Работает аналогично команде 1.

Команды 1 и 2 также называют скольжением тона (gliss, glissade, glide, glissando
или slide).

Стандарт PT 3.7 допускает команды 1 и 2 с Delay=0. В этом случае вместо
скольжения происходит однократное изменение частоты тона на величину 'Pp'.

Команда номер 3.

Скольжение от частоты предыдущей ноты к частоте ноты, устанавливаемой в данной
строке. С помощью этой команды можно устраивать плавный переход от одной ноты к
другой. Это основное назначение команды, все остальные её возможности не
документированы (например, если предыдущая нота или отсутствует, или уже
отыграла). Если предыдущая нота находится в другом паттерне, это приводит к
неопределенности при проигрывании стандартным плеером компилированных модулей
от Pro Tracker версий 3.5 и более старых на ZX Spectrum, так как в формате
файла модуля допущена ошибка, которую можно лишь минимизировать. Плееры от
PT 3.6 обрабатывают эту ситуацию с меньшими ошибками, но они не правильно играют
модули более старых версий. В любом случае, при проигрывании непосредственно в
редакторах Pro Tracker 3 любой версии или Vortex Tracker II, во всех плеерах,
встроеных в экспортер Vortex Tracker II, а также в Ay_Emul команда работает
правильно всегда. Параметры команды аналогичны командам 1 и 2.

Эту команду также называют портаменто.

Музыканты ожидают более гибкого поведения команды 3. Здравый смысл подсказывает,
что скольжение должно начинаться не от частоты предыдущей ноты, а от текущей
частоты, которая могла быть сдвинута до этого предыдущими командами 1,2 и 3.
Например, в такой ситуации

          D-5 1F.F ....
          --- .... 11.1
          D-5 .... 31.1

в первой строке устанавливается нота D-5, во второй строке запускается команда
понижения частоты, а в третьей строке опять устанавливается нота D-5;
устанавливая при этом команду 3, музыкант надеется, что частота постепенно
выправится, однако в Pro Tracker 3.5 и более старых этого не происходит. Не
зависимо от наличия или отсутствия там команды 3 эти версии Pro Tracker 3 сразу
же (без всякого постепенного перехода), начинает играть ноту D-5. Pro Tracker
3.6 и выше данную ситуацию обрабатывает правильно, однако он не может правильно
это откомпилировать: такая команда портаменто просто удаляется (маскируется
соответствующая ошибка в стандартном плеере).

По аналогии с ASM, хотелось бы ожидать от команды 3xxx и такого поведения

          D-5 1F.F ....
          --- .... 11.1
          --- .... 31.1

здесь сперва частота ноты D-5 начинает понижаться, а потом команда 31.1
постепенно возвращает частоту обратно к D-5. К сожалению, PT 3.6 до сих пор
игнорирует команду 3 без ноты, поэтому при использовании портаменто без ноты
проигрывайте модуль на ZX Spectrum только специальным ZX плеером, встроенным
в VT II, или в программах, использующих этот плеер.

К сожалению, такое поведение команды нельзя исправить без вмешательства в коды
проигрывателя, а значит даже если исправить эту ошибку в самом редакторе, нужно
ещё и переделать плеер. Автор Pro Tracker 3.6 Alone Coder внес эти исправления
как в редактор, так и (частично) в плеер. В Vortex Tracker II предусмотрено два
способа интерпритации команды 3 - старый (Pro Tracker 3.5) и новый (Vortex
Tracker II). Однако, некоторые старые модули при новой интерпретации команды
3 играются не правильно (музыканты подгоняли звучание под то, что есть,
например, модуль Das Verbaten La Fuego Ver Chuta! by Miguel from Dreadful Band
of CPU), поэтому на ZX Spectrum старые модули нужно играть старыми плеерами,
либо моим универсальным плеером, встроенным в экспортер VT II.

Сразу хочу отметить, что старая интерпретация команды 3 - ошибочна, но это не
баг Pro Tracker 3 (а также Pro Tracker 2), а просто неправильное понимание его
авторов назначения этой команды. Полагаю, те, кто писал музыку в ASC Sound
Master, а потом попробовал Pro Tracker 3, меня поймут.

Команды скольжения типа '1...' немедленно останавливают любое скольжение
частоты, запущенное ранее. Скольжение также останавливается установкой новой
ноты или командой выключения звука. Все команды скольжения автоматически
отменяют действие команды 6, если она была выполнена ранее.

Команда номер 4.

Устанавливает проигрывание сэмпла с позиции, определяемой параметром 'Pp'. При
установке ноты, сэмпл играется с нулевой позиции (с начала). Командой 4 можно
заставить играть сэмпл с любого места. Стоит отметить, что сэмпл не
инициализируется этой командой, т.е. любые накопления будут продолжаться.

Команда номер 5.

То же, что и команда 4, но для орнамента.

Команда номер 6.

Периодическое включение/выключение звука в канале. Параметр 'P' определяет
количество прерываний, в течении которых звук включен (1..F), а параметр 'p' -
количество прерываний, в течении которых звук выключен (1..F). Команда 6
автоматически прекращает скольжение тона, если оно было. Если параметр 'P'
равен нулю, то команда не имеет смысла, хотя может использоваться для выключения
скольжения (команды 1-3). Если параметр 'p' равен 0, то команда просто выключит
звук через 'P' прерываний.

Команда номер 9.

Команда уменьшения частоты огибающих. Параметры аналогичны параметрам команды 1.

Команда номер A.

Команда увеличения частоты огибающих. Параметры аналогичны параметрам команды 2.

Параметр 'Pp' команд 9 и A задается в единицах регистра периода огибающих AY.
Остановить скольжение огибающих можно только установкой в каком-либо из каналов
команды включения огибающих, либо явно указать специальную команду типа "9..."
(с нулевыми параметрами).

Команда номер B.

Устанавливает скорость проигрывания (параметр 'Pp'). В принципе, скорость может
быть любой, но надо иметь в виду, что стандартный спектрумовский проигрыватель
модулей Pro Tracker 3 не может проигрывать быстрее скорости 3 (то есть
рекомендуется использовать значения от 3 до FF). Новые плееры на ZX от Alone
Coder'а (Pro Tracker 3.6 и выше) допускают скорость 2. В самом редакторе Pro
Tracker 3, а также специальном плеере от Alco можно использовать и скорость 1.
В моем универсальном плеере для ZX ограничения по tempo не было изначально.

Сэмпл.
------

Сэмпл определяет звучание ноты во времени. Аналогично паттернам, сэмпл - это
совокупность строк с параметрами. Строки играются на частоте прерываний (около
50 Гц). В PT3 максимальная длина сэмпла равна 64 строкам (тикам). Сэмпл в PT3
всегда зациклен. В Vortex Tracker II нумерация строк сделана в шестнадцатеричном
виде для того, чтобы можно было использовать данные номера как параметры команды
Sample offset (специальная команда 4). Рассмотрим одну строку сэмпла.

             Рисунок 2 - Структура строки сэмпла

            1F|tne +000_ +00(00)_ F_ ***************

            11 234 56667 899 AA B CD EEEEEEEEEEEEEEE

Колонка '11' используется для нумерации строк. Используйте номер в данной
колонке как параметр специальной команды 4 (при необходимости).

Колонка '2' содержит маску тона. 'T' обозначает, что тон в данной строке
разрешен, а 't' - запрещен.

Колонка '3' содержит маску шума. 'N' обозначает, что шум в данной строке
разрешен, а 'n' - запрещен.

Колонка '4' содержит маску огибающих. 'E' обозначает, что огибающие в данной
строке разрешены, а 'e' - запрещены.

Колонка '5' содержит знак отклонения тона от базового значения.

Колонка '666' содержит отклонение тона от базового значения в шестнадцатеричной
записи. Таким образом, диапазон отклонений -FFF..+FFF. Поскольку тоновые
регистры 12-битные, этого диапазона более чем достаточно.

Колонка '7' содержит знак накопления отклонения тона. '^' означает, что
накопление включено, а '_' - выключено.

Поля '56667' вместе образуют единую структуру для управления отклонением тона.
В PT3 базовое значение тона задается установкой ноты в паттерне в одном из
каналов по таблице нот. Если накопление в сэмпле отключено, то базовое значение
сэмплом не меняется, однако в тоновые регистры записывается "базовое значение +
отклонение из поля '5666'". Если накопление включено ('^' в колонке '7'), то
базовое значение меняется на указанную в '5666' величину. Изменение базового
значения напоминает накопление отклонений. В качестве примера, рассмотрим как
вычисляются значения регистров тона для ноты C-4 (по табличке нот #2 частота
этой ноты 1A2). Далее отображаются только колонки '56667' сэмпла.

56667 База Значение Комментарий
           тонового
           регистра
+000_ 1A2  1A2      
+001_ 1A2  1A3      База не изменилась, но частота стала другой
+000_ 1A2  1A2      Вернулись к тому, что было (к частоте ноты C-4)
+002^ 1A4  1A4      Изменили частоту, одновременно изменив базу
+002^ 1A6  1A6
-004_ 1A6  1A2      Частота вернулась обратно, но база по-прежнему смещена
-004^ 1A2  1A2      Вернули базу и частоту в начальное положение

Нетрудно заметить, что используя накопление тона (изменение базы) можно
реализовать скольжение тона (глисс), используя правильное зацикливание.
Например, если зациклить следующую строку:

00|Tne +100^ +00(00)_ F- ***************

получим что-то типа барабана (всего одной строкой сэмпла!).

Колонка '8' содержит знак отклонения частоты шума/огибающих.

Колонка '99' содержит шестнадцатеричное отклонение частоты шума/огибающих от
базового.

Колонка 'AA' содержит абсолютное (беззнаковое) представление числа из колонки
'99'.

Колонка 'B' содержит знак накопления отклонения частоты шума/огибающих
(аналогично тону).

Поля '899 AA B' вместе образуют единую структуру для управления отклонением
частоты шума/огибающих от базового значения. Если включена маска шума 'N', то
регулируется частота шума, в противном случае - огибающих (даже если маска
огибающих отключена). Управление аналогично управлению тоном. Диапазон
отклонений -10..+0F. Для шума данного диапазона достаточно, а для огибающих - не
всегда. В последнем случае можно рекомендовать использовать 2-3 сэмпла в разных
каналах одновременно (все отклонения по огибающим суммируются). При управлении
шумом бывает удобней рассматривать отклонение шума как абсолютное значение. Для
этого в скобках (поля 'AA') приведено эквивалентное 5-битное значение (00..1F).

К сожалению, накопление отклонений частоты огибающей в Pro Tracker 3
производится в байте, то есть максимальное смещение базовой частоты огибающей
сэмплом не может превысить -128..+127. Это означает, что сэмплом невозможно
сделать полноценный аналог специальных команд 9 и A.

Поле 'C' содержит абсолютное значение амплитуды для данной строки сэмпла.

Поле 'D' может содержать знаки увеличения громкости сэмпла на единицу ('+'),
уменьшения громкости на единицу ('-'), либо знак ('_'), который обозначает
"оставить громкость сэмпла на прежнем уровне".

Поля 'E' содержат графическое представление поля 'C' (количество '*' равно
значению поля 'C').

Значение поля 'C' за вычетом текущей громкости сэмпла отправляется в
соответствующий регистр амплитуды AY. Текущая громкость сэмпла является
относительной и изначально равна +0. Командами в колонке 'D' можно увеличить
или уменьшить громкость сэмпла. Громкость -15 в итоге заглушит любую амплитуду
в колонке 'C', а +15 установит максимальную амплитуду независимо от содержимого
колонки 'C'. Если зациклить следующую строку, то через 14 прерываний звук
исчезнет (что-то типа стаккато):

00|Tne +000_ +00(00)_ F- ***************

причем из-за того, что снижение громкости начинается с первой же строки сэмпла,
первая выведенная на AY амплитуда будет 14, а не 15 (будьте внимательны).

Если зациклить следующую строку, будет постепенное нарастание амплитуды. По той
же причине, нарастание начнется не с нуля, а с единицы:

00|Tne +000_ +00(00)_ 0+

Чтобы организовать более плавное затухание, зацикливайте не одну, а несколько
строк. Например:

00|Tne +000_ +00(00)_ F_ ***************
01|Tne +000_ +00(00)_ F_ ***************
02|Tne +000_ +00(00)_ F_ ***************
03|Tne +000_ +00(00)_ F- ***************

будет затухать в четыре раза медленнее первого примера.

В Vortex Tracker II зацикленная часть сэмпла отмечается цветом выделения. Все,
что находится после зацикленной части по идеологии PT3 сэмплом не является,
поэтому использовать в команде 4 смещение, большее чем последний тик сэмпла,
нельзя (хотя явно не запрещается). Будьте внимательны.

Орнамент.
---------

Орнамент является последовательностью целых чисел со знаком, каждое из которых
определяет отклонение частоты ноты от базовой в полутонах. Как и сэмпл, орнамент
проигрывается на частоте прерываний. Орнамент - это единственный способ в
Pro Tracker 3 организовать равномерное (логарифмическое) скольжение, хотя и с
достаточно грубым шагом (полтона). В основном орнаменты используются для
имитации аккордов, хотя основное их назначение соответствует их названию
(музыкальный термин). В ProTracker 3.6x введен стандарт, который вы можете
использовать и в Vortex Tracker II: если нота после применения орнамента меньше
C-1, то она превращается в С-1. То есть, применяя большие отрицательные
отклонения в орнаменте (например, -96), гарантированно получается нота C-1,
что можно использовать в сэмпле, например, высоту звука барабана можно сделать
независимой от ноты. Модуль SNA+.pt3 поможет Вам понять идею.

Также, как и в сэмпле, использовать параметр спецкоманды 5 (Ornament offset)
за пределы тела орнамента нельзя, хотя к сбою и не приводит.

Таблицы нот.
------------

В Pro Tracker 3 имеются четыре тоновые таблицы. Почти все таблички сделаны не
правильно (не соответствует идеальной шкале 1750000 и 1773400). Более менее
правильно сделана табличка 1 (SoundTracker), традиционная для ZX Spectrum - она
подходит для импорта практически всех существующих на ZX музыкальных редакторов.
По сравнению с идеальной шкалой для 1773400 Гц сдвинута почти ровно на один тон
вниз. Кроме того, 24-я нота фальшивит (в редакторе обозначена как B-2, из-за
сдвига в один тон должна звучать как A-2). Но, к сожалению, это единственная
табличка, которая подходит под 1773400 Гц (фирменный Спектрум 128).

Табличка номер 2 практически идеально подходит под частоту AY 1750000 Гц, все
ноты звучат именно так, как они и отображаются в редакторе.

К сожалению, таблицы нот разных версий Pro Tracker 3 достаточно сильно
отличаются (в особенности таблица 2, которая раньше имела полное право
называться ASM or PSC и идеально подходила под частоту 1773400 Гц). Табличка 1 в
этом смысле уникальна - она одинакова во всех версиях Pro Tracker 3.

Таблички 0 и 3 использовать не рекомендуется.

Общие замечания.
----------------

В PT3 применен не очень рациональный способ регулирования громкости: с помощью
большой таблички эксперементальных значений громкостей каждой из 16-ти амплитуд.
Во-первых, музыкальные сопроцессоры на разных компьютерах подключены по-разному,
а потому и звучат по-разному, во-вторых, AY-3-8910/12 и YM2149F также звучат
по-разному, а в-третьих, 16-ти уровней громкости в любом случае недостаточно,
а из этих микросхем больше не выжать. Печально, что в PT3 отсутствует уровень
громкости 0 (команда R-- для этого не всегда подходит), хотя в самом плеере
в табличке громкости зарезервированы 16 байт (получается не используемые) под
нулевую громкость. Кстати, Alone Coder нашел применение этим 16 байтам ;), и я в
своем плеере для ZX тоже их задействовал.

Также, крайне неудобно то, что все вычисления в PT3 происходят в единицах
соответствующих регистров (тона и огибающих), а не в долях тона. В связи с этим,
нельзя организовать равномерное скольжение, равномерное портаменто, обеспечить
одинаковое колебание тона в сэмпле с любой нотой диапазона, сменить табличку нот
без пересчета огибающих и параметров команд скольжения и т.д. По этой же
причине, жаль, что в треке огибающих нельзя писать ноты (в формате PT3 огибающие
задаются одновременно типом и периодом).

Крайне неприятно то, что числа, записанные в треке огибающих не записываются
напрямую в регистры R11R12 AY, если не в одном из каналов нет команды
инициализации (типа) огибающей. Также, неприятно то, что тип огибающей
приходится указывать всегда, когда нужно включить огибающие или изменить их
период, ведь это приводит к переинициализации алгоритма огибающей, а это не
всегда нужно. Есть плееры, которые отслеживают вывод одних и тех же значений
в регистр R13 и исключают переинициализацию вообще, но это другая крайность,
поскольку переинициализация может оказаться нужна музыканту.

Печально, что команда портаменто задается не временем перехода к конечной ноте,
а скоростью, что сказывается при различном чередовании паттернов, в которых
портаменто указано с первой нотой.

Вообще, как это не печально, PT3 производит впечатление крайне сырого продукта,
хотя стараниями сторонних разработчиков (MMCM, AlCo) он и приобрел человеческое
лицо ;) и избавился от многочисленных ошибок. Откровенно скажу, что если бы
не его огромная популярность, Vortex Tracker II был основан не на формате PT3,
а на ASC, PSC или FTC (последнее самое лучшее из перечисленного, по крайней мере
по возможностям формата).

Автор данного текста.
---------------------

Все замечания направлять Сергею Бульбе по адресу vorobey@mail.khstu.ru.

(c)2002-2007 S.V.Bulba
