#author("2023-05-08T17:19:23+09:00","","") ** DirectSound1 [#v8805b0d] 音は、タイマーやDMAなどの機能を複数使うので少々面倒かもしれません。~ まずはわかりやすく考えるために、音のデータから着目してみましょう。~ よく音楽CDのリッピングで耳にするwavファイルの~ 「44100Hz stereo 16bit」という形式がスタートです。~ ** wavファイルフォーマット [#ucff091f] 手前味噌ですが1秒の無音データをフリーソフトで作ってみました。~ 以下、バイナリエディタで表示したものです。~ #ref(clip_1.png,nolink) この中身はヘッダ部とデータ部に分かれています。~ ヘッダはカーソルで反転してある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(符号付き)となっています。~ ** 加工方法 [#q4014486] サンプルの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のコマンドオプションを詳しく見てみましょう。~ 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側のソースコード [#b0206fc8] *** 動作画面 [#l222045a] ** 履歴 [#l5bd00ff] - 2023/05/08 - 2019/01/05