- Сообщения
- 212
- Счётчик реакций
- 78
- Очки
- 1,140
Так как сейчас делаю свой WEB плеер для воспроизведения трекерной музыка, то решил здесь выкладывать описание форматов, с которыми я уже имел дело. И так начнем....
Описание формата .pt3
PT3 — это скомпилированный музыкальный модуль для ZX Spectrum, созданный в редакторе Pro Tracker 3.x. Файл содержит все необходимые данные для воспроизведения музыки на чипе AY-3-8910.
Таблица заканчивается словом 0x0000
При обнаружении TS плеер загружает дополнительные модули для второго/третьего чипа.
Описание формата .pt3
PT3 — это скомпилированный музыкальный модуль для ZX Spectrum, созданный в редакторе Pro Tracker 3.x. Файл содержит все необходимые данные для воспроизведения музыки на чипе AY-3-8910.
Заголовок модуля (99 байт)
| Смещение | Размер | Название | Описание |
|---|---|---|---|
| +0 | 99 байт | MusicName | Название музыки в кодировке ASCII |
| +99 | 1 байт | TonTableId | Идентификатор таблицы частот (0-3) |
| +100 | 1 байт | Delay | Базовый темп (число кварков на 1 квант) |
| +101 | 1 байт | NumberOfPositions | Количество позиций в мелодии (макс. 255) |
| +102 | 1 байт | LoopPosition | Позиция зацикливания (0-#FF) |
| +103 | 2 байта | PatternsPointer | Смещение от +0 до таблицы паттернов |
| +105 | 64 байта | SamplesPointers[32] | 32 смещения к описаниям сэмплов (LE) |
| +169 | 32 байта | OrnamentsPointers[16] | 16 смещений к описаниям орнаментов (LE) |
| +201 | ... | PositionList | Список позиций (заканчивается маркером #FF) |
Position List
Начинается с offset +201 (или раньше, если имя короче 99 байт). Содержит последовательность номеров паттернов (0-255). Заканчивается байтом 0xFF.
Код:
Positions: 00 01 02 03 04 05 06 07 08 09 0A FF
↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑ маркер конца
Таблица паттернов
Располагается по смещению PatternsPointer. Каждый паттерн описывается 6 байтами (3 канала × 2 байта LE):
Код:
Offset: PatternsPointer + (PatternIndex * 6)
Byte 0-1: смещение данных канала A (LE)
Byte 2-3: смещение данных канала B (LE)
Byte 4-5: смещение данных канала C (LE)
Таблица заканчивается словом 0x0000
Данные каналов (Pattern Data)
Каждый канал представлен потоком байтовых команд. Декодирование:
Assembler Z80:
LOOP LD A,(DE) ; Читаем байт команды
INC DE
ADD A,#20 ; +0x20
JR C,L1 ; Если < 0x20 → SAMPLE (0xE0-0xFF)
ADD A,#60 ; +0x60
JR C,L2 ; Если < 0x60 → NOTE (0x80-0xDF)
ADD A,#10 ; +0x10
JR C,L3 ; Если < 0x10 → ENVELOPE (0x70-0x7F)
ADD A,#10 ; +0x10
JR C,L4 ; Если < 0x10 → ORNAMENT (0x60-0x6F)
ADD A,#40 ; +0x40
JR C,L5 ; Если < 0x40 → SKIP (0x20-0x5F)
ADD A,#10 ; +0x10
JR C,L6 ; Если < 0x10 → VOLUME (0x10-0x1F)
INC A
JR Z,L7 ; 0x0F → DELAY
INC A
JR Z,L8 ; 0x0E → GLISS
INC A
JR Z,L9 ; 0x0D → PORTAMENTO
INC A
JR NZ,L10 ; 0x01-0x0B → ADD TO NOISE
L11 ; 0x00 → Отключение канала
Таблица команд PT3:
| Код команды | Мнемоника | Описание |
|---|---|---|
| 0xF0-0xFF | SET ORNAMENT+SAMPLE | Установить орнамент (op-0xF0) и сэмпл (след. байт/2) |
| 0xD1-0xDF | SET SAMPLE | Установить сэмпл (op-0xD0) |
| 0xD0 | QUIT | Конец данных канала |
| 0xC1-0xCF | SET VOLUME | Установить громкость (op-0xC0) |
| 0xC0 | NOTE OFF | Выключить канал |
| 0xB2-0xBF | SET ENVELOPE | Установить огибающую (op-0xB1) + 2 байта периода |
| 0xB1 | SET SKIP COUNTER | Установить счётчик пропуска (след. байт) |
| 0xB0 | DISABLE ENVELOPE | Отключить огибающую |
| 0x50-0xAF | NOTE ON | Включить ноту (op-0x50 = 0-95) |
| 0x40-0x4F | SET ORNAMENT | Установить орнамент (op-0x40) |
| 0x20-0x3F | SET NOISE OFFSET | Установить смещение шума (op-0x20) |
| 0x11-0x1F | SET ENV+SAMPLE | Огибающая (op-0x10) + период (2 байта) + сэмпл |
| 0x10 | DISABLE ENV+SET SAMPLE | Отключить огибающую, установить сэмпл |
| 0x09 | SET DELAY CHG | Изменить задержку (след. байт) |
| 0x08 | GLISSANDO | Глиссандо (3 байта: задержка, шаг LE) |
| 0x05 | PORTAMENTO | Портоаменто (5 байт: задержка, лимит, шаг) |
| 0x04 | ORNAMENT OFFSET | Смещение в орнаменте (след. байт) |
| 0x03 | SAMPLE OFFSET | Смещение в сэмпле (след. байт) |
| 0x02 | TREMOLO | Тремоло (2 байта: on_time, off_time) |
| 0x01 | ENVELOPE SLIDE | Слайдинг огибающей (3 байта) |
Сэмплы (Samples)
Каждый сэмпл — это не PCM-звук, а описание поведения AY-канала.Структура сэмпла (4 байта на кварк):
Код:
Offset +0: NumberOfQuarks — количество кварков в сэмпле
Offset +1: LoopPoint — точка зацикливания (номер кварка)
Offset +2: Quark[0] (4 байта)
...
Структура кварка (4 байта):
| Байт | Биты | Описание |
|---|---|---|
| +0 | 7-1 | Частота шума (0-31) |
| +0 | 0 | Флаг шума (если 1 — шум выключен) |
| +1 | 7-4 | Амплитуда (0-15) |
| +1 | 3-0 | Старшая часть частотного вибрато |
| +2 | 7-0 | Младшая часть частотного вибрато |
| +3 | 7-0 | Значение тона (сдвиг частоты) |
Орнаменты (Ornaments)
Орнамент — это таблица отклонений от ноты в полутонах.Структура орнамента:
Код:
Offset +0: Length — количество элементов
Offset +1: Loop — точка зацикливания
Offset +2: Values[0] — значения (знаковые байты: 0-63, старший бит = знак)
Таблицы частот
PT3.3x - 3.4r (TonTableId = 0):
Код:
0x0C21,0x0B73,0x0ACE,0x0A33,0x09A0,0x0916,0x0893,0x0818,0x07A4,0x0736,0x06CE,0x066D,
0x0610,0x05B9,0x0567,0x0519,0x04D0,0x048B,0x0449,0x040C,0x03D2,0x039B,0x0367,0x0336,
0x0308,0x02DC,0x02B3,0x028C,0x0268,0x0245,0x0224,0x0206,0x01E9,0x01CD,0x01B3,0x019B,
0x0184,0x016E,0x0159,0x0146,0x0134,0x0122,0x0112,0x0103,0x00F4,0x00E6,0x00D9,0x00CD,
0x00C2,0x00B7,0x00AC,0x00A3,0x009A,0x0091,0x0089,0x0081,0x007A,0x0073,0x006C,0x0066,
0x0061,0x005B,0x0056,0x0051,0x004D,0x0048,0x0044,0x0040,0x003D,0x0039,0x0036,0x0033,
0x0030,0x002D,0x002B,0x0028,0x0026,0x0024,0x0022,0x0020,0x001E,0x001C,0x001B,0x0019,
0x0018,0x0016,0x0015,0x0014,0x0013,0x0012,0x0011,0x0010,0x000F,0x000E,0x000D,0x000C
PT3.4x - 3.5x (TonTableId = 0):
Код:
0x0C22,0x0B73,0x0ACF,0x0A33,0x09A1,0x0917,0x0894,0x0819,0x07A4,0x0737,0x06CF,0x066D,
0x0611,0x05BA,0x0567,0x051A,0x04D0,0x048B,0x044A,0x040C,0x03D2,0x039B,0x0367,0x0337,
0x0308,0x02DD,0x02B4,0x028D,0x0268,0x0246,0x0225,0x0206,0x01E9,0x01CE,0x01B4,0x019B,
0x0184,0x016E,0x015A,0x0146,0x0134,0x0123,0x0112,0x0103,0x00F5,0x00E7,0x00DA,0x00CE,
0x00C2,0x00B7,0x00AD,0x00A3,0x009A,0x0091,0x0089,0x0082,0x007A,0x0073,0x006D,0x0067,
0x0061,0x005C,0x0056,0x0052,0x004D,0x0049,0x0045,0x0041,0x003D,0x003A,0x0036,0x0033,
0x0031,0x002E,0x002B,0x0029,0x0027,0x0024,0x0022,0x0020,0x001F,0x001D,0x001B,0x001A,
0x0018,0x0017,0x0016,0x0014,0x0013,0x0012,0x0011,0x0010,0x000F,0x000E,0x000D,0x000C
Volume Table (PT3.3x - 3.4r)
Код:
const uint8_t PT3VolumeTable_33_34[16][16] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2},
{0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3},
{0,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4},
{0,0,0,1,1,1,2,2,3,3,3,4,4,4,5,5},
{0,0,0,1,1,2,2,3,3,3,4,4,5,5,6,6},
{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7},
{0,0,1,1,2,2,3,3,4,5,5,6,6,7,7,8},
{0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9},
{0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,10},
{0,0,1,2,3,3,4,5,6,6,7,8,9,9,10,11},
{0,0,1,2,3,4,4,5,6,7,8,8,9,11,11,12},
{0,0,1,2,3,4,5,6,7,7,8,9,10,11,12,13},
{0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14},
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
};
Turbo Sound (TS)
PT3 поддерживает 2 чипа AY через Turbo Sound. В конце файла может быть сигнатура:
Код:
"02TS" — 2 чипа (2 модуля последовательно)
"03TS" — 3 чипа (3 модуля)
При обнаружении TS плеер загружает дополнительные модули для второго/третьего чипа.
AY-регистры
Код:
R0-R1: Тон канала A (12 бит, LE)
R2-R3: Тон канала B
R4-R5: Тон канала C
R6: Частота шума (5 бит)
R7: Микшер (биты 0-2: тон вкл/выкл, биты 3-5: шум вкл/выкл)
R8: Громкость канала A (биты 0-4, бит 4=1 — включить огибающую)
R9: Громкость канала B
R10: Громкость канала C
R11-R12: Период огибающей (16 бит, LE)
R13: Форма огибающей (0-15, 255=выключена)
Последний раз редактировалось: