TwinVQ データフォーマット説明書

(C)Copyright 2000 NTT Cyber Space Laboratories

# TwinVQ データフォーマット説明書

TwinVQ Ver. 2.3

平成12年10月12日

NTT サイバースペース研究所
メディア処理プロジェクト

目次

- １．導入
  - １．１　TwinVQ データの構造
  - １．２　用語の説明
  - １．３　データ型の定義
- ２．ヘッダ部を構成するサブチャンクの詳細
  - ２．１　ヘッダチャンクの概要
  - ２．２　標準チャンクの一覧
  - ２．３　拡張チャンクの一覧
  - ２．４　補助チャンクの一覧
- ３．ヘッダチャンクの扱いの基本方針

## １．導入

### １．１　TwinVQ データの構造

TwinVQ ファイルは図１のように、「ヘッダ部」と「オーディオデータ部」の２つのデータブロックが順に並べられて構成されています（図１）。２つのデータブロックは欠けることなくこの順序で並んでいる必要があります。

図１： TwinVQ データの構造

#### １．１．１　ヘッダ部の構造

ヘッダ部は、「チャンク」と呼ばれるデータ構造で構成されています。図３のように、ヘッダ部自身がチャンクとなっており、ヘッダデータはそのサブチャンクとして記録されています。

ヘッダチャンクの ID は、４文字で構成される通常のチャンクIDと異なり、 "TWIN"+バージョン識別番号（８文字）　の１２文字で構成されています。現在サポートしているバージョンは１種類で、"TWIN97012000" というチャンクIDのみが有効です。

ヘッダデータを構成するサブチャンクは、コーデックの初期化に必要なパラメータが記録されている COMM チャンク以外ヘッダデータの詳細についてはセクション２を参照ください。

ヘッダデータ部は、"TWIN..." で始まるチャンクでもあるので、この説明書の中では、"TWINチャンク" とも呼びます。

図２：ヘッダ部の構成

#### １．１．２　オーディオデータ部

オーディオデータ部は、"DATA" の４文字始まるヘッダの後にTwinVQオーディオデータが続きます。オーディオデータ部にサイズを記録するフィールドはありません。オーディオデータのサイズはヘッダチャンク DSIZ で記述することができます。チャンクの呼び名として、"xxxx" チャンクとかかれていた場合、それは「IDが"xxxx"のチャンク」という意味です。

### １．２　用語の説明

チャンク
  汎用のデータ単位。図３のように、ID、サイズ、データの３つの部分で構成されます。チャンクを使うと様々に異なる型のデータを統一的に扱うことができます。TwinVQ では、ID は４文字からなる文字列で、この文字列によって情報の種類を識別します。サイズは unsigned long 型の整数で、チャンクのデータ部のサイズをバイト数で記録します。データ部にはIDに対応する種類のデータを記録します。
サブチャンク
  チャンクのデータ部分に記録されているチャンク。
文字列チャンク
  文字列のみで構成されているチャンク。TwinVQ の文字列チャンクでは、文字列に終端記号はなく、チャンクサイズにより文字列の長さを定義しています。
TwinVQ セットアップ情報
  TwinVQ コーデックの初期化に必要なパラメータ群、COMM ヘッダチャンクに格納する。サンプルプログラムでは、これらのパラメータの受け渡しに headerInfo 構造体を使っている。
TwinVQ オーディオデータ
  TwinVQ アルゴリズムを使って圧縮したオーディオデータ。
ID3v2
  MP3 ファイルに補助情報をつけるためのタグフォーマット。TwinVQ フォーマットもヘッダチャンクの１つとしてこのタグを取り込むことができる。

図３：チャンク

### １．３　データ型の定義

以下はデータ型の定義です。2バイト以上の整数は、ビッグ・エンディアンで記録します。

型 | バイト数 | 説明
`char` | 1 | 文字型
`char[]` |  | 文字列型、長さは括弧内の整数で与えられる。括弧が空の場合 chunkSize により与えられる。
`byte` | 1 | １バイト符号なし整数型
`byte[]` |  | 任意データ型、データは１バイト単位。長さは括弧内の整数で与えられる。括弧が空の場合 chunkSize により与えられる。
`short` | 2 | 2バイト整数型
`unsigned short` | 2 | 2バイト符号なし整数型
`long` | 4 | 4バイト整数型
`unsigned long` | 4 | 4バイト符号なし整数型
`StringChunk` |  | 文字列チャンク型。以下のフィールドで構成されている。 `char[4] chunkID unsigned long chunkSize byte[chunkSize] data`

## ２．ヘッダ部を構成するサブチャンクの詳細

### ２．１　ヘッダチャンクの概要

ヘッダチャンクは、ヘッダ情報を記録するチャンクです。チャンク ID は４文字の文字列です。

ヘッダチャンクには、「標準チャンク」、「拡張チャンク」、「補助チャンク」という３つのカテゴリがあります。

標準チャンク
  headerInfo 構造体に記録できる最小限のヘッダ情報を記録するカテゴリです。
拡張チャンク
  標準チャンクに加えられた、さらに詳細な情報を記録するカテゴリです。
補助チャンク
  拡張チャンクの一部ですが、文字列チャンクについて、２ヶ国語情報の副情報を記録するカテゴリです。このカテゴリは、拡張チャンク中のSCNDチャンクとして記録されます。補助チャンクにたいして、標準チャンクと(SCND以外の）補助チャンクをまとめて「通常チャンク」とも呼びます。

### ２．２　標準チャンクの一覧

以下の表は、標準チャンクのカテゴリに含まれるチャンクの一覧です。このうち COMM チャンクは必須チャンクです。

なお、表内の "ID3重複" の項は、ID3v2 タグのうち、同様の内容をもつフレームのIDを示しています。

表１：標準チャンクの一覧
チャンクID | 内容 | データフィールド | フィールドの説明 | ID3重複
--- | --- | --- | --- | ---
COMM | コーデックのセットアップパラメータ | long channelMode long bitRate long samplingRate long securityLevel | チャネル数のモード、0:モノラル, 1: ステレオ ビットレート、1kbit/s 単位の整数 サンプリングレート、kHz 単位の切り捨て整数 (44.1 kHz ⇒ 44) 保護レベル、不使用、常に０ |
NAME | 曲名 | char[ ] name | タイトル情報。フリーフォーム。 | TIT2
COMT | コメント | char[ ] comment | コメント情報。フリーフォーム。 | COMM
AUTH | 作者 | char[ ] author | 作者情報。フリーフォーム。 | TPE1/2/3/4
(c) | 著作権情報 | char[ ] copyright | 著作権情報。フリーフォーム。チャンク ID は、(C) の最後にスペースが入る4文字なので注意。 | TCOP
FILE | ファイル名 | char[ ] fileName | TwinVQ ファイル名称。フリーフォーム。 |
DSIZ | DATAチャンクのサイズ(byte) | unsigned long dataSize | オーディオデータのサイズ (byte) | DSIZ

### ２．３　拡張チャンクの一覧

以下の表は、拡張チャンクのカテゴリに含まれるチャンクの一覧です。この中には、補助チャンクを格納しているSCNDチャンクも含まれています。

表２：拡張チャンクの一覧
チャンクID | 内容 | データフィールド | 備考 | ID3重複
--- | --- | --- | --- | ---
ALBM | アルバムタイトル | char[ ] albumTitle |  | TALB
YEAR | 録音された年月 | short year char month | 月または年データを無効にするには 0 を入れる。 | YEAR/TYER

ENCD

エンコードした日付

short year
char month
char day
char hour
char minute
char timeZone

各データフィールドを無効にするには 0 を入れる。

TDAT

TRAC | トラック番号 | short trackNumber |  | TRCK
LYRC | 歌詞 | char[ ] lyrics |  | USLT
GUID | Globally Unique Identifier | byte[16] guid |  | UFID
ISRC | International Standard Record Code | char[] isrc | CDを特定するためのコード | TSRC
WORD | 作詞者 | char[ ] wordsBy |  | TEXT
MUSC | 作曲者 | char[ ] musicBy |  | TCOM
ARNG | 編曲者 | char[ ] arrangedBy |  |
PROD | プロデュース者 | char[ ] producedBy |  |
REMX | リミックス者 | char[ ] remixedBy |  | TPE4
CDCT | 指揮者 | char[ ] conductedBy |  | TPE3
SING | 歌手 | char[ ] singer |  | TPE1
BAND | バンド/オーケストラ/グループ名 | char[ ] band |  | TPE2
PRSN | 演奏者メンバー | char[ ] personnel |  |
LABL | レーベル | char[ ] label |  | TPUB
NOTE | ライナーノーツ | char[ ] linerNotes |  |

SCND

補助情報

while ( StringChunk subChunks[ ])

・言語の違いを吸収。文字列チャンクについて、主情報は通常のチャンクに記入するが、原題、訳詞などの補助情報は、SCNDチャンクのサブチャンクとして記入する。SCNDチャンクを使う場合に、どちらの言語を主情報として選択するかはエンコード側の判断に任せる。
・サブチャンクは文字列チャンクに限る。
・サブチャンクのデータ（文字列）の最初の２文字には、それぞれ通常のチャンクとSCNDチャンクで使われている文字コードを表す文字を格納する。各文字と文字コードの対応は以下の通り：
'0': iso-8859-1
'1': Unicode
'2': S-JIS
'3': JIS
'4': EUC
なお、Unicode では、UTF-16 エンコーディングを使用。先頭にBOMをつけることを推奨するが、無い場合には Big Endian とする。

SCND/NAME⇔TIT3

EXTR | 予約済み、用途は未定義 |  |  |
_ID3 | 予約チャンク：ID3v2 タグ | char[ ] data | TwinVQ チャンクと重複した場合、どちらかを優先させる。 |
_YMH | ヤマハ様予約チャンク |  |  |
_NTT | NTT 予約チャンク |  |  |

### ２．４　補助チャンクの一覧

補助チャンクのカテゴリに含まれるチャンクは、拡張チャンク中の SCND チャンク中にサブチャンクとして格納されています。これらのサブチャンクは、標準・補助チャンク中の文字列チャンクと同じIDを持ちます。以下のチャンクが補助チャンクとして使用可能です：
NAME, COMT, AUTH, (c) , ALBM, LYRC, WORD, MUSC, ARNG, PROD, REMX, CDCT, SING, BAND, PRSN, LABL, NOTE

## ３．ヘッダチャンクの扱いの基本方針

- デコーダは、補助情報チャンクのうち、必要なものだけ読み取る。また、デコーダのサポートしていないチャンクはスキップする。
- 文字列チャンクに複数の情報を格納したい場合、スラッシュ (/) で区切る。
  例： PRSN チャンクで、
  Piano: Ms. P/Bass: Mr. B/Drums: Mr. D
  スラッシュそのものを文字にしたい場合には、\/ とする。
- ヘッダの中に同じIDのチャンクが重複している場合最後に読まれたチャンクを優先する。ただし、通常チャンクと補助チャンク間での ID 重複は重複とみなさない。