Формат звуковых файлов WAV

Добавлено28 февраля 2021 в 01:14

Формат файла WAV - это формат для хранения данных оцифрованных аудиосигналов. Он поддерживает множество битовых разрешений, частот дискретизации и каналов звука. Этот формат очень популярен на платформах IBM PC (клонов) и широко используется в профессиональных программах, обрабатывающих оцифрованные звуковые сигналы. Он учитывает некоторые особенности процессоров Intel, такие как порядок байтов Little Endian.

Данный формат использует Microsoft-скую версию формата IFF (Interchange File Format) от Electronic Arts для хранения данных в виде «секций» (так называемых «чанков», «chunks»).

Форматы данных

WAV-файлы могут содержать строки текста, например метки секций, информационные комментарии и т. д. Строки сохраняются в стиле Pascal. Первый байт – счетчик количества текстовых байтов ASCII, за которым следует указанное количество текстовых байтов. Общее количество байтов в этом типе данных должно быть четным. Для этого в конец текста можно добавить байт-заполнитель. Этот байт заполнения не отражается в счетчике размера.

Структура файла

WAV-файл использует стандартную RIFF-структуру, которая группирует содержимое файла из отдельных секций (chunks) – формат выборок аудиоданных, аудиоданные, и т.п. Каждая секция имеет свой отдельный заголовок и отдельные данные. Заголовок секции указывает на тип секции и количество содержащихся в секции байт. Такой принцип организации позволяет программам анализировать только необходимые секции, пропуская остальные, которые неизвестны, или которые не требуют обработки. Некоторые секции могут иметь в своем составе подсекции (sub-chunks). Например, как можно увидеть на рисунке ниже, описывающем формат простейшего WAV-файла, секции "fmt " и "data" являются подсекциями секции "RIFF".

Рисунок 1 Формат простейшего WAV-файла
Рисунок 1 – Формат простейшего WAV-файла

Еще одна особенность, связанная с секциями файла RIFF, – адреса начала секций должны быть выровнены на размер слова (2 байта). Это означает, что общий размер секции должен быть кратен 2. Если секция содержит нечетное число байт данных, то в конец данных секции добавляется дополнительный нулевой байт данных. Этот дополнительный байт не учитывается в размере секции в заголовке, таким образом, программа всегда должна учитывать выравнивание для расчета смещения начала следующей секции.

Заголовок WAV-файла, секция типа RIFF

Заголовки WAV-файла используют стандартный формат RIFF. Первые 8 байт файла – стандартный заголовок секции RIFF, который содержит ID секции, равный "RIFF", и размер секции, равный размеру файла минус 8 байт, используемых для RIFF-заголовка. Первые 4 байта данных в секции "RIFF" определяют тип ресурса, который содержится в секции. WAV-файлы всегда используют тип ресурса "WAVE". После типа ресурса (ID "WAVE") идут все остальные секции файла, которые определяют аудиосигнал.

Секция типа RIFF
Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "RIFF" (0x52494646)
4 4 Chunk Data Size Размер данных секции (размер файла) - 8
8 4 WAVEID Тип RIFF "WAVE" (0x57415645)
12
 
  Секции WAV-файла  

Секции WAV-файла

Для WAV-файлов, определено довольно много типов секций, но большинство файлов содержат только две из них – секцию формата ("fmt ") и секцию данных ("data"). Это именно те секции, которые необходимы для описания формата выборок аудиоданных, и для хранения самих аудиоданных.

Итак, в простейшем случае в WAV-файле должна быть обязательная секция формата ("fmt "), которая содержит важные параметры, описывающие сигнал, такие как частота дискретизации, и секция данных ("data"), которая содержит непосредственно данные сигнала (рисунок 1). Все остальные секции необязательны.

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

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

На порядок секций в WAV-файле нет никаких ограничений, за исключением того, что секция формата должен предшествовать секции данных. Некоторые жестко написанные программы ожидают, что секция формата будет первым секцией (после заголовка RIFF), хотя они не должны этого делать потому, что спецификация этого не требует.

Все секции формата RIFF и соответственно секции WAVE сохраняются в следующем формате (таблица ниже). Заметьте, что даже вышеупомянутая секция RIFF соответствует этому формату.

Формат секций RIFF и WAVE
Смещение Размер Название Описание
0 4 Chunk ID ID секции
4 4 Chunk Data Size Размер данных секции
8     Байты данных секции

Остальная часть этой статьи посвящена описанию различных типов секций Wave, их формату данных и что эти данные означают.

Секция формата "fmt "

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

Структура секции формата
Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "fmt " (0x666D7420)
4 4 Chunk Data Size Размер данных секции 16 + размер дополнительных данных
8 2 Compression Code Код типа сжатия аудиоданных 1 - 65 535
10 2 Number of channels Количество каналов 1 - 65 535
12 4 Sample rate Частота дискретизации 1 - 0xFFFFFFFF
16 4 Average bytes per second Количество байт в секунду 1 - 0xFFFFFFFF
20 2 Block align Размер блока 1 - 65535
22 2 Significant bits per sample Количество значащих бит на выборку 2 - 65 535
24 2 Extra format bytes Размер дополнительных данных формата 0 - 65 535
26     Дополнительные данные формата  
Идентификатор секции (Chunk ID) и объем данных (Data Size)

Идентификатор секции всегда "fmt " (0x666D7420).

Поле размера данных равно размеру стандартного формата WAV (16 байт) плюс размер всех дополнительных байтов формата, необходимых для поддержки специфических форматов звука, если он не содержит несжатых данных PCM. Обратите внимание, что идентификатор секции "fmt " оканчивается на символ пробела (0x20).

Код формата сжатия (Compression Code)

Первое слово в данных формата указывает на тип сжатия, используемого для данных звука. В таблице приведен список примеров кодов сжатия.

Коды форматов сжатия аудиоданных
Код Описание
0 (0x0000) Неизвестный формат
1 (0x0001) PCM / несжатые данные
2 (0x0002) Microsoft ADPCM
6 (0x0006) ITU G.711 a-law
7 (0x0007) ITU G.711 µ-law
17 (0x0011) IMA ADPCM
20 (0x0016) ITU G.723 ADPCM (Yamaha)
49 (0x0031) GSM 6.10
64 (0x0040) ITU G.721 ADPCM
80 (0x0050) MPEG
65,535 (0xFFFF) Экспериментальный формат
Количество каналов (Number of Channels)

Количество каналов указывает, сколько отдельных аудиосигналов закодировано в секции данных звука. Значение 1 означает монофонический сигнал, 2 означает стерео, и т.п.

Частота дискретизации (Sample Rate)

Число выборок аудиосигнала, приходящихся на секунду.

Количество байт в секунду (Average Bytes Per Second)

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

Количество байт в секунду = Частота дискретизации × Размер блока

Размер блока (Block Align)

Количество байт на одну выборку. Эта величина может быть вычислена по формуле:

Размер блока = Количество значащих бит на выборку / 8 × Количество каналов

Количество значащих бит на выборку (Significant Bits Per Sample)

Значение указывает количество бит, формирующих каждую выборку сигнала. Обычно эта величина 8, 16, 24 или 32. Если число бит не выровнено по байту (не делится на 8 без остатка), количество используемых байт на выборку округляется вверх. Неиспользуемые биты устанавливаются в 0 и игнорируются.

Размер дополнительных данных формата (Extra Format Bytes)

Указывает, сколько далее идет дополнительных данных, описывающих формат. Если код сжатия равен 1 (файл с несжатыми PCM данными), то дополнительных данных о формате нет. Для других типов сжатия дополнительные данные могут присутствовать и иметь любой размер, зависящий от количества необходимых для декодирования данных. Если размер дополнительных данных не выровнен на слово (не делится на 2 без остатка), то в конец данных должен быть добавлен дополнительный байт; но при этом значение в поле размера не меняется.

Секция данных "data"

Секция данных Wave (Wave Data Chunk) содержит данные цифровых выборок аудиосигнала, которые можно декодировать с использованием формата и метода компрессии, указанных в секции формата Wave (Wave Format Chunk). Если код сжатия равен 1 (несжатый PCM), то данные представлены в виде сырых, необработанных (raw) величин выборок. Данная статья описывает, как сохраняются несжатые данные PCM, и не вдается в подробности форматов с компрессией.

WAV-файлы обычно содержат только одну секцию данных, но таких секций может быть несколько, если они содержатся в секции списка Wave (Wave List Chunk "wavl").

Структура секции данных
Смещение Длина Название Описание Значение
0 4 Chunk ID ID секции "data" (0x64617461)
4 4 Chunk Data Size Размер данных секции зависит от количества выборок и формата сжатия
8     Данные выборок  

Аудиовыборки многоканального цифрового звука сохраняются как чередуемые данные, которые просто означают последовательные аудиовыборки нескольких каналов. Выборки каналов сохраняются последовательно друг за другом, перед тем как произойдет переход к следующему времени выборки. Это сделано, чтобы можно было проигрывать файл без необходимости перед этим прочитать этот файл целиком. Значения в таблице ниже были бы сохранены в WAV-файле в порядке, как они перечислены в столбце «Значение» (сверху вниз).

Пример порядка записи выборок при многоканальном звуке
Момент времени Канал Значение
0 1 (левый) 0x0053
2 (правый) 0x0024
1 1 (левый) 0x0057
2 (правый) 0x0029
2 1 (левый) 0x0063
2 (правый) 0x003C

Когда выборки представлены 8 битами, они определены как значения без знака. Все другие битовые размеры указываются как значения со знаком. Например, выборка 16 бит может иметь значение в диапазоне от -32768 до +32767, где средняя точка (тишина, напряжение сигнала равно 0) соответствует значению 0.

Как уже было указано ранее, все секции RIFF (включая секции WAVE "data") должны быть выровнены по размеру на слово (2 байта). Если данные выборок содержатся в нечетном количестве байт, то в конец данных должен быть добавлен выравнивающий нулевой байт. За заголовке секции "data" размер не должен учитывать этот выравнивающий байт.

Секция "fact"

Секция fact содержит информацию о содержимом WAV-файла, зависящую от формата сжатия. Она требуется для всех форматов WAVE со сжатием и, если данные аудиосигнала содержатся внутри секции списка "wavl", но не требуется для несжатого формата PCM WAVE (код формата сжатия - 1), который содержит аудиоданные в секции "data".

Структура секции "fact"
Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "fact" (0x66616374)
4 4 Chunk Data Size Размер данных секции зависит от формата
8   Format Dependant Data Данные, зависящие от формата  
Данные, зависящие от формата (Format Dependant Data)

В настоящий момент задано только одно поле для данных, зависящих от формата. Это единственное 4-байтное значение, которое указывает число выборок в секции данных аудиосигнала. Эта значение может использоваться вместе с количеством выборок в секунду (Samples Per Second value), указанным в секции формата, для вычисления продолжительности звучания сигнала в секундах.

По мере появления новых форматов WAVE секция fact будет расширяться добавлением полей после поля числа выборок. Приложения могут использовать размер секции fact для определения, какие поля представлены в секции.

Секция списка Wave – "wavl"

Секция списка Wave (wave list chunk) используется для указания нескольких чередований секций "slnt" и "data". Эти секции могут помочь уменьшить размер файла путем указания слышимых сегментов выборок, когда поток аудиоданных содержит несколько интервалов тишины.

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

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "wavl" (0x736C6E74)
4 4 Chunk Data Size Размер данных секции зависит от размера секций "data" и "slnt"
8     Список чередования секций "slnt" и "data"  

Секция тишины – "slnt"

Секция тишины (silent chunk) используется для указания сегмента паузы звучания, которая имеет некоторую продолжительность в выборках сигнала. Секция тишины всегда содержится только внутри секции списка Wave (wave list chunk). Когда эта секция объявляет тишину, не нужно задавать нулевую громкость или базовую выборку. Она фактически удерживает последнюю выборку сигнала, считанную из предыдущей секции данных (Wave Data Chunk) секции списка Wave (wave list chunk). Если предыдущих секций данных не было, то необходимо использовать базовое значение выборки, равное 127 для 8-битных данных, 0 для 16-битных данных и всех данных с большим количеством бит на выборку. Эти требования могут казаться тривиальными, но если их не выполнить, то в аудиосигнале могут появиться нежелательные щелчки и хлопки.

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "slnt" (0x736C6E74)
4 4 Chunk Data Size Размер данных секции 4
8 4 Number of Silent Samples Количество выборок тишины 0 - 0xFFFFFFFF
Количество выборок тишины (Number of Silent Samples)
Эта величина указывает число выборок тишины, которое должно появиться в аудиосигнале в этой точке списка wave (wave list chunk).

Секция ключевых точек – "cue "

Секция "cue " определяет одно или более смещения выборок, которые часто используются, чтобы отметить ключевые разделы аудиоданных. Например, у начала и конца куплета в песне могут быть установлены метки, по которым их легче найти. Секция ключевых точек является необязательной, и если она добавлена, то одна секция ключевых точек должна указать все ключевые точки секции "WAVE". Внутри секции "WAVE" не допускается содержание более одной секции "cue ".

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "cue " (0x63756520)
4 4 Chunk Data Size Размер данных секции Зависит от количества ключевых точе
8 4 Num Cue Points Количество ключевых точек в списке  
12   List of Cue Points Список ключевых точек  
Идентификатор секции и объем данных (Chunk ID и Chunk Data Size)
Идентификатор секции для секции ключевых точек всегда "cue " (0x666D7420). Обратите внимание, что строка ID оканчивается на символ пробела (0x20). Размер данных секции равен размеру поля Num Cue Points (4 байта) плюс количество последующих ключевых точек, помноженное на размер данных каждой точки (24 байта). Для вычисления размера данных секции ключевых точек может использоваться следующая формула:
ChunkDataSize = 4 + (NumCuePoints × 24)
Количество ключевых точек (Num Cue Points)
Эта величина указывает количество последующих ключевых точек в этой секции.
Список ключевых точек (List of Cue Points)

Список ключевых точек – это просто набор описаний последовательных точек, который имеет следующий формат.

Смещение Размер Название Значение
0 4 ID Уникальный идентификатор
4 4 Position Позиция порядка воспроизведения
8 4 Data Chunk ID RIFF ID соответствующей секции данных
12 4 Chunk Start Байтовое смещение секции данных
16 4 Block Start Байтовое смещение к выборке первого канала
20 4 Sample Offset Байтовое смещение к байту выборки первого канала
ID
Каждая ключевая (cue) точка имеет уникальный идентификатор, используемый для связи ключевых точек с информацией в других секциях. Например, секция метки (Label chunk) содержит текст, который описывает точку в WAV-файле со ссылкой на связанную с ней ключевую точку.
Позиция (Position)
Определяет смещение выборки, связанное ключевой точкой, с точки зрения позиции выборки в заключительном потоке выборок, сгенерированных списком воспроизведения. Другими словами, если указана секция списка воспроизведения (play list chunk), значение позиции равно номеру выборки, на которой эта ключевая точка встретится при воспроизведении всего списка (play list) в заданном порядке. Если нет секции списка воспроизведения (play list chunk), то значение позиции должно быть равно 0.
ID секции данных (Data Chunk ID)
Указывает ID из 4 байт, используемый секцией, содержащей выборку, которая соответствует этой ключевой точке. В WAV-файле без списка воспроизведения (play list chunk) это значение всегда "data". В WAV-файле, имеющем список воспроизведения (play list chunk) с секциями данных и тишины, это значение может быть либо "data", либо "slnt".
Начало секции (Chunk Start)
Указывает байтовое смещение в секции списка Wave (Wave List Chunk) секции, содержащей выборку, соответствующую этой точке. Это та же самая секция, описанная значением ID секции данных (Data Chunk ID). Если в WAV-файле нет секции списка Wave (Wave List Chunk), это значение равно 0, иначе это значение равно смещению в секции "wavl". Первая секция в секции списка (Wave List Chunk) указывается значением 0.
Начало блока (Block Start)
Указывает смещение в байтах в секции "data" или секции "slnt" для начала блока, содержащего выборку. Начало блока задает первый байт несжатых аудиоданных PCM или последний байт в сжатых данных звука, где для нахождения соответствующего значения выборки может начаться декодирование.
Смещение выборки (Sample Offset)
Указывает смещение в блоке (указанном в Block Start) для выборки, соответствующей ключевой точке. В несжатых аудиоданных PCM это просто байтовое смещение в секции "data". В сжатых данных звука это значение равно количеству выборок (которое может и не быть в байтах) от Block Start до выборки, соответствующей ключевой точке.

Секция списка воспроизведения (плейлиста) – "plst"

Секция плейлиста указывает порядок воспроизведения последовательности ключевых точек (cue points). Эти точки заданы в секции "cue ", где-то в другом месте файла. Плейлист состоит из массива сегментов, каждый из которых содержит информацию о том, с какой выборки сегмент должен начать проигрывание, длительность сегмента (в выборках), и сколько раз должен повториться сегмент перед переходом к следующему по списку сегменту.

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "plst" (0x736C6E74)
4 4 Chunk Data Size Размер данных секции количество сегментов × 12
8 4 Number of Segments Количество секменнтов 1 - 0xFFFFFFFF
12   List of Segments Список секментов  
Количество сегментов (Number of Segments)
Задает количество последующих сегментов в секции плейлиста.
Список сегментов (List of Segments)

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

Смещение Размер Название Описание Значение
0x00 4 Cue Point ID Идентификатор ключевой точки 0 - 0xFFFFFFFF
0x04 4 Length (in samples) Длина (в выборках) 1 - 0xFFFFFFFF
0x08 4 Number of Repeats Количество повторений 1 - 0xFFFFFFFF
ID ключевой точки (Cue Point ID)
Указывает начальную выборку для этого сегмента путем указания значения ключевой точки, заданного в списке ключевых точек. ID связывающий этот сегмент с ключевой точкой, должен быть уникальным по отношению к ID ключевых точек у всех других сегментов.
Длина (Length)
Указывает количество выборок для воспроизведения от начальной выборки, заданной в Cue Point ID.
Количество повторений (Number of Repeats)
Определяет, сколько раз должно повториться воспроизведение сегмента, перед переходом к следующему сегменту.

Секция связанного списка данных – "list"

Секция связанного списка данных (Associated Data List Chunk) используется для задания текстовых меток и имен, которые связаны с ключевыми точками, для предоставления для каждой позиции текстовой метки или имени.

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "list" (0x6C696E74)
4 4 Chunk Data Size Размер данных секции зависит от содержащегося текста
8 4 Type ID Идентификатор типа "adtl" (0x6164746C)
12     Список текстовых меток и имен  
Type ID
Идентификатор типа используется для обозначения типа связанного списка данных и всегда имеет значение "adtl".
Список текстовых меток и имен
Просто список сортированных секций, которые определяют текст различными способами. В файлах WAVE используются три основных типа секций – секция метки (Label Chunk), секция примечания (Note Chunk) и секция помеченного текста (Labeled Text Chunk).

Секция метки – "labl"

Секция метки (Label Chunk) всегда содержится внутри секции связанного списка данных (Associated Data List Chunk). Она используется для связывания текстовой метки с ключевой точкой (Cue Point). Эта информация часто отображается на маркерах или флажках в аудиоредакторах.

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "labl" (0x6C61626C)
4 4 Chunk Data Size Размер данных секции зависит от содержащегося текста
8 4 Cue Point ID ID ключевой точки 0 - 0xFFFFFFFF
12     текст  
Cue Point ID
Указывает точку расположения выборки, соответствующей этой текстовой метке, путем предоставления ID ключевой точки, заданной в списке ключевых точек (Cue Point List). ID, который связывает эту метку с ключевой точкой, должен быть уникальным по отношению к идентификаторам ключевых точек (Cue Point ID) всех других меток.
Текст
Строка символов, оканчивающихся нулем. Если количество символов в строке нечетное, к строке должен быть добавлен один байт заполнения. Добавленное заполнение не учитывается в поле размера секции метки.

Секция примечания или комментария – "note"

Секция примечания (Note Chunk) всегда содержится внутри секции связанного списка данных (Associated Data List Chunk). Она используется для связывания текстового комментария с ключевой точкой. Эта информация сохраняется тем же способом, что и метки в секции метки.

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "note" (0x6E6F7465)
4 4 Chunk Data Size Размер данных секции зависит от содержащегося текста
8 4 Cue Point ID ID ключевой точки 0 - 0xFFFFFFFF
12     текст  
Cue Point ID
Указывает точку расположения выборки, соответствующей этому текстовому примечанию, путем предоставления ID ключевой точки, заданной в списке ключевых точек (Cue Point List). ID, который связывает это примечание с ключевой точкой, должен быть уникальным по отношению идентификаторам ключевых точек всех других примечаний.
Текст
Строка символов, оканчивающихся нулем. Если количество символов в строке нечетное, к строке должен быть добавлен один байт заполнения. Добавленное заполнение не учитывается в поле размера секции примечания (комментария).

Секция помеченного текста – "ltxt"

Секция помеченного текста (Labeled Text Chunk) всегда содержится внутри секции связанного списка данных (Associated Data List Chunk). Она используется для связывания текстовой метки с областью или секцией данных звука. Эта информация часто отображается в помеченных областях звука в аудиоредакторах.

Смещение Размер Название Описание Значение
0 4 Chunk ID ID секции "ltxt" (0x6C747874)
4 4 Chunk Data Size Размер данных секции зависит от содержащегося текста
8 4 Cue Point ID ID ключевой точки 0 - 0xFFFFFFFF
12 4 Sample Length Количество выборок 0 - 0xFFFFFFFF
16 4 Purpose ID ID назначения 0 - 0xFFFFFFFF
20 2 Country Страна 0 - 0xFFFF
22 2 Language Язык 0 - 0xFFFF
24 2 Dialect Диалект 0 - 0xFFFF
26 2 Code Page Кодовая страница 0 - 0xFFFF
28     текст  
Cue Point ID
Указывает начальную выборку, которая соответствует этой текстовой метке, с помощью предоставления ID ключевой точки, заданного в списке ключевых точек (Cue Point List). ID ключевой точки, связанный с этой меткой, должен быть уникальным по отношению к ID ключевых точек остальных меток.
Sample Length
Задает, сколько выборок входит в область или интервал секции, начиная с ключевой точки.
Purpose ID
Указывает, для чего используется текст. Например, значение "scrp" означает текст скрипта, "capt" означает «close caption» (субтитры). Существует большее количество значений Purpose ID, но они предназначены для использования с другими типами файлов формата RIFF и обычно не используются в файлах WAVE.
Country, Language, Dialect, Code Page
Эти поля (страна, язык, диалект, кодовая страница) используются для указания информации о месторасположении и языке, используемых в тексте. Обычно они нужны для запросов о получении информации от операционной системы.
Текст
Строка символов, оканчивающихся нулем. Если количество символов в строке нечетное, к строке должен быть добавлен один байт заполнения. Добавленное заполнение не учитывается в поле размера секции.

Секция семплера – "smpl"

Секция семплера (Sampler Chunk) задает основные параметры инструмента, как например семплер MIDI, который должен использоваться для воспроизведения данных звука. Наиболее важно, что она включает в себя информацию о зацикливаниях звука во время воспроизведения. Конечно, вы можете решить, что это является дублированием информации, которую можно найти в секциях ключевых точек и списка воспроизведения формата WAVE, но, к счастью, в секции семплера это сделано более гибко, непротиворечиво, и более задокументированным способом.

Смещение Размер Название Значение
0 4 Chunk ID "smpl" (0x736D706C)
4 4 Chunk Data Size 36 + (Num Sample Loops * 24) + Sampler Data
8 4 Manufacturer 0 - 0xFFFFFFFF
12 4 Product 0 - 0xFFFFFFFF
16 4 Sample Period 0 - 0xFFFFFFFF
20 4 MIDI Unity Note 0 - 127
24 4 MIDI Pitch Fraction 0 - 0xFFFFFFFF
28 4 SMPTE Format 0, 24, 25, 29, 30
32 4 SMPTE Offset 0 - 0xFFFFFFFF
36 4 Num Sample Loops 0 - 0xFFFFFFFF
40 4 Sampler Data 0 - 0xFFFFFFFF
44
List of Sample Loops
Manufacturer

Поле производителя указывает код MIDI Manufacturer's Association (MMA) для семплера предназначенного для приема звука этого файла. Каждый производитель продуктов MIDI имеет свой уникальный ID, который идентифицирует компанию. Если не указан конкретный производитель, то должно быть уставлено значение 0.

В значении имеется некоторая дополнительная информация, которую можно использовать для трансляции в значение, используемое в передаче на семплер формата MIDI System Exclusive. Старший байт показывает количество младших байт (1 или 3), которые значимы для кода производителя. Например, значение для Digidesign будет 0x01000013 (0x13), и значение для Microsoft будет 0x03000041 (0x00, 0x00, 0x41).

Product
Поле продукта указывает ID модели MIDI, заданный производителем. Для получения идентификаторов продукта связывайтесь с производителем семплера. Если не указан конкретный продукт производителя, то должно быть уставлено значение 0.
Sample Period
Период выборки указывает длительность времени воспроизведения одной выборки в наносекундах (обычно равно 1 / количество выборок в секунду, где количество выборок в секунду равно величине, указанной в секции формата).
MIDI Unity Note
Величина, имеющая то же самое значение, как и MIDI Unshifted Note секции инструмента (instrument chunk). Поле MIDI Unshifted Note указывает музыкальную ноту, на которой выборка будет воспроизведена с её исходной частотой дискретизации (частота дискретизации указана в секции формата).
MIDI Pitch Fraction
Указывает доли полутона вверх от величины, указанной в поле MIDI Unity Note. Значение 0x80000000 означает 1/2 полутона (50 cents), и значение 0x00000000 означает неточную настройку между полутонами.
SMPTE Format

Указывает формат времени Society of Motion Pictures and Television E, используемый в следующем поле SMPTE Offset. Если установлено значение 0, SMPTE Offset также должно быть равно 0.

Значение SMPTE Format
0 нет смещения SMPTE offset
24 24 кадра в секунду
25 25 кадров в секунду
29 30 кадров в секунду с выпадением кадра (30-ый выпадает)
30 30 кадров в секунду
SMPTE Offset
Величина, указывающая на смещение времени, используемое для синхронизации/калибровки первой выборки звука. Используется формат 0xhhmmssff, где hh – число со знаком, указывающее количество часов (-23 .. 23), mm – беззнаковая величина количества минут (0 .. 59), ss – беззнаковая величина количества секунд (0 .. 59), и ff – беззнаковая величина количества кадров (0 .. -1).
Sample Loops
Поле циклов выборок указывает количество определений зацикливания выборок в последующем списке (см. List of Sample Loops). Это значение может быть установлено в 0, что означает отсутствие последующих зацикливаний.
Sampler Data
Указывает количество байт, которые последуют за этой секцией (включая весь список List of Sample Loops). Это значение больше нуля, когда приложение нуждается в сохранении дополнительной информации. Эта величина влияет на значение поля размера секции.
List of Sample Loops

Список зацикливаний – простой набор последовательных описаний циклов, которые следуют нижеописанному формату. Зацикливания не имеют какого-либо определенного порядка, поскольку каждый цикл выборок связан с ключевой точкой, позиция которой используется для определения порядка воспроизведения. Секция семплера не является обязательной.

Смещение Размер Название Значение
0 4 Cue Point ID 0 - 0xFFFFFFFF
4 4 Type 0 - 0xFFFFFFFF
8 4 Start 0 - 0xFFFFFFFF
12 4 End 0 - 0xFFFFFFFF
16 4 Fraction 0 - 0xFFFFFFFF
20 4 Play Count 0 - 0xFFFFFFFF
Cue Point ID
Идентификатор ключевой точки указывает уникальный ID, который соответствует одной из заданных в списке ключевых точек. Кроме того, этот ID соответствует любой из меток, заданных в связанной секции данных, которая позволяет назначать текстовые метки различным циклам выборок.
Type

Поле типа задает, каким образом зацикливаются выборки звука.

Значение Loop Type (тип зацикливания)
0 Цикл вперед (обычный)
1 Альтернативный цикл (впере↔назад, известный также как Ping Pong)
2 Цикл назад (обратный)
3 - 31 Зарезервировано для будущих стандартных типов
32 - 0xFFFFFFFF Специфические типы, относящиеся к семплеру (задаются производителем)
Start
Значение старта указывает байтовое смещение на аудиоданные первой выборки, проигрываемой в цикле.
End
Значение окончания указывает байтовое смещение на аудиоданные последней выборки, проигрываемой в цикле.
Fraction
Дробное значение указывает дробную часть выборки, которая принадлежит циклу. Это позволяет точно настроить длительность цикла с точностью выше, чем позволяет одна выборка. Величина может находиться в диапазоне 0x00000000 .. 0xFFFFFFFF. Значение 0 означает отсутствие дробной части, значение 0x80000000 означает 1/2 от длительности выборки. Значение 0xFFFFFFFF соответствует минимальной дробной части выборки, которую можно задать.
Play Count
Значение счетчика воспроизведений определяет количество проигрываний цикла. 0 означает бесконечный цикл, который не прервется, пока не произойдет принудительное внешнее вмешательство (например, музыкант отпустит клавишу). Все другие значения указывают абсолютное количество проигрываний цикла.

Секция инструмента – "inst"

Секция инструмента (instrument chunk) используется для описания, каким образом звук должен быть проигран как звук инструмента. Эта информация полезна для обмена музыкальной информацией между музыкальными редакторами-семплерами, основанными на выборках (семплах), трекерами или программными таблицами звука. Эта секция является необязательной, и не может встречаться в WAVE-файле больше одного раза.

Смещение Размер Название Значение
0 4 Chunk ID "ltxt" (0x6C747874)
4 4 Chunk Data Size 7
8 1 Unshifted Note 0 - 127
9 1 Fine Tune (dB) -50 - +50
10 1 Gain -64 - +64
11 1 Low Note 0 - 127
12 1 High Note 0 - 127
13 1 Low Velocity 1 - 127
14 1 High Velocity 1 - 127
Unshifted Note
Поле несмещенной ноты имеет то же самое предназначение, что и у MIDI Unity Note секции семплера – указывает музыкальную ноту, на которой выборка будет проиграна с её оригинальной скоростью (частотой дискретизации, указанной в секции формата).
Fine Tune
Значение точной настройки указывает, насколько подача выборки должна быть изменена, когда звук воспроизведен в центах (1/100 полутона). Отрицательное значение означает, что высота тона должна быть снижена, а положительное значение означает, что высота тона должна быть повышена.
Gain
Значение усиления указывает количество децибел для настройки выходного сигнала при проигрывании. Значение 0 дБ означает отсутствие изменений, 6 дБ означает удвоение амплитуды каждой выборки, -6 дБ означает уменьшение амплитуды каждой выборки вдвое. Каждые дополнительные +/- 6 дБ удваивают или делят амплитуду надвое соответственно.
Low Note и High Note
Поля нот указывают диапазон нот MIDI, в которых звук должен быть проигран, когда происходит событие приема ноты MIDI (от программного обеспечения или команды контроллера MIDI. Контроллером может выступать, например, клавиатура MIDI). Этот диапазон необязательно должен включать значение Unshifted Note.
Low Velocity и High Velocity
Поля скорости указывают диапазон скоростей MIDI (MIDI velocity), с которыми должен проигрываться звук. 1 относится к самому медленному проигрыванию, 127 к самому быстрому.

Изменения формата

Обратная сторона популярности формата файла WAVE – из сотен программ, которые поддерживают этот формат, многие злоупотребляют или неправильно используют формат из-за плохой разработки программного обеспечения и/или плохой документации. Как только некоторые из этих "непослушных" программ становятся довольно популярными и производят в большом количестве миллионы неправильных WAVE файлов, остальная часть отрасли программного обеспечения вынуждена иметь дело с этим и создавать код, который может распознавать эти неправильные файлы. Новый код не должен записывать эти ошибки, но должен читать ошибочный WAV-файл. Ниже описано несколько таких исключений, которые были сделаны в дополнение к строгому/исходному формату WAVE.

  • Некорректная величина выравнивания блоков (Block Alignment) – с этим можно иметь дело, вычисляя Block Alignment по указанной ранее формуле.
  • Некорректная величина среднего количества выборок в секунду (Average Samples Per Second) – с этим можно иметь дело, вычисляя Average Samples Per Second по указанной ранее формуле.
  • Отсутствие пустых байтов для выравнивания на слово (Missing word alignment padding) – с этим трудно бороться, но можно давать пользователю предупреждение, если имеется нераспознанный ID секции, и смещение чтения на один байт дает возможность распознать ID секции. Это не полное решение, но оно обычно работает, даже если у программы нет полного списка легальных ID.

Дополнительная информация

  1. Wav file format
  2. Audio File Format Specifications
  3. WAVE PCM soundfile format

Теги

WAVWAV файлСтруктура файла