サンプルを作ったのでダウンロードしてください。
内容はNO.93 snd_testと変わらないですが、
最新のdevkitProでmakeできるようにしてあったり
ソースコードを多少読みやすくしてあります。
まず最初はwavの書式の話からです。
よく音楽CDをリッピングすると「44100Hz stereo 16bit」という
言葉を耳にしますが、これを基準に考えてみましょう。
1秒の無音データをフリーソフトで作ってみたのが以下のものとなっています。
この中身は大まかにヘッダ部とデータ部に分かれています。
ヘッダはカーソルで反転してある44バイト。
残りのデータは0x00で埋まり、ファイルサイズは176,444バイトとなっています。
内訳は
44100(Hz) * 2(ステレオ)* 2バイト(16bit) * 1(秒) + 44(ヘッダ) = 176,444バイト
です。
別の言い方をすると1秒を44100*2個に分割し、2バイト(16bit)単位で音の高さを
保存してある、ということが言えます。
さらに仕様書をつっこんでみると、2バイト(16bit)の中身は
16bit ならば符号付き signed (-32768 ~ +32767, 無音は 0)
なんて情報もわかりますね。0x00で埋まっているのも納得です。
次にGBAについてですが、これはGBATEK先生の出番です。
The Sample Rate The GBA hardware does internally re-sample all sound output to 32.768kHz (default SOUNDBIAS setting). It'd thus do not make much sense to use higher DMA/Timer rates. Best re-sampling accuracy can be gained by using DMA/Timer rates of 32.768kHz, 16.384kHz, or 8.192kHz (ie. fragments of the physical output rate).
適当翻訳すると「GBAは32.768kHzで音が鳴るんで32.768kHz, 16.384kHz, 8.192kHz」の
どれかにしといた方がいいぜ、とアドバイスしてくれてます。
例でいえば、画像ファイルのアスペクト比を無視して
縮小をするんじゃないぞ、と忠告してもらっているようなものです。
音の中身はモノラルであり、音単位は8bit singed(符号付き)となっています。
さて変換にはsoxというツールを使いますが、サンプルのsrc\res\Makefileの抜粋を見てみましょう。
.wav.s: $(WAVFILES) @echo \# converting $< @./sox $< -r 16384 -c 1 -B -s -1 $*.raw @padbin 4 $*.raw @bin2s $*.raw > $@ @rm $*.raw
データはpadbin(バイト境界調整ツール), bin2s(バイナリをアセンブル変換ツール)に
次々に掛けていき、GBAのプロジェクトと結合します。
サンプルコードの中身の説明は明日土日書きますので
ちょっとお待ちください。