Hatena::ブログ(Diary)

Ko-Taのバ・ー・ルのようなもの

2007-03-18

.cwav

富山星人がいきなりこんなURLを。

http://ja.wikipedia.org/wiki/Cwav

今更その…はずかしいよう(みすず


『cwav』で検索すると色々錯綜して「oggvorbisの一種」だとか「MediaPlayerで聞ける」とか色々ありますが、そんな事はありません。

生き別れの弟も居ません。

なんかまだソースコードが残ってて、ちょっとコンパイルしてみたら動いちゃったので、再生用においときます。(コンパイラのゴミ入り)

・cwav library & player

http://kota.dokkoisho.com/#cw


cwav形式は、ずーーーーーーっと昔に、mp3が著作権で泥臭い時代に、しょーがないので出来合いで作られた、どうしようもない非可逆圧縮型の音声波形形式で、BGMのストリーミング再生用に作ったものです。

音質は悪く、圧縮精度も高くなく、それでいて展開速度もHuffman符号化がネックで決して速いものではありません。

(でも生WAVE直再生よりかは随分とメモリに優しいはずです)


cwavの圧縮プロセスは「差分化」「Huffman符号化」の2つからなります。


■差分化

波形を表すビット数を16Bitから8Bitに落とします。

ただ落とすのではなくて、差分数値(微分っていうの?)に変換して、そこから「1,2,4,8,16,32〜」と言った不等間隔な値で数値化し8Bitテーブル化します。

これにより、数値に偏りをもたせます。

(生Wave)

1 ,16 ,14 ,10 ,2 ,3 ,0 ,0 ,0

(差分化)

1 ,15 ,-2 ,-4 ,-8 ,1 ,-3 ,0 ,0

(8Bit化)

1 ,16 ,-2 ,-4 ,-8 ,1 ,-2 ,-1 ,1

実際の変換は0〜255(半分はマイナスで使用)の8Bitテーブルを用いて、そこに好きな数字を入れて8Bit化しています。

このテーブルの数値の増加が比較的緩やかなほど波形の再現が高くなり音質が良くなりますが、偏りが弱くなり圧縮が利きにくくなります。

逆に増加が激しいと波形の再現にブレが生じ音質が悪くなりますが、偏りが生じ圧縮が利きやすくなります。

圧縮はそこそこ重めですが、展開時はテーブル参照だけで済むので処理は結構軽めです。

(この段階ではデータが16Bit→8Bitで容量が1/2になっただけです)

(実際は差分化したものの差分を8bit化してます。今考えるとなんか逆効果な気がするなぁ)


■Huffman圧縮

詳しくはwikiを参照してください。

http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%95%E3%83%9E%E3%83%B3%E7%AC%A6%E5%8F%B7

出現回数の多い数字のBit数を減らしてデータ数を減らします。

上の処理でデータの数値に大きな偏りが生じているので、Huffmanをかけることで結構小さくなってくれます。

この時の圧縮率は、差分化する際のテーブルデータ次第ということになります。


■ループ再生とシーク

さて、ループについてなんですが、実はすごくダメな仕様になっております。

先ほど解説したとおり、データが差分化されているので、特定の場所から再生が出来ません。

(普通はある一定間隔ごとに絶対データを保持する構造にするのですがそんなことしてません:D)

じゃぁどうなってるのかというと、言いたく無いんですが、再生中にループ開始ポイントになるとその時の絶対データを格納しておいて、ループ終端ポイントになるとその値を使って強引に戻します。

というわけで、こいつにはシークが無いのです:D


■あとがき

とまぁ、とっても「こういう風に使えればいいやぁ」的なものなんですが、これでも当時はBGMのストリーミング再生の選択肢が無かったので、個人的には重宝しておりました。

今はOggVorbisがあるので、これを使う理由は見当たりません。