Формат звуковых файлов 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
СмещениеРазмерНазваниеОписаниеЗначение
04Chunk IDID секции"RIFF" (0x52494646)
44Chunk Data SizeРазмер данных секции(размер файла) - 8
84WAVEIDТип RIFF"WAVE" (0x57415645)
12
 
 Секции WAV-файла 

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

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

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

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

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

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

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

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

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

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

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

Структура секции формата
СмещениеРазмерНазваниеОписаниеЗначение
04Chunk IDID секции"fmt " (0x666D7420)
44Chunk Data SizeРазмер данных секции16 + размер дополнительных данных
82Compression CodeКод типа сжатия аудиоданных1 - 65 535
102Number of channelsКоличество каналов1 - 65 535
124Sample rateЧастота дискретизации1 - 0xFFFFFFFF
164Average bytes per secondКоличество байт в секунду1 - 0xFFFFFFFF
202Block alignРазмер блока1 - 65535
222Significant bits per sampleКоличество значащих бит на выборку2 - 65 535
242Extra 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").

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

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

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

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

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

Секция "fact"

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

Структура секции "fact"
СмещениеРазмерНазваниеОписаниеЗначение
04Chunk IDID секции"fact" (0x66616374)
44Chunk 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-файла и может быть выгодно реализован другими способами, включая несколько существующих форматов компрессии.

СмещениеРазмерНазваниеОписаниеЗначение
04Chunk IDID секции"wavl" (0x736C6E74)
44Chunk 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-битных данных и всех данных с большим количеством бит на выборку. Эти требования могут казаться тривиальными, но если их не выполнить, то в аудиосигнале могут появиться нежелательные щелчки и хлопки.

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

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

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

СмещениеРазмерНазваниеОписаниеЗначение
04Chunk IDID секции"cue " (0x63756520)
44Chunk Data SizeРазмер данных секцииЗависит от количества ключевых точе
84Num 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)

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

СмещениеРазмерНазваниеЗначение
04IDУникальный идентификатор
44PositionПозиция порядка воспроизведения
84Data Chunk IDRIFF ID соответствующей секции данных
124Chunk StartБайтовое смещение секции данных
164Block StartБайтовое смещение к выборке первого канала
204Sample 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 ", где-то в другом месте файла. Плейлист состоит из массива сегментов, каждый из которых содержит информацию о том, с какой выборки сегмент должен начать проигрывание, длительность сегмента (в выборках), и сколько раз должен повториться сегмент перед переходом к следующему по списку сегменту.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

СмещениеРазмерНазваниеОписаниеЗначение
04Chunk IDID секции"ltxt" (0x6C747874)
44Chunk Data SizeРазмер данных секциизависит от содержащегося текста
84Cue Point IDID ключевой точки0 - 0xFFFFFFFF
124Sample LengthКоличество выборок0 - 0xFFFFFFFF
164Purpose IDID назначения0 - 0xFFFFFFFF
202CountryСтрана0 - 0xFFFF
222LanguageЯзык0 - 0xFFFF
242DialectДиалект0 - 0xFFFF
262Code 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, но, к счастью, в секции семплера это сделано более гибко, непротиворечиво, и более задокументированным способом.

СмещениеРазмерНазваниеЗначение
04Chunk ID"smpl" (0x736D706C)
44Chunk Data Size36 + (Num Sample Loops * 24) + Sampler Data
84Manufacturer0 - 0xFFFFFFFF
124Product0 - 0xFFFFFFFF
164Sample Period0 - 0xFFFFFFFF
204MIDI Unity Note0 - 127
244MIDI Pitch Fraction0 - 0xFFFFFFFF
284SMPTE Format0, 24, 25, 29, 30
324SMPTE Offset0 - 0xFFFFFFFF
364Num Sample Loops0 - 0xFFFFFFFF
404Sampler Data0 - 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
2424 кадра в секунду
2525 кадров в секунду
2930 кадров в секунду с выпадением кадра (30-ый выпадает)
3030 кадров в секунду
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

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

СмещениеРазмерНазваниеЗначение
04Cue Point ID0 - 0xFFFFFFFF
44Type0 - 0xFFFFFFFF
84Start0 - 0xFFFFFFFF
124End0 - 0xFFFFFFFF
164Fraction0 - 0xFFFFFFFF
204Play Count0 - 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-файле больше одного раза.

СмещениеРазмерНазваниеЗначение
04Chunk ID"ltxt" (0x6C747874)
44Chunk Data Size7
81Unshifted Note0 - 127
91Fine Tune (dB)-50 - +50
101Gain-64 - +64
111Low Note0 - 127
121High Note0 - 127
131Low Velocity1 - 127
141High Velocity1 - 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 файлСтруктура файла

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.