Tutorial.22 DirectSound(工事中)

音は、タイマーやDMAなどの機能を複数使うので少々面倒かもしれません。
まずはわかりやすく考えるために、音のデータから着目してみましょう。

よく音楽CDのリッピングで耳にするwavファイルの
「44100Hz stereo 16bit」という形式がスタートです。

wavファイルフォーマット

手前味噌ですが1秒の無音データをフリーソフトで作ってみました。
以下、バイナリエディタで表示したものです。

clip_1.png

この中身はヘッダ部とデータ部に分かれています。
ヘッダはカーソルで反転してある44バイト。
残りのデータは0x00で埋まり、ファイルサイズは176,444バイトとなっています。

内訳は

 176,444バイト = 44100(Hz) * 2(ステレオ)* 2バイト(16bit) * 1(秒) + 44(ヘッダ)

です。

別の言い方をすると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(符号付き)となっています。

加工方法

サンプルのsrc\res\Makefileの抜粋を見てみましょう。

 .wav.s: $(WAVFILES)
 	@echo \# converting $<
 	@./sox $< -r 16384 -c 1 -B -s -1 $*.raw
 	@padbin 4 $*.raw
 	@bin2s $*.raw > $@
 	@rm $*.raw

データはsox(音フォーマット変換ツール)、padbin(バイト境界調整ツール)、
bin2s(アセンブリテキスト変換ツール)、に掛けていき、GBAのプロジェクトと結合します。
soxのコマンドオプションはこのようになっています。

 -r RATE       sample rate of audio
 -c CHANNELS   number of channels of audio data; e.g. 2 = stereo
 -B            force endianness to big/little
 -s            sample encoding: signed
 -1            sample size in bytes

コマンドプロンプトで打ち込んだ結果を以下に表します。

 > sox 1sec.wav -r 16384 -c 1 -B -s -1 1sec.raw
 >
 > dir 1sec.raw
 >
 > 2019/01/05  xx:xx            16,384 1sec.raw

0x00で埋まった16,384サイズのファイルが出来上がりました。
GBAは「16384Hz モノラル 8bit(符号付き)」形式で鳴らす予定なので
ヘッダがない、素のデータのみ、ということがわかると思います。

GBA側のソースコード

動作画面

履歴

  • 2019/01/05

添付ファイル: fileclip_1.png 131件 [詳細]

Last-modified: 2019-01-09 (水) 13:12:39 (1017d)