Microsoft WAVE audio file: GraphViz block diagram (.dot) source

The WAVE file format is a subset of Microsoft's RIFF specification for the storage of multimedia files. A RIFF file starts out with a file header followed by a sequence of data chunks. A WAVE file is often just a RIFF file with a single "WAVE" chunk which consists of two sub-chunks -- a "fmt " chunk specifying the data format and a "data" chunk containing the actual sample data.

This Kaitai implementation was written by John Byrd of Gigantic Software (jbyrd@giganticsoftware.com), and it is likely to contain bugs.

File extension

wav

KS implementation details

This page hosts a formal specification of Microsoft WAVE audio file using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

GraphViz block diagram source

wav.dot

digraph {
	rankdir=LR;
	node [shape=plaintext];
	subgraph cluster__wav {
		label="Wav";
		graph[style=dotted];

		wav__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="riff_id_pos">0</TD><TD PORT="riff_id_size">4</TD><TD>52 49 46 46</TD><TD PORT="riff_id_type">riff_id</TD></TR>
			<TR><TD PORT="file_size_pos">4</TD><TD PORT="file_size_size">4</TD><TD>u4le</TD><TD PORT="file_size_type">file_size</TD></TR>
			<TR><TD PORT="wave_id_pos">8</TD><TD PORT="wave_id_size">4</TD><TD>57 41 56 45</TD><TD PORT="wave_id_type">wave_id</TD></TR>
			<TR><TD PORT="chunks_pos">12</TD><TD PORT="chunks_size">(file_size - 5)</TD><TD>ChunksType</TD><TD PORT="chunks_type">chunks</TD></TR>
		</TABLE>>];
		wav__inst__format_chunk [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
			<TR><TD>format_chunk</TD><TD>chunks.chunk[0].data</TD></TR>
		</TABLE>>];
		subgraph cluster__sample_type {
			label="Wav::SampleType";
			graph[style=dotted];

			sample_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="sample_pos">0</TD><TD PORT="sample_size">2</TD><TD>u2le</TD><TD PORT="sample_type">sample</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__format_chunk_type {
			label="Wav::FormatChunkType";
			graph[style=dotted];

			format_chunk_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="w_format_tag_pos">0</TD><TD PORT="w_format_tag_size">2</TD><TD>u2le?WFormatTagType</TD><TD PORT="w_format_tag_type">w_format_tag</TD></TR>
				<TR><TD PORT="n_channels_pos">2</TD><TD PORT="n_channels_size">2</TD><TD>u2le</TD><TD PORT="n_channels_type">n_channels</TD></TR>
				<TR><TD PORT="n_samples_per_sec_pos">4</TD><TD PORT="n_samples_per_sec_size">4</TD><TD>u4le</TD><TD PORT="n_samples_per_sec_type">n_samples_per_sec</TD></TR>
				<TR><TD PORT="n_avg_bytes_per_sec_pos">8</TD><TD PORT="n_avg_bytes_per_sec_size">4</TD><TD>u4le</TD><TD PORT="n_avg_bytes_per_sec_type">n_avg_bytes_per_sec</TD></TR>
				<TR><TD PORT="n_block_align_pos">12</TD><TD PORT="n_block_align_size">2</TD><TD>u2le</TD><TD PORT="n_block_align_type">n_block_align</TD></TR>
				<TR><TD PORT="w_bits_per_sample_pos">14</TD><TD PORT="w_bits_per_sample_size">2</TD><TD>u2le</TD><TD PORT="w_bits_per_sample_type">w_bits_per_sample</TD></TR>
				<TR><TD PORT="cb_size_pos">16</TD><TD PORT="cb_size_size">2</TD><TD>u2le</TD><TD PORT="cb_size_type">cb_size</TD></TR>
				<TR><TD PORT="w_valid_bits_per_sample_pos">18</TD><TD PORT="w_valid_bits_per_sample_size">2</TD><TD>u2le</TD><TD PORT="w_valid_bits_per_sample_type">w_valid_bits_per_sample</TD></TR>
				<TR><TD PORT="channel_mask_and_subformat_pos">20</TD><TD PORT="channel_mask_and_subformat_size">20</TD><TD>ChannelMaskAndSubformatType</TD><TD PORT="channel_mask_and_subformat_type">channel_mask_and_subformat</TD></TR>
			</TABLE>>];
			format_chunk_type__inst__is_extensible [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>is_extensible</TD><TD>w_format_tag == :w_format_tag_type_extensible</TD></TR>
			</TABLE>>];
			format_chunk_type__inst__is_basic_pcm [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>is_basic_pcm</TD><TD>w_format_tag == :w_format_tag_type_pcm</TD></TR>
			</TABLE>>];
			format_chunk_type__inst__is_basic_float [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>is_basic_float</TD><TD>w_format_tag == :w_format_tag_type_ieee_float</TD></TR>
			</TABLE>>];
			format_chunk_type__inst__is_cb_size_meaningful [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>is_cb_size_meaningful</TD><TD> ((!(is_basic_pcm)) &amp;&amp; (cb_size != 0)) </TD></TR>
			</TABLE>>];
		}
		subgraph cluster__guid_type {
			label="Wav::GuidType";
			graph[style=dotted];

			guid_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="data1_pos">0</TD><TD PORT="data1_size">4</TD><TD>u4le</TD><TD PORT="data1_type">data1</TD></TR>
				<TR><TD PORT="data2_pos">4</TD><TD PORT="data2_size">2</TD><TD>u2le</TD><TD PORT="data2_type">data2</TD></TR>
				<TR><TD PORT="data3_pos">6</TD><TD PORT="data3_size">2</TD><TD>u2le</TD><TD PORT="data3_type">data3</TD></TR>
				<TR><TD PORT="data4_pos">8</TD><TD PORT="data4_size">4</TD><TD>u4be</TD><TD PORT="data4_type">data4</TD></TR>
				<TR><TD PORT="data4a_pos">12</TD><TD PORT="data4a_size">4</TD><TD>u4be</TD><TD PORT="data4a_type">data4a</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__cue_point_type {
			label="Wav::CuePointType";
			graph[style=dotted];

			cue_point_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="dw_name_pos">0</TD><TD PORT="dw_name_size">4</TD><TD>u4le</TD><TD PORT="dw_name_type">dw_name</TD></TR>
				<TR><TD PORT="dw_position_pos">4</TD><TD PORT="dw_position_size">4</TD><TD>u4le</TD><TD PORT="dw_position_type">dw_position</TD></TR>
				<TR><TD PORT="fcc_chunk_pos">8</TD><TD PORT="fcc_chunk_size">4</TD><TD>u4le</TD><TD PORT="fcc_chunk_type">fcc_chunk</TD></TR>
				<TR><TD PORT="dw_chunk_start_pos">12</TD><TD PORT="dw_chunk_start_size">4</TD><TD>u4le</TD><TD PORT="dw_chunk_start_type">dw_chunk_start</TD></TR>
				<TR><TD PORT="dw_block_start_pos">16</TD><TD PORT="dw_block_start_size">4</TD><TD>u4le</TD><TD PORT="dw_block_start_type">dw_block_start</TD></TR>
				<TR><TD PORT="dw_sample_offset_pos">20</TD><TD PORT="dw_sample_offset_size">4</TD><TD>u4le</TD><TD PORT="dw_sample_offset_type">dw_sample_offset</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__data_chunk_type {
			label="Wav::DataChunkType";
			graph[style=dotted];

			data_chunk_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="data_pos">0</TD><TD PORT="data_size">?</TD><TD></TD><TD PORT="data_type">data</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__samples_type {
			label="Wav::SamplesType";
			graph[style=dotted];

			samples_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="samples_pos">0</TD><TD PORT="samples_size">4</TD><TD>u4le</TD><TD PORT="samples_type">samples</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__channel_mask_and_subformat_type {
			label="Wav::ChannelMaskAndSubformatType";
			graph[style=dotted];

			channel_mask_and_subformat_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="dw_channel_mask_pos">0</TD><TD PORT="dw_channel_mask_size">4</TD><TD>ChannelMaskType</TD><TD PORT="dw_channel_mask_type">dw_channel_mask</TD></TR>
				<TR><TD PORT="subformat_pos">4</TD><TD PORT="subformat_size">16</TD><TD>GuidType</TD><TD PORT="subformat_type">subformat</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__chunks_type {
			label="Wav::ChunksType";
			graph[style=dotted];

			chunks_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="chunk_pos">0</TD><TD PORT="chunk_size">...</TD><TD>ChunkType</TD><TD PORT="chunk_type">chunk</TD></TR>
				<TR><TD COLSPAN="4" PORT="chunk__repeat">repeat to end of stream</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__cue_chunk_type {
			label="Wav::CueChunkType";
			graph[style=dotted];

			cue_chunk_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="dw_cue_points_pos">0</TD><TD PORT="dw_cue_points_size">4</TD><TD>u4le</TD><TD PORT="dw_cue_points_type">dw_cue_points</TD></TR>
				<TR><TD PORT="cue_points_pos">4</TD><TD PORT="cue_points_size">24</TD><TD>CuePointType</TD><TD PORT="cue_points_type">cue_points</TD></TR>
				<TR><TD COLSPAN="4" PORT="cue_points__repeat">repeat dw_cue_points times</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__channel_mask_type {
			label="Wav::ChannelMaskType";
			graph[style=dotted];

			channel_mask_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="front_right_of_center_pos">0</TD><TD PORT="front_right_of_center_size">1b</TD><TD>BitsType1</TD><TD PORT="front_right_of_center_type">front_right_of_center</TD></TR>
				<TR><TD PORT="front_left_of_center_pos">0:1</TD><TD PORT="front_left_of_center_size">1b</TD><TD>BitsType1</TD><TD PORT="front_left_of_center_type">front_left_of_center</TD></TR>
				<TR><TD PORT="back_right_pos">0:2</TD><TD PORT="back_right_size">1b</TD><TD>BitsType1</TD><TD PORT="back_right_type">back_right</TD></TR>
				<TR><TD PORT="back_left_pos">0:3</TD><TD PORT="back_left_size">1b</TD><TD>BitsType1</TD><TD PORT="back_left_type">back_left</TD></TR>
				<TR><TD PORT="low_frequency_pos">0:4</TD><TD PORT="low_frequency_size">1b</TD><TD>BitsType1</TD><TD PORT="low_frequency_type">low_frequency</TD></TR>
				<TR><TD PORT="front_center_pos">0:5</TD><TD PORT="front_center_size">1b</TD><TD>BitsType1</TD><TD PORT="front_center_type">front_center</TD></TR>
				<TR><TD PORT="front_right_pos">0:6</TD><TD PORT="front_right_size">1b</TD><TD>BitsType1</TD><TD PORT="front_right_type">front_right</TD></TR>
				<TR><TD PORT="front_left_pos">0:7</TD><TD PORT="front_left_size">1b</TD><TD>BitsType1</TD><TD PORT="front_left_type">front_left</TD></TR>
				<TR><TD PORT="top_center_pos">1</TD><TD PORT="top_center_size">1b</TD><TD>BitsType1</TD><TD PORT="top_center_type">top_center</TD></TR>
				<TR><TD PORT="side_right_pos">1:1</TD><TD PORT="side_right_size">1b</TD><TD>BitsType1</TD><TD PORT="side_right_type">side_right</TD></TR>
				<TR><TD PORT="side_left_pos">1:2</TD><TD PORT="side_left_size">1b</TD><TD>BitsType1</TD><TD PORT="side_left_type">side_left</TD></TR>
				<TR><TD PORT="back_center_pos">1:3</TD><TD PORT="back_center_size">1b</TD><TD>BitsType1</TD><TD PORT="back_center_type">back_center</TD></TR>
				<TR><TD PORT="top_back_left_pos">1:4</TD><TD PORT="top_back_left_size">1b</TD><TD>BitsType1</TD><TD PORT="top_back_left_type">top_back_left</TD></TR>
				<TR><TD PORT="top_front_right_pos">1:5</TD><TD PORT="top_front_right_size">1b</TD><TD>BitsType1</TD><TD PORT="top_front_right_type">top_front_right</TD></TR>
				<TR><TD PORT="top_front_center_pos">1:6</TD><TD PORT="top_front_center_size">1b</TD><TD>BitsType1</TD><TD PORT="top_front_center_type">top_front_center</TD></TR>
				<TR><TD PORT="top_front_left_pos">1:7</TD><TD PORT="top_front_left_size">1b</TD><TD>BitsType1</TD><TD PORT="top_front_left_type">top_front_left</TD></TR>
				<TR><TD PORT="unused1_pos">2</TD><TD PORT="unused1_size">6b</TD><TD>b6</TD><TD PORT="unused1_type">unused1</TD></TR>
				<TR><TD PORT="top_back_right_pos">2:6</TD><TD PORT="top_back_right_size">1b</TD><TD>BitsType1</TD><TD PORT="top_back_right_type">top_back_right</TD></TR>
				<TR><TD PORT="top_back_center_pos">2:7</TD><TD PORT="top_back_center_size">1b</TD><TD>BitsType1</TD><TD PORT="top_back_center_type">top_back_center</TD></TR>
				<TR><TD PORT="unused2_pos">3</TD><TD PORT="unused2_size">1</TD><TD>b8</TD><TD PORT="unused2_type">unused2</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__chunk_type {
			label="Wav::ChunkType";
			graph[style=dotted];

			chunk_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="chunk_id_pos">0</TD><TD PORT="chunk_id_size">4</TD><TD>u4be</TD><TD PORT="chunk_id_type">chunk_id</TD></TR>
				<TR><TD PORT="len_pos">4</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="data_pos">8</TD><TD PORT="data_size">...</TD><TD>switch (chunk_id)</TD><TD PORT="data_type">data</TD></TR>
			</TABLE>>];
chunk_type__seq_data_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
	<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
	<TR><TD>1684108385</TD><TD PORT="case0">DataChunkType</TD></TR>
	<TR><TD>1668637984</TD><TD PORT="case1">CueChunkType</TD></TR>
	<TR><TD>1650817140</TD><TD PORT="case2">BextChunkType</TD></TR>
	<TR><TD>1718449184</TD><TD PORT="case3">FormatChunkType</TD></TR>
</TABLE>>];
		}
		subgraph cluster__bext_chunk_type {
			label="Wav::BextChunkType";
			graph[style=dotted];

			bext_chunk_type__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="description_pos">0</TD><TD PORT="description_size">256</TD><TD>str(ASCII)</TD><TD PORT="description_type">description</TD></TR>
				<TR><TD PORT="originator_pos">256</TD><TD PORT="originator_size">32</TD><TD>str(ASCII)</TD><TD PORT="originator_type">originator</TD></TR>
				<TR><TD PORT="originator_reference_pos">288</TD><TD PORT="originator_reference_size">32</TD><TD>str(ASCII)</TD><TD PORT="originator_reference_type">originator_reference</TD></TR>
				<TR><TD PORT="origination_date_pos">320</TD><TD PORT="origination_date_size">10</TD><TD>str(ASCII)</TD><TD PORT="origination_date_type">origination_date</TD></TR>
				<TR><TD PORT="origination_time_pos">330</TD><TD PORT="origination_time_size">8</TD><TD>str(ASCII)</TD><TD PORT="origination_time_type">origination_time</TD></TR>
				<TR><TD PORT="time_reference_low_pos">338</TD><TD PORT="time_reference_low_size">4</TD><TD>u4le</TD><TD PORT="time_reference_low_type">time_reference_low</TD></TR>
				<TR><TD PORT="time_reference_high_pos">342</TD><TD PORT="time_reference_high_size">4</TD><TD>u4le</TD><TD PORT="time_reference_high_type">time_reference_high</TD></TR>
				<TR><TD PORT="version_pos">346</TD><TD PORT="version_size">2</TD><TD>u2le</TD><TD PORT="version_type">version</TD></TR>
				<TR><TD PORT="umid_pos">348</TD><TD PORT="umid_size">64</TD><TD></TD><TD PORT="umid_type">umid</TD></TR>
				<TR><TD PORT="loudness_value_pos">412</TD><TD PORT="loudness_value_size">2</TD><TD>u2le</TD><TD PORT="loudness_value_type">loudness_value</TD></TR>
				<TR><TD PORT="loudness_range_pos">414</TD><TD PORT="loudness_range_size">2</TD><TD>u2le</TD><TD PORT="loudness_range_type">loudness_range</TD></TR>
				<TR><TD PORT="max_true_peak_level_pos">416</TD><TD PORT="max_true_peak_level_size">2</TD><TD>u2le</TD><TD PORT="max_true_peak_level_type">max_true_peak_level</TD></TR>
				<TR><TD PORT="max_momentary_loudness_pos">418</TD><TD PORT="max_momentary_loudness_size">2</TD><TD>u2le</TD><TD PORT="max_momentary_loudness_type">max_momentary_loudness</TD></TR>
				<TR><TD PORT="max_short_term_loudness_pos">420</TD><TD PORT="max_short_term_loudness_size">2</TD><TD>u2le</TD><TD PORT="max_short_term_loudness_type">max_short_term_loudness</TD></TR>
			</TABLE>>];
		}
	}
	wav__seq:file_size_type -> wav__seq:chunks_size [color="#404040"];
	wav__seq:chunks_type -> chunks_type__seq [style=bold];
	chunk_type__seq:data_type -> wav__inst__format_chunk [color="#404040"];
	format_chunk_type__seq:channel_mask_and_subformat_type -> channel_mask_and_subformat_type__seq [style=bold];
	format_chunk_type__seq:w_format_tag_type -> format_chunk_type__inst__is_extensible [color="#404040"];
	format_chunk_type__seq:w_format_tag_type -> format_chunk_type__inst__is_basic_pcm [color="#404040"];
	format_chunk_type__seq:w_format_tag_type -> format_chunk_type__inst__is_basic_float [color="#404040"];
	format_chunk_type__inst__is_basic_pcm:is_basic_pcm_type -> format_chunk_type__inst__is_cb_size_meaningful [color="#404040"];
	format_chunk_type__seq:cb_size_type -> format_chunk_type__inst__is_cb_size_meaningful [color="#404040"];
	channel_mask_and_subformat_type__seq:dw_channel_mask_type -> channel_mask_type__seq [style=bold];
	channel_mask_and_subformat_type__seq:subformat_type -> guid_type__seq [style=bold];
	chunks_type__seq:chunk_type -> chunk_type__seq [style=bold];
	cue_chunk_type__seq:cue_points_type -> cue_point_type__seq [style=bold];
	cue_chunk_type__seq:dw_cue_points_type -> cue_chunk_type__seq:cue_points__repeat [color="#404040"];
	chunk_type__seq:data_type -> chunk_type__seq_data_switch [style=bold];
	chunk_type__seq_data_switch:case0 -> data_chunk_type__seq [style=bold];
	chunk_type__seq_data_switch:case1 -> cue_chunk_type__seq [style=bold];
	chunk_type__seq_data_switch:case2 -> bext_chunk_type__seq [style=bold];
	chunk_type__seq_data_switch:case3 -> format_chunk_type__seq [style=bold];
	chunk_type__seq:chunk_id_type -> chunk_type__seq:data_type [color="#404040"];
}