Mercurial > otakunoraifu
diff music2/nwatowav.cc @ 65:4416cfac86ae
Convert EUC-JP files to UTF8
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Fri, 26 Nov 2010 10:53:15 +0100 |
parents | 15a18fbe6f21 |
children |
line wrap: on
line diff
--- a/music2/nwatowav.cc +++ b/music2/nwatowav.cc @@ -1,24 +1,24 @@ -/* nwatowav : Visual Arts 系のゲームのデモで使われる nwa 形式の -** ファイルを wav 形式に変換する +/* nwatowav : Visual Arts 膤祉蚊若≪т戎 nwa 綵√ +** <ゃ wav 綵√紊 ** ** compile : gcc -O2 -o nwatowav nwatowav.cc ** usage : nwatowav [nwa-file [outfile]] ** nwatowav [nwk-file [outfile]] -** example : nwatowav HM06.nwa HM06.wav # BGMファイル。HM06.wav に展開される -** nwatowav z2813.nwk z2813 # 音声ファイル。 z2813-100.wav などのファイル名で展開される -** nwatowav z0513.ovk z0513 # 音声ファイル。 z0513-100.ogg などのファイル名で展開される +** example : nwatowav HM06.nwa HM06.wav # BGM<ゃHM06.wav 絮 +** nwatowav z2813.nwk z2813 # 喝0<ゃ z2813-100.wav <ゃу +** nwatowav z0513.ovk z0513 # 喝0<ゃ z0513-100.ogg <ゃу ** ** -** 2004.5.19 小松さん<s1100089@u-aizu.ac.jp> から CLANNAD の無圧縮nwa形式に対応する -** パッチをいただいたので、適用しました。ありがとうございます。 -** 2006.9.10 「智代アフター」の音声ファイル形式 (complevel = 5) をサポート -** .nwk という拡張子を持つファイルを受け取ると音声ファイルとして -** 解釈、分割して展開するようにする -** 2007.7.28 「リトルバスターズ!」の音声ファイル形式 (*.ovk; ogg 連結型) -** をサポート。.ovk という拡張子をもつファイルを受け取ると -** 音声ファイルとして解釈、分割して展開するようにする -** 「リトルバスターズ!」のBGMファイルに多量のノイズが乗る問題も -** 解決(ランレングス圧縮の処理が不必要だった) +** 2004.5.19 絨障<s1100089@u-aizu.ac.jp> CLANNAD ≦х軒nwa綵√絲上 +** с障障 +** 2006.9.10 坂撮≪帥若喝0<ゃ綵√ (complevel = 5) 泣若 +** .nwk ≦宍絖ゃ<ゃ喝0<ゃ +** 茹i蚊絮 +** 2007.7.28 鴻帥若削喝0<ゃ綵√ (*.ovk; ogg g) +** 泣若.ovk ≦宍絖ゃ<ゃ +** 喝0<ゃ茹i蚊絮 +** 鴻帥若削BGM<ゃ紊ゃ冴箙馹 +** 茹f浦鐚潟潟違劫х軒筝綽荀c鐚 */ /* @@ -28,14 +28,14 @@ * Redistribution and use in source and binary forms, with or without * modification, are permitted. * - * このプログラムの作者は jagarl です。 + * 違篏 jagarl с * - * このプログラム、及びコンパイルによって生成したバイナリは - * プログラムを変更する、しないにかかわらず再配布可能です。 - * その際、上記 Copyright 表示を保持するなどの条件は課しま - * せん。対応が面倒なのでバグ報告を除き、メールで連絡をする - * などの必要もありません。ソースの一部を流用することを含め、 - * ご自由にお使いください。 + * 違潟潟潟ゃcゃ + * 違紊眼絽純с + * 筝荐 Copyright 茵腓冴篆>散茯蚊 + * 絲上√с医怨ゃ<若чg機 + * 綽荀障純若鴻筝羌 + * 宴篏帥 * * THIS SOFTWARE IS PROVIDED BY KAZUNORI 'jagarl' UENO ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -54,9 +54,9 @@ /******************************************** ** -** nwa フォーマットについて +** nwa 若ゃ ** -** 全体としては以下の構造を持つ +** 篏篁ヤ罕 ** NWA Header ** data offset index ** data block<0> @@ -64,104 +64,104 @@ ** ... ** data block<N> ** -** NWA Header: ファイル先頭から 44 bytes -** magic number などはないのでnwa ファイルかは -** データの整合性から判断する必要がある -** データは全て little endian で、 -** short(signed 2byte)または int(signed 4byte) である。 +** NWA Header: <ゃ 44 bytes +** magic number nwa <ゃ +** 若帥翫сゆ綽荀 +** 若帥 little endian с +** short(signed 2byte)障 int(signed 4byte) с ** -** +00 short channel 数(1/2) -** +02 short sample 一つあたりの bit 数(16) -** +04 int 周波数(一秒あたりのデータ数) -** +08 int 圧縮レベル:-1~5.2で最小のデータ、0で最大の復元度(-1は無圧縮rawデータとみなされる) +** +00 short channel (1/2) +** +02 short sample 筝ゃ bit (16) +** +04 int 羈∽(筝腱若炊) +** +08 int х軒鐚-1~5.2ф絨若帥0ф紊с緇綺(-1≦х軒raw若帥帥) ** +12 int ? -** +16 int ブロック数 -** +20 int 展開後のデータの大きさ(バイト単位) -** +24 int 圧縮時のデータの大きさ(nwa ファイルの大きさ。バイト単位) -** +28 int サンプル数:展開後のデータ数(16bit dataなら short 単位==サンプル単位のデータの大きさ) -** +32 int データ1ブロックを展開した時のサンプル単位のデータ数 -** +36 int 最終ブロックを展開した時のサンプル単位のデータ数 +** +16 int +** +20 int 絮緇若帥紊с(ゃ篏) +** +24 int х軒若帥紊с(nwa <ゃ紊сゃ篏) +** +28 int 泣潟逸絮緇若炊(16bit data short 篏==泣潟篏若帥紊с) +** +32 int 若随絮泣潟篏若炊 +** +36 int 腟絮泣潟篏若炊 ** +40 int ? ** ** data offset index -** 全ブロック数 x 4 byte のデータ -** それぞれ int のデータが全ブロック数続いている +** x 4 byte 若 +** int 若帥亥 ** -** データブロックの先頭を指すファイル先頭からの位置(オフセット) -** が格納されている +** 若帥<ゃ篏臀(祉) +** 主 ** ** data block -** 長さは可変。展開することで一定の大きさをもつデータに展開される。 -** データはDPCM形式。元 PCM データが a,b,c ならば (a),b-a, c-b と -** いった差分データが、仮数3-5bit,指数3bitの形式で保存されている。 -** 結果的に、16bit のデータが多くの場合 6-8bit で格納される。 -** 仮数のビット数は圧縮レベル0で5bit、圧縮レベル2で3bitとなる。 -** 以下、圧縮レベル2の場合について話を進める。 -** モノラルの場合: -** +00 short ブロック内の最初のデータ +** 激紊絮т絎紊сゃ若帥絮 +** 若帥DPCM綵√ PCM 若帥 a,b,c (a),b-a, c-b +** c綏若帥篁3-5bit,3bit綵√т絖 +** 腟16bit 若帥紊翫 6-8bit ф主 +** 篁違違х軒05bitх軒23bit +** 篁ヤх軒2翫ゃ荅宴蚊 +** ≪翫鐚 +** +00 short 若 ** +02- bit stream -** ステレオの場合: -** +00 short 左(?)チャンネルの最初のデータ -** +02 short 右(?)チャンネルの最初のデータ +** 鴻翫鐚 +** +00 short 綏(?)c潟若 +** +02 short (?)c潟若 ** +04- bit stream ** -** 差分データの精度が高くないので各ブロックの先頭で -** 正確なデータにより補正される(?) +** 綏若帥膕上墾蕭у +** 罩g∈若帥茖罩c(鐚) ** ** bit stream ** little endian -** +0 - +2 : 指数 -** +3 - +5 : 仮数 -** の形式。例えば a,b,c という8bitデータがあれば、 -** a&0x07 : データ1の指数 -** (a>>3)&0x07 : データ1の仮数(signed ; -** ((b<<2)|(a>>6))&0x07 : データ2の指数 -** (b>>1)&0x07 : データ2の仮数 -** となる。 -** ただし、指数の値により仮数のbit数が変化することがある。 -** 指数 = 1 - 6 の場合: -** a=指数、b=仮数、p=前のデータとして、今回のデータd は -** bの2bit目が立っている場合: +** +0 - +2 : +** +3 - +5 : 篁 +** 綵√箴 a,b,c 8bit若帥違 +** a&0x07 : 若随 +** (a>>3)&0x07 : 若随篁(signed ; +** ((b<<2)|(a>>6))&0x07 : 若随 +** (b>>1)&0x07 : 若随篁 +** +** 違ゃ篁違bit違紊 +** = 1 - 6 翫鐚 +** a=違b=篁違p=若帥篁若d +** b2bit腴c翫鐚 ** d = p - (b&3)<<(4+a) -** 立ってない場合: +** 腴c翫鐚 ** d = p + (b&3)<<(4+a) -** 指数 = 0 の場合:仮数は存在しない(データは3bitとなる) +** = 0 翫鐚篁違絖(若帥3bit) ** d = p -** 「智代アフター」の音声ファイル (complevel == 5) ではランレングス圧縮用に使われている。 -** 指数 = 7 -** 次の bit が立っている場合: -** d = 0 (現在未使用) -** (データは4bitとなる) -** 次の bit が立ってない場合: +** 坂撮≪帥若喝0<ゃ (complevel == 5) с潟潟違劫х軒篏帥 +** = 7 +** 罨< bit 腴c翫鐚 +** d = 0 (憜篏睡) +** (若帥4bit) +** 罨< bit 腴c翫鐚 ** complevel = 0,1,2: -** 仮数 b = 6bit -** b の 5bit 目が立っている場合: +** 篁 b = 6bit +** b 5bit 腴c翫鐚 ** d = p - (b&0x1f)<<(4+7) -** 立ってない場合: +** 腴c翫鐚 ** d = p + (b&0x1f)<<(4+7) -** (データは10bitとなる) +** (若帥10bit) ** complevel = 3,4,5: -** 仮数 b = 8bit -** b の 7bit 目が立っている場合: +** 篁 b = 8bit +** b 7bit 腴c翫鐚 ** d = p - (b&0x7f)<<9 -** 立ってない場合: +** 腴c翫鐚 ** d = p + (b&0x1f)<<9 -** (データは10bitとなる) +** (若帥10bit) ** -** 圧縮レベルが異なる場合、たとえば圧縮レベル==0で -** 指数==1~6でdの最上位bitが立っている場合 +** х軒違翫医х軒==0 +** ==1~6d筝篏bit腴c翫 ** d = p - (b&0x0f)<<(2+a) -** 指数==7でdの最上位bitが立っている場合 +** ==7d筝篏bit腴c翫 ** d = p - (b&0x7f)<<(2+7) -** (b : 8bitなのでデータは12bitとなる) -** のように、精度だけが変化するようになっている。 +** (b : 8bitс若帥12bit) +** 膕上墾紊c ** -** ヘッダ読み込みについてはNWAData::ReadHeader()参照 -** bit stream からのデータ展開については NWADecode()参照 +** 茯粋昭帥ゃNWAData::ReadHeader() +** bit stream 若水ゃ NWADecode() ************************************************************** */ -// #define NDEBUG /* なぜか assertが入った方が速い、、、 */ +// #define NDEBUG /* assertャc鴻 */ #include <stdio.h> #include <stdlib.h> @@ -172,9 +172,9 @@ #ifdef WORDS_BIGENDIAN #error Sorry, This program does not support BIG-ENDIAN system yet. -/* もし big endian のシステムに対応させる場合 -** 以下の *_little_endian_* 及び -** getbits() 関数を変更する必要がある +/* big endian 激鴻絲上翫 +** 篁ヤ *_little_endian_* +** getbits() ∽違紊眼綽荀 */ #endif @@ -200,7 +200,7 @@ inline int getbits(const char*& data, in return ret & ((1<<bits)-1); /* mask */ } -/* 指定された形式のヘッダをつくる */ +/* 絎綵√ゃ */ const char* make_wavheader(int size, int channels, int bps, int freq) { static char wavheader[0x2c] = { 'R','I','F','F', @@ -227,7 +227,7 @@ const char* make_wavheader(int size, int return wavheader; } -/* NWA の bitstream展開に必要となる情報 */ +/* NWA bitstream絮綽荀 */ class NWAInfo { private: int channels; @@ -256,7 +256,7 @@ template<class NWAI> void NWADecode(cons int i; int shift = 0; const char* dataend = data+datasize; - /* 最初のデータを読み込む */ + /* 若帥茯粋昭 */ if (info.Bps() == 8) {d[0] = *data++; datasize--;} else /* info.Bps() == 16 */ {d[0] = read_little_endian_short(data); data+=2; datasize-=2;} if (info.Channels() == 2) { @@ -264,18 +264,18 @@ template<class NWAI> void NWADecode(cons else /* info.Bps() == 16 */ {d[1] = read_little_endian_short(data); data+=2; datasize-=2;} } int dsize = outdatasize / (info.Bps()/8); - int flip_flag = 0; /* stereo 用 */ + int flip_flag = 0; /* stereo */ int runlength = 0; for (i=0; i<dsize; i++) { if (data >= dataend) break; - if (runlength == 0) { // コピーループ中でないならデータ読み込み + if (runlength == 0) { // 潟若若筝с若粋粋昭 int type = getbits(data, shift, 3); - /* type により分岐:0, 1-6, 7 */ + /* type 絏鐚0, 1-6, 7 */ if (type == 7) { - /* 7 : 大きな差分 */ - /* RunLength() 有効時(CompLevel==5, 音声ファイル) では無効 */ + /* 7 : 紊с綏 */ + /* RunLength() 号鐚CompLevel==5, 喝0<ゃ) с≦ */ if (getbits(data, shift, 1) == 1) { - d[flip_flag] = 0; /* 未使用 */ + d[flip_flag] = 0; /* 篏睡 */ } else { int BITS, SHIFT; if (info.CompLevel() >= 3) { @@ -294,7 +294,7 @@ template<class NWAI> void NWADecode(cons d[flip_flag] += (b&MASK2)<<SHIFT; } } else if (type != 0) { - /* 1-6 : 通常の差分 */ + /* 1-6 : 絽吾綏 */ int BITS, SHIFT; if (info.CompLevel() >= 3) { BITS = info.CompLevel()+3; @@ -311,9 +311,9 @@ template<class NWAI> void NWADecode(cons else d[flip_flag] += (b&MASK2)<<SHIFT; } else { /* type == 0 */ - /* ランレングス圧縮なしの場合はなにもしない */ + /* 潟潟違劫х軒翫 */ if (info.UseRunLength() == true) { - /* ランレングス圧縮ありの場合 */ + /* 潟潟違劫х軒翫 */ runlength = getbits(data,shift,1); if (runlength==1) { runlength = getbits(data,shift,2); @@ -332,7 +332,7 @@ template<class NWAI> void NWADecode(cons write_little_endian_short(outdata, d[flip_flag]); outdata += 2; } - if (info.Channels() == 2) flip_flag ^= 1; /* channel 切り替え */ + if (info.Channels() == 2) flip_flag ^= 1; /* channel 帥 */ } return; } @@ -377,9 +377,9 @@ class NWAData { } return blocksize * (bps/8); } - /* data は BlockLength 以上の長さを持つこと - ** 返り値は作成したデータの長さ。終了時は 0。 - ** エラー時は -1 + /* data BlockLength 篁ヤ激ゃ + ** 菴ゃ篏若帥激腟篋 0 + ** 惹 -1 */ int Decode(FILE* in, char* data, int& skip_count); void Rewind(FILE* in); @@ -398,7 +398,7 @@ void NWAData::ReadHeader(FILE* in, int _ if (offset_start == -1) offset_start = 0; if (_file_size != -1) filesize = _file_size; curblock = -1; - /* header 読み込み */ + /* header 茯粋昭 */ if (in == NULL || feof(in) || ferror(in)) { fprintf(stderr,"invalid stream\n"); return; @@ -420,18 +420,18 @@ void NWAData::ReadHeader(FILE* in, int _ blocksize = read_little_endian_int(header+0x20); restsize = read_little_endian_int(header+0x24); dummy2 = read_little_endian_int(header+0x28); - if (complevel == -1) { /* 無圧縮rawデータ */ - /* 適当に決め打ちする */ + if (complevel == -1) { /* ≦х軒raw若 */ + /* 綵羆冴< */ blocksize = 65536; restsize = (datasize % (blocksize * (bps/8))) / (bps/8); blocks = datasize / (blocksize * (bps/8)) + (restsize > 0 ? 1 : 0); } if (blocks <= 0 || blocks > 1000000) { - /* 1時間を超える曲ってのはないでしょ*/ + /* 鐚莇蚊cс*/ fprintf(stderr,"too large blocks : %d\n",blocks); return; } - /* regular file なら filesize 読み込み */ + /* regular file filesize 茯粋昭 */ if (filesize == 0 && fstat(fileno(in), &sb)==0 && (sb.st_mode&S_IFMT) == S_IFREG) { int pos = ftell(in); fseek(in, 0, SEEK_END); @@ -443,7 +443,7 @@ void NWAData::ReadHeader(FILE* in, int _ } } if (complevel == -1) return; - /* offset index 読み込み */ + /* offset index 茯粋昭 */ offsets = new int[blocks]; fread(offsets, blocks, 4, in); for (i=0; i<blocks; i++) { @@ -465,7 +465,7 @@ void NWAData::Rewind(FILE* in) { int NWAData::CheckHeader(void) { if (complevel != -1 && offsets == NULL) return false; - /* データそのもののチェック */ + /* 若帥с */ if (channels != 1 && channels != 2) { fprintf(stderr,"This program only supports mono / stereo data : data have %d channels.\n",channels); return false; @@ -492,7 +492,7 @@ int NWAData::CheckHeader(void) { fprintf(stderr,"This program only supports -1,0,1,2 compression level : the level of data is %d\n",complevel); return false; } - /* 整合性チェック */ + /* 翫сс */ if (filesize != 0 && filesize != compdatasize) { fprintf(stderr,"file size is invalid : %d != %d\n",filesize,compdatasize); return false; @@ -510,7 +510,7 @@ int NWAData::CheckHeader(void) { fprintf(stderr,"total sample count is invalid : samplecount %d != %d*%d+%d(block*blocksize+lastblocksize).\n",samplecount,blocks-1,blocksize,restsize); return false; } - tmpdata = new char[blocksize*byps*2]; /* これ以上の大きさはないだろう、、、 */ + tmpdata = new char[blocksize*byps*2]; /* 篁ヤ紊с */ return true; } @@ -523,10 +523,10 @@ class NWAInfo_sw2 { }; int NWAData::Decode(FILE* in, char* data, int& skip_count) { - if (complevel == -1) { /* 無圧縮時の処理 */ + if (complevel == -1) { /* ≦х軒 */ if (feof(in) || ferror(in)) return -1; if (curblock == -1) { - /* 最初のブロックなら、wave header 出力 */ + /* wave header 阪 */ memcpy(data, make_wavheader(datasize, channels, bps, freq), 0x2c); curblock++; fseek(in, offset_start + 0x2c, SEEK_SET); @@ -555,12 +555,12 @@ int NWAData::Decode(FILE* in, char* data if (blocks == curblock) return 0; if (feof(in) || ferror(in)) return -1; if (curblock == -1) { - /* 最初のブロックなら、wave header 出力 */ + /* wave header 阪 */ memcpy(data, make_wavheader(datasize, channels, bps, freq), 0x2c); curblock++; return 0x2c; } - /* 今回読み込む/デコードするデータの大きさを得る */ + /* 篁茯粋昭鐚潟若若帥紊с緇 */ int curblocksize, curcompsize; if (curblock != blocks-1) { curblocksize = blocksize * (bps/8); @@ -576,9 +576,9 @@ int NWAData::Decode(FILE* in, char* data curblock++; return -2; } - /* データ読み込み */ + /* 若粋粋昭 */ fread(tmpdata, 1, curcompsize, in); - /* 展開 */ + /* 絮 */ if (channels == 2 && bps == 16 && complevel == 2) { NWAInfo_sw2 info; NWADecode(info, tmpdata, data, curcompsize, curblocksize);