Описание музыкальных форматов

  • Автор темы Автор темы admin
  • Дата начала Дата начала

admin

Форумчанин
Администратор
Пользователь
Сообщения
212
Счётчик реакций
78
Очки
1,140
Так как сейчас делаю свой WEB плеер для воспроизведения трекерной музыка, то решил здесь выкладывать описание форматов, с которыми я уже имел дело. И так начнем....

Описание формата .pt3

PT3 — это скомпилированный музыкальный модуль для ZX Spectrum, созданный в редакторе Pro Tracker 3.x. Файл содержит все необходимые данные для воспроизведения музыки на чипе AY-3-8910.

Заголовок модуля (99 байт)​

СмещениеРазмерНазваниеОписание
+099 байтMusicNameНазвание музыки в кодировке ASCII
+991 байтTonTableIdИдентификатор таблицы частот (0-3)
+1001 байтDelayБазовый темп (число кварков на 1 квант)
+1011 байтNumberOfPositionsКоличество позиций в мелодии (макс. 255)
+1021 байтLoopPositionПозиция зацикливания (0-#FF)
+1032 байтаPatternsPointerСмещение от +0 до таблицы паттернов
+10564 байтаSamplesPointers[32]32 смещения к описаниям сэмплов (LE)
+16932 байта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-0xFFSET ORNAMENT+SAMPLEУстановить орнамент (op-0xF0) и сэмпл (след. байт/2)
0xD1-0xDFSET SAMPLEУстановить сэмпл (op-0xD0)
0xD0QUITКонец данных канала
0xC1-0xCFSET VOLUMEУстановить громкость (op-0xC0)
0xC0NOTE OFFВыключить канал
0xB2-0xBFSET ENVELOPEУстановить огибающую (op-0xB1) + 2 байта периода
0xB1SET SKIP COUNTERУстановить счётчик пропуска (след. байт)
0xB0DISABLE ENVELOPEОтключить огибающую
0x50-0xAFNOTE ONВключить ноту (op-0x50 = 0-95)
0x40-0x4FSET ORNAMENTУстановить орнамент (op-0x40)
0x20-0x3FSET NOISE OFFSETУстановить смещение шума (op-0x20)
0x11-0x1FSET ENV+SAMPLEОгибающая (op-0x10) + период (2 байта) + сэмпл
0x10DISABLE ENV+SET SAMPLEОтключить огибающую, установить сэмпл
0x09SET DELAY CHGИзменить задержку (след. байт)
0x08GLISSANDOГлиссандо (3 байта: задержка, шаг LE)
0x05PORTAMENTOПортоаменто (5 байт: задержка, лимит, шаг)
0x04ORNAMENT OFFSETСмещение в орнаменте (след. байт)
0x03SAMPLE OFFSETСмещение в сэмпле (след. байт)
0x02TREMOLOТремоло (2 байта: on_time, off_time)
0x01ENVELOPE SLIDEСлайдинг огибающей (3 байта)

Сэмплы (Samples)​

Каждый сэмпл — это не PCM-звук, а описание поведения AY-канала.

Структура сэмпла (4 байта на кварк):​

Код:
Offset +0: NumberOfQuarks — количество кварков в сэмпле
Offset +1: LoopPoint — точка зацикливания (номер кварка)
Offset +2: Quark[0] (4 байта)
...

Структура кварка (4 байта):​

БайтБитыОписание
+07-1Частота шума (0-31)
+00Флаг шума (если 1 — шум выключен)
+17-4Амплитуда (0-15)
+13-0Старшая часть частотного вибрато
+27-0Младшая часть частотного вибрато
+37-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=выключена)
 
Последний раз редактировалось:
Таблицу частот я использовал последнюю - PT3.4x - 3.5x. По мере разбора форматов и личного опыта работы с ними, я буду выкладывать и остальные. Предлагаю здесь так же делиться описаниями трекерных форматов.
 
Полное техническое описание формата .YM-файла (6 версия формата)

1. Что такое YM-файл?​

Музыкальный файл представляет собой дамп (слепок) значений регистров звукогенератора YM2149, которые формируются оригинальной процедурой воспроизведения на реальной машине (ATARI, AMSTRAD, ZX Spectrum и любых других компьютерах с чипом Yamaha YM2149).

Важное замечание: Форматы YM3, YM4 и YM5 считаются устаревшими. Информацию по ним можно получить только по индивидуальному запросу автору. Вся последующая информация специфична для формата YM6.

2. Базовый принцип хранения данных​

YM6 — это файл, хранящий копию (дамп) регистров звукового чипа. В чип-музыке регистры звука обычно обновляются один раз за кадр. Частота обновления кадров обычно равна 50 Гц (Frame Rate).

Один кадр данных в формате YM6 имеет размер 16 байт (14 байт данных регистров YM-2149 и 2 байта расширенной информации).

Для примера, 6-минутная песня с частотой обновления 50 Гц потребует 288 000 байт (примерно 282 КБ) для хранения всех значений регистров. Это довольно много для формата звукового чипа.

Для решения этой проблемы данные в файле чередуются определённым образом (interleaved), что позволяет эффективно их упаковывать с помощью архиватора LHA. Именно поэтому YM-файлы в интернете обычно имеют размер от 1 до 10 КБ.

3. Упаковка (Packer)​

YM-файл может храниться на диске в двух видах: распакованном или упакованном. Для упаковки необходимо использовать свободно распространяемый архиватор LHA, написанный Харуясу Йошизаки (Haruyazu Yoshizaki). Почти все YM-файлы, доступные в сети, упакованы.
  • Чтобы просмотреть содержимое упакованного YM-файла, используйте команду: lha e music1.ym.
  • Критически важно для совместимости: Плеер ST-Sound поддерживает LZH-файлы только с заголовком уровня 0. При создании YM-файла всегда используйте флаг -h0, например: lha a -h0 music1.ym.

4. Типы данных в YM-файле​

ТипРазмерОписание
BYTE1 байтБеззнаковое 8-битное целое число
WORD2 байтаБеззнаковое 16-битное целое число (Big Endian, Motorola)
LWORD4 байтаБеззнаковое 32-битное целое число (Big Endian, Motorola)
STRING[n]n байтASCII-строка фиксированной длины
NT-StringПеременныйASCII-строка, завершающаяся нулевым символом (Null-terminated string)

5. Полная структура заголовка YM6 (YM6 File Header)​

После распаковки файла, его начало должно соответствовать этой структуре:
СмещениеТипРазмерОписание
0LWORD4 байтаИдентификатор файла. Строка YM6!.
4STRING[8]8 байтПроверочная строка. Всегда LeOnArD!.
12LWORD4 байтаКоличество кадров (Nb of frame). Общее число 16-байтных кадров в файле.
16LWORD4 байтаАтрибуты песни (Song attributes). Битовое поле, определяющее свойства файла (например, признак чересстрочности данных).
20WORD2 байтаКоличество Digi-Drum сэмплов. Может быть 0.
22LWORD4 байтаЧастота мастер-клока YM. Частота основного тактового генератора в герцах.
• 2 000 000 — для ATARI ST
• 1 773 400 — для ZX Spectrum
26WORD2 байтаЧастота кадров оригинального плеера. Традиционно 50 Гц.
28LWORD4 байтаНачальный кадр для зацикливания. Традиционно 0 для зацикливания с самого начала композиции.
32WORD2 байтаРазмер дополнительных данных в байтах. Это поле зарезервировано для будущих расширений. Плеер должен пропускать это количество байт, чтобы корректно обработать данные. Сейчас всегда равно 0.

6. Данные Digi-Drum сэмплов​

Если поле по смещению 20 (количество сэмплов) больше нуля, то сразу после заголовка для каждого сэмпла идёт структура:
Смещение (Offset)Тип (Type)Размер (Size)Описание (Description)
34+LWORD4Размер сэмпла (Sample size): Размер последующих данных сэмпла.
38+BYTESnДанные сэмпла (Sample data): Данные 8-битного сэмпла.

7. Текстовые метаданные​

Сразу после блока сэмплов (или после заголовка, если сэмплов нет) идут три строковых поля, расположенных последовательно друг за другом:
  1. Название песни (Song name) — NT-String.
  2. Имя автора (Author name) — NT-String.
  3. Комментарий к песне (Song comment) — NT-String.

8. Блок данных регистров​

Сразу после трёх NULL-терминированных строк начинается основной блок данных регистров.

Общий размер: 16 * Количество кадров байт.

Структура хранения:
Каждый кадр состоит из 16 байт, условно обозначим их r0, r1, ..., r15. Порядок хранения этих кадров в файле зависит от флага "interleaved" в поле "Атрибуты песни".
  • Нечередующийся формат: Кадры записываются целиком друг за другом.
    [r0_0, r1_0... r15_0], [r0_1, r1_1... r15_1], ...
  • Чередующийся формат (почти всегда используется он): Сначала идут все r0 для всех кадров, затем все r1 для всех кадров и т.д. Этот метод значительно улучшает сжатие.
    [r0_0, r0_1, r0_2...], [r1_0, r1_1, r1_2...], ... [r15_0, r15_1, r15_2...]

9. Маркер конца файла​

Сразу после блока данных регистров, в самом конце файла, должен находиться завершающий идентификатор:

ТипРазмерОписание
LWORD4 байтаМаркер конца. Должен быть строкой End!.

10. Детальное описание одного кадра (16 байт)​

Таблица описывает назначение каждого бита в 16-байтном кадре для классической чип-музыки. Биты перечислены от старшего (b7) к младшему (b0).
РегистрБиты (b7 - b0)Описание
r0x x x x x x x xГрубый период (тон) Голоса A
r1- - - - x x x xТочный период Голоса A
r2x x x x x x x xГрубый период (тон) Голоса B
r3- - - - x x x xТочный период Голоса B
r4x x x x x x x xГрубый период (тон) Голоса C
r5- - - - x x x xТочный период Голоса C
r6- - - x x x x xПериод шума
r7- - x x x x x xУправление микшером
r8- - - x x x x xУправление громкостью A
r9- - - x x x x xУправление громкостью B
r10- - - x x x x xУправление громкостью C
r11x x x x x x x xСтарший байт периода огибающей
r12x x x x x x x xМладший байт периода огибающей
r13- - - - x x x xФорма огибающей
r14Пустой регистрЗарезервирован для расширенных данных (все биты 0)
r15Пустой регистрЗарезервирован для расширенных данных (все биты 0)

Для классических мелодий без спецэффектов: Биты, помеченные "x", заполняются значениями из регистров чипа YM2149. Все остальные биты должны быть установлены в 0.

​

 

11. Расширенные эффекты YM​

Формат YM6 поддерживает специальные трюки с чипом ATARI для создания сложных звуков, называемые "спецэффектами". Всего поддерживается 4 таких эффекта, в каждом кадре можно запустить до двух.

Эти эффекты используют прерывания программируемого таймера ATARI. Таймер ATARI описывается двумя значениями: предделителем и счётчиком.
  • Мастер-частота системы: 2 457 600 Гц.
  • Предделитель (TP): 3-битное значение. Задаёт, на сколько делится мастер-частота.
  • Счётчик (TC): Частота прерывания вычисляется как (2 457 600 / Делитель) / Счётчик.
Например, при TP=1 и TC=28 получается частота прерывания 21 492 Гц: (2 457 600 / 4) / 28.

Таблица кодирования предделителя таймера:

Код TPРеальный делитель
000Таймер остановлен
0014
01010
01116
10050
10164
110100
111200

Список поддерживаемых спецэффектов:

ЭффектОписание
Digi-DrumПроигрывание короткого 4-битного сэмпла на одном из голосов. Традиционно используется для добавления реалистичных ударных в музыку.
SID-VoiceТрюк с низким потреблением ресурсов ЦПУ. Использует прерывания для генерации прямоугольной волны (square tone), которая микшируется с тоном YM2149, создавая звук, напоминающий чип SID от Commodore 64.
Sinus-SIDЭффект, технически близкий к Digi-Drum. Проигрывается короткий 4-битный сэмпл для создания синусоидальной волны.
Sync-BuzzerОдин из самых крутых эффектов. Использует прерывания для записи значений в регистр 13 (форма огибающей) чипа YM2149. Поскольку запись в R13 сбрасывает огибающую и устанавливает новую форму волны, это позволяет создавать уникальные звуковые эффекты.
 
Уточнение по поводу формата PT3 TurboSound. Выше описан так называемый "новый" формат TS.
Protracker v3.7 от Alone Coder'а использовал так называемый "старый" формат. Технически он представляет собой один 6-канальный модуль (два набора позиций и паттернов). Определяется по следующей сигнатуре:
  • байт 13 должен быть больше или равен #37;
  • байт 98 должен равен #30;
AyEmul показывает такие модули как PT3TS (вместо PT3x2).
Примеры таких модулей в приложении.
 

Вложения

  • pt3ts.zip
    pt3ts.zip
    21.6 КБ · Просмотры: 1
Назад
Вверх