ファイル                                           

 WAVE ファイル

■ 全般
 ・WAVE ファイルは音楽・音声データを対象とした、マイクロソフトがつくったRIFF(リフとよむ: Resource InterChange File Format)というフォー
  マット形式のファイルです。 WAVE (ウェーブとよむ)ファイルは、windowsの拡張子がwavであることからWAV(ダブリュー・エー・ブイ)ファイル
  と呼ぶひとも多いようです。RIFF形式ファイルとしては、他にAVI、PNGなどがあります。
 ・マイクロソフトはデータのまとまりをチャンク(Chunk: 塊)と呼んでいます。RIFF形式のファイル(チャンク)のChunk IDは文字列”RIFF”です。WAVE
  ファイルはRIFF形式であるので 文字列”WAVE”というRIFF type ID が与えられています。WAVEファイルの中では、さらにフォーマット関係の
  チャンクにはChank ID として文字列”fmt ” 及びデータ関係のチャンクにはChank IDとして”data”があたえられています。 

 ★ WAVEファイル技術情報URL


■ ファイルヘッダー情報( →書込みプログラム例

No オフ
セット
offset
サイズ
[byte]
分類
(通称)
内容 記事
16進表示例(注1)
(先頭アドレス〜 )
備考
1 0x00 4 Chunk ID
(RIFFヘッダ
address:00 01 02 03
16進数  52 49 46 46
address:00 01 02 03
16進数  52 49 46 46
ASCII  R I F F          
・WindowsのRIFFファイル形式のファイルであることを表す文字列
・固定文字列
2 0x04 4 Chunk Data Size
(ファイル
サイズ
address:04 05 06 07
16進数  BA D2 06 00
ファイルサイズ(16進数)=
0x0006D2BA

ファイルサイズ(10進数)=
6*16**4
+13*16**3
+2*16**2
+11*16
+10
= 447,152[byte]

        
・オフセットが0x08以降のファイルサイズ(バイト)
・ファイルサイズ算出に於いて、Windowsの場合リトルエンディアンであることに注意のこと 
3 0x08 4 RIFF Type
WAVEヘッダ)
address:08 09 0A 0B
16進数  57 41 56 45
address:08 09 0A 0B
16進数  57 41 56 45
ASCII  W A V E
RIFF形式のWAVEファイルであることを表す文字列
4 0x0C 4 Chunk ID
(ファーマット
チャンク
 ヘッダ
address:0C 0D 0E 0F
16進数  66 6D 74 20

ASCII  f m t
address:0C 0D 0E 0F
16進数  66 6D 74 20

ASCII  f m t
以下が ”fmt ”(フォーマット)チャンクの定義であることを表す
5 0x10 4 Chunk Data Size
(フォーマット定義
サイズ)
address:10 11 12 13
16進数  10 00 00 00
16バイト フォーマットの定義関連のデータサイズ
リニアPCM ならば 16(10 00 00 00)
6 0x14 2 Compression Code
(フォーマットID)
address:14 15
16進数  01 00
リニアPCMの場合
(圧縮なし)
圧縮のフォーマットID
0x0001 リニアPCM
0x0002 MS ADPCM
0x0005 IBM CSVD
0x0006 A-Law
0x0007 μ-Law
0x0010 OKI ADPCM
0x0011 ADPCM(IMA/DVI)
0x0012 MediaSpace ADPCM
0x0013 Sierra ADPCM
0x0014 ADPCM(G.723)
0x0020 YAMAHA ADPCM
0x001E MPEG1 Layer-3    他
7 0x16 2 Number of channels
(チャンネル数)
address:16 17
16進数  01 00
 モノラルの場合 モノラル の場合 0x0001
ステレオの場合 0x0002
8 0x18 4 Sample rate
(サンプリングレート)
address:18 19 1A 1B
16進数  44 AC 00 00
サンプリングレート=
10*16**3
+12*16**2
+4*16
+4
=44100[Hz]
44.1kHz  → 44 AC 00 00
20.05KHz → 22 56 00 00
9 0x1C 4 Average bytes
per second
(データ転送速度
[byte/sec])
address:1C 1D 1E 1F
16進数  88 58 01 00
44.1kHz 16bit モノラルの場合
データ転送速度=
1*16**4
+5*16**3
+8*16**2
+8*16
+8
=88200[byte/sec]
44.1kHz 16bit ステレオの場合
 →10 B1 02 00、 44100×2×2 =176,400[byte/sec]
44.1KHz 16bit モノラルの場合
 →88 58 01 00、 44100×2×1=88,200[byte/sec]
22.05KHz 16bit モノラルの場合
 →44 AC 00 00、 22050×2×1=44,100[byte/sec]
22.05KHz 8bit モノラルの場合
 →22 56 00 00、 20050×1×1=22050[byte/sec] 
10 0x20 2 Block align
(バイト/サンプル)
address:20 21
16進数  01 00
8bit モノラル サンプルあたりのバイト数
16bit ステレオ
 →04 00、 2×2=4[byte/samle]
16bit モノラル
 →02 00、 2×1=2[byte/sample]
8bit モノラル
 →01 00、 1×1=1[byte/sample]
11 0x22 2 Significant bits
per sample
(量子化ビット数)
address:22 23
16進数  08 00
8ビット
16bit の場合→10 00、 16[bit]
8bit の場合→08 00、  8[bit]
- - 2 Extra format bytes
(拡張部分のサイズ)
- - リニアPCMならば存在しない
- - n Extra format bytes
(拡張部分)
- -  リニアPCMならば存在しない
12 0x24 4 Chunk ID
(data ヘッダ)
address:24 25 26 27
16進数  64 61 74 61
address:00 01 02 03
16進数  64 61 74 61
ASCII  d a t a
RIFF形式WAVEファイルのdataであることを表す文字列 
13
0x28 4 chunk size
(データチャンクの
サイズ[byte])
address:28 29 2A 2B
16進数  1F 9E 02 00
データチャンクのサイズ=
2*16**4
+9*16**3
+14*16**2
+1*16
+15
=171,551[byte]
0x2C以降のサンプル音楽データのサイズ(バイト)
14 0x2C n
sample data
(サンプリング
データサイズ)
address:2C 2D 2E 2F
16進数  7F 7F 7E 7D

address:30 31 32 33
16進数  80 83 86 85


address:34 35 36 37
16進数  81 83 87 82


        ……
        ……
        ……
データのバイト列
・ 音楽サンプルデータ
データサイズ算出に於いて、Windowsの場合リトルエンディアンであることに注意のこと


(注1) : メモリへの配置はwindowsの場合リトルエンディアンで記載されています。
(注2): **はべき乗演算をあらわす

 ★ 実際のWAVEファイル
   実際のWAVEファイルのヘッダ情報をバイナリエディタで表示した例を下記に示します。

  <下記WAVEファイルの諸元>
   ・総ファイルサイズ…… 443020バイト (= 0x0006C28C)
   ・ファーマットID …… リニアPCM
   ・チャンネル数 …… モノラル
   ・サンプリングレート……22050 Hz
   ・データ転送速度 ……22050 バイト/sec
   ・Block align …… 1 バイト/サンプル
   ・量子化ビット数……8ビット
   ・サンプリングデータサイズ……442983バイト ( = 0x0006C267)


<実際のWAVEファイル>







■ サンプリングデータがファイル転送される順番 及び演奏される順番
 サンプリングデータがファイル転送される順番(注) 及び演奏されるデータの順番はwindowsのリトルエンディアンの場合下記のようになります。
 尚、 byte(0xXX)はアドレス0xXXの1バイトデータを表します。
  (注)ファイル転送される順番とメモリに配置されているアドレス順(降順)は同じです。

 <ファイル転送される順番>
                          時間 →
   byte(0x2C)→ byte(0x2D)→byte(0x2E)→byte(0x2F)→byte(0x30)→byte(0x31)→byte(0x32)→byte(0x33)→byte(0x34)→ ……
      (8bit)     (8bit)     (8bit)     (8bit)     (8bit)      (8bit)    (8bit)     (8bit)      (8bit)



 <演奏される順番>
 (1). 8ビットモノラルの場合           時間 →
     byte(0x2C)→ byte(0x2D)→byte(0x2E)→byte(0x2F)→byte(0x30)→byte(0x31)→byte(0x32)→byte(0x33)→byte(0x34)→ ……
       (8bit)     (8bit)     (8bit)     (8bit)     (8bit)      (8bit)    (8bit)     (8bit)      (8bit)


 (2) 8ビットステレオの  
    byte(0x2C)→ byte(0x2D)→byte(0x2E)→byte(0x2F)→byte(0x30)→byte(0x31)→byte(0x32)→byte(0x33)→byte(0x34)→ ……
      L (8bit)    R (8bit)    L (8bit)    R (8bit)    L (8bit)    R (8bit)    L (8bit)     R (8bit)    L (8bit)


 (3). 16ビットモノラルの場合
    (上位:byte(0x2D)+下位: byte(0x2C)) → (上位:byte(0x2F)+下位:byte(0x2E))→(上位:byte(0x31)+下位:byte(0x30))→(上位:byte(0x33)+byte(0x32))→ ……
           (16bit)                        (16bit)                     (16bit)                     (16bit)


 (4). 16ビットステレオの場合
   (上位:byte(0x2D)+下位: byte(0x2C)) → (上位:byte(0x2F)+下位:byte(0x2E))→(上位:byte(0x31)+下位:byte(0x30))→(上位:byte(0x33)+byte(0x32))→ ……
        L  (16bit)                     R (16bit)                   L (16bit)                  R (16bit)




■ WAVEファイル構造体( →使用プログラム例

 拡張部分がない標準的なWAVEファイルを構造体で定義すると以下のようになります。 
 Windowsのような32ビットOSの場合と PIC24のような16ビットの場合では int等のサイズがことなるので一部定義がことなります。

 (1) PCの場合
    (char: 8ビットt  、short int:16ビットt 、int: 32ビット)

  
struct myWaveHeader             //全ヘッダサイズ: 44バイト
{
        char id_RIFF[4];        //Chunk ID RIFFヘッダ // 4バイト
        unsigned int size_File;    //ファイルサイズ(総ファイルサイズ - 8)バイト //4バイト
        char id_WAVE[4];        //Chunk ID WAVE //4バイト
        char id_fmt[4];         //Chunk ID fmt  //4バイト
        unsigned int size_fmt;     //フォーマット関連定義データのサイズ     //4バイト
        unsigned short int code_wavefmt;      //WAVEファイルの圧縮フォーマットコード 但し、リニアPCMは圧縮なし//2バイト
        unsigned short int channel;   //チャンネル数 //2バイト
        unsigned int rate_sample;  //サンプリングレート     //4バイト
        unsigned int rate_tranfer;         //転送速度[byte/sec] //4バイト
        unsigned short int align_block;               //サンプルあたりのバイト数[byte/サンプル]       //2バイト
        unsigned short int bit_sample;        //量子化ビット数[bit]  //2バイト
        char id_data[4];        //Chunk ID data //4バイト
        unsigned int size_data;    //サンプリングデータのサイズ[byte] //4バイト
}
;




 (2) PIC24、dsPIC等16bitマイコンの場合
    (char: 8ビット、 int: 16ビット、 long int: 32ビット)

   

struct myWaveHeader             //全ヘッダサイズ: 44バイト
{
        char id_RIFF[4];        //Chunk ID RIFFヘッダ // 4バイト
        unsigned long int size_File;    //ファイルサイズ(総ファイルサイズ - 8)バイト //4バイト
        char id_WAVE[4];        //Chunk ID WAVE //4バイト
        char id_fmt[4];         //Chunk ID fmt  //4バイト
        unsigned long int size_fmt;     //フォーマット関連定義データのサイズ     //4バイト
        unsigned int code_wavefmt;      //WAVEファイルの圧縮フォーマットコード 但し、リニアPCMは圧縮なし//2バイト
        unsigned int channel;   //チャンネル数 //2バイト
        unsigned long int rate_sample;  //サンプリングレート     //4バイト
        unsigned long int rate_tranfer;         //転送速度[byte/sec] //4バイト
        unsigned int align_block;               //サンプルあたりのバイト数[byte/サンプル]       //2バイト
        unsigned int bit_sample;        //量子化ビット数[bit]  //2バイト
        char id_data[4];        //Chunk ID data //4バイト
        unsigned long int size_data;    //サンプリングデータのサイズ[byte] //4バイト
}
;



■ 信号レベル

  ・ 信号レベルに関する要領は以下です。
    @ 無信号レベル
      WAVファイルの音声データの無信号レベルは、符号付き8ビット または16ビット整数の中央値0です。 したがってハードウェアとしては、
     無信号時の ADコンバータ入力電圧をADコンバータ入力範囲の中央にセットすると最大のダイナミックレンジをとることができます。
    A 最大値、最小値
      最大値、最小値は 量子化ビット数が8ビット、16ビットの場合以下のようになります。
       16ビット  …… 最大値: 32767、最小値: -32768
       8ビット   …… 最大値: 127、 最小値: -128
    B 振幅クリップ
      Aの最小値〜最大値の範囲をはずれる値が入力された場合のクリップがないと過大入力時にノイズになるのでソフトで対応しておく
     必要があります。        
    C ADコンバータが16ビットでない場合は値を16ビットに換算する必要があります。12ビットのADコンバータ出力であれば ADコンバータ
       変換値を 基準0にレベルシフトした後に 16倍(= 2×2×2×2 : 4ビット = 16ビット − 12ビット)してWAVファイルのデータとする
      必要があります。 これをしないと小さな音になってしまいます。
     
    

   



■ テキストファイル
 ■ Windows 狭義(MS-DOS)テキストファイルの定義
   ・テキスト ファイルとは、キャラクタ (文字) と下記の制御コードで構成されたMS-DOSの type コマンドによって表示可能なファイルである。
   ・拡張子は.txt である。  

  ASCIIコード
(16進数表示)
エスケープ文字
(ESC文字)
制御 備考
@ 0x0a \n  LF (Line Feed) 改行  
A 0x0d \r  CR (Carriage Return) 復帰  
B 0x0c \f  FF(Form Feed) 改頁  
C 0x09 \t  HT (Horizontal Tabulation )水平タブ   
D 0x0b \v  VT (Vertical Tabulation) 垂直タブ  
E 0x1a -  EOF(End of File)
 MS-DOSにおけるテキストファイルの終端文字
(注)
 

  (注)
   ★ 終端制御文字 0x1a
    ・ 0x1aは、MS-DOSのテキストファイルの終端に添付されていたが、Winodowsのテキストファイルには添付されていない。
    ・ MS-DOSは、CP/M(8ビットマイコン8080のOS用としてデジタルリサーチ社のキルドールが開発したOS)との互換性を維持するために
      0x1aを末尾に添付していたが、OS(MS-DOS)がファイルの終端検出に使用していたわけではない。
    ・ クラスタチェインにより連結されているFATでは、ファイルの終端クラスタの先頭にあるFATエントリの最終クラスタを意味する数値
      (FAT32に場合は、0x0FFFFFFF)をOSが読み取ることで ファイルの終端が分かる。0x1aは、MS-DOSに於いてもファイルの終端を知る
      ために必要なものではなかった。
    ・ いまだ一部で、(Windowsも含めて)OSがテキストファイルの終端検出として、0x1aを使用していると誤解さている。

    ・ MS-DOSにおいては、0x1aを アプリケーションによってはファイルの終端検出として使用していた。

   ★  Macintosh、UNIX
   ・ 
MS−DOSの改行+復帰(CR/LF) は Macintosh、UNIXではCR(0x0d)のみである。これらOSとのファイルコンバートに際しては
     
注意する必要がある。
    
  
 ■ テキストファイルの定義(広義)
   ・文字など文字コードによって表されるデータだけが含まれるファイルのことであるが、タグ(< >)を利用したHTMLファイルやXML
    ファイルも可視性がよいことからテキストファイルに含められていることがある。拡張子は、html、xml等があり、 txtとは限らない。

   (注)
   ★タグを利用して、文字の大きさや色、フォントの種類を変えたり、メッセージに背景や BGM (音) をつけることができる。(リッチテキスト
     ファイル)
   ★メインフレーム/汎用機はほとんど、固定長レコードファイルである。したがってテキストファイルはすべての行(レコード)を同じ長さに
     するよう、長さが足りない場合には空白文字などが挿入される。
   ★・Macintoshには、テキストファイルvsバイナリーファイルと云う概念はあるが、UNIXにはテキストファイルと云う概念はない。