あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

DirectSound (大雑把な説明1)

サンプルを作ったのでダウンロードしてください。

内容はNO.93 snd_testと変わらないですが、
最新のdevkitProでmakeできるようにしてあったり
ソースコードを多少読みやすくしてあります。


まず最初はwavの書式の話からです。
よく音楽CDをリッピングすると「44100Hz stereo 16bit」という
言葉を耳にしますが、これを基準に考えてみましょう。
1秒の無音データをフリーソフトで作ってみたのが以下のものとなっています。
f:id:akkera102:20151015210411p:plain

この中身は大まかにヘッダ部とデータ部に分かれています。
ヘッダはカーソルで反転してある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のプロジェクトと結合します。


サンプルコードの中身の説明は明日土日書きますので
ちょっとお待ちください。