sound.h PCM再生とかの私的メモ。


RGKT-NDS-STDY-017(002)


私的メモ帳。
やりたいこと優先で進めて
分かったことを記述してるというだけなのでまとめを期待してはいけない。


・音の変換はフリーウェアとかを使ってDS用に加工。
 俺の場合の環境。
 ・MP3→WAV CDex
 ・WAVから一部分の音切り出し、加工等 SoundEngine Free
 ・サンプリングレート変更 サウンドレコーダー
  WAVファイルを開く→名前を付けて保存
  →形式: 変更 で PCM 11.025 kHz, 16 ビット, モノラル に変更して(上書)保存する。
 ・DS再生形式のサウンドデータ変換 SoX
  ・コマンドラインから変換
   >sox janken.wav janken.raw
   "-V"オプションを付けることでコンバード後のサンプリングレート情報が表示されるので
   ちゃんと変換できてるか確認できる。
   >sox -V janken.wav janken.raw


・最初に必ず void soundEnable(void) でサウンド再生を有効にする必要がある(デフォルトでは無効)。


・サウンドデータフォーマット(16 ビット PCM だとか 8 ビット PCM だとか)は正しく設定しないとちゃんと鳴らない。


・サウンドデータはモノラルしか、正しく再生できない(?)。16ビットだけ確認。8ビット未確認。
 内部資料見てないのであいまい。
 サンプリングデータ再生関数にステレオ・モノラル指定できる引数はない。
 1つのサンプリングデータがモノラルのみの場合
 チャンネルを2つ使って一方を右に、一方を左にパンを割り振ってステレオを実現する必要がある?


・soundPlaySample() で連続再生を行うと空いてるチャンネルから順に内部処理にて割り振られて再生される。
 16チャンネルすべて使い切った状態で更に再生することは不可(SoundId は -1 とされる。)。


・1チャンネル単体でやりたい場合
 soundPlaySample() でPCMデータを割り当てた際のチャンネル番号が返値で戻るのでそれを受け取って
 後は soundResume() でチャンネル番号指定して再生させる。


・sound.h ヘッダはインクルード記述しなくてもインクルードされる(nds.h ヘッダインクルード時に他から取り込まれてる?)
 外部関数を定義するときはおそらく #include として取り込む必要があると思われる。



PCM関連で使う関数とかの簡単な説明。
(他マイク用・PSG用・ノイズ用の関数がある。
soundEnable() のように PCM 形式にだけ限らない、兼用利用するような関数もある)。

void soundEnable(void);

サウンド再生を有効にする


void soundDisable(void);

サウンド再生を無効にする


int soundPlaySample(const void* data, SoundFormat format, u32 dataSize, u16 freq, u8 volume, u8 pan, bool loop, u16 loopPoint); 

サンプリングデータ(WAV音)をセット・再生する

int soundPlaySample(
	const void* data, //サウンドデータアドレス
	SoundFormat format, //サウンドデータ形式
				//  SoundFormat_16Bit = 1,  16ビットPCM
				//  SoundFormat_8Bit  = 0,   8ビットPCM
				//  SoundFormat_PSG   = 3,          PSG
				//  SoundFormat_ADPCM = 2         ADPCM
	u32 dataSize, //サウンドデータサイズ	
	u16 freq, //周波数(Hz)指定
	u8 volume, //再生音量。 0 〜 127 で指定。0 が最も小さく 127 が最も大きい音量
	u8 pan, //パン。 0 〜 127 で指定。左右スピーカーから再生される音の割り振り。
	bool loop, //true リピート再生する。 false 一回だけ再生する。
	u16 loopPoint //\param loopPoint The offset for the sample loop to restart when repeating
	);

//返値には自動的に割り当てられたチャンネル番号が入る。
//0 〜 15 の範囲。割り当てられなかった場合、サウンドの再生はされず -1 が返ってくる。


使用例(PCM 11.025kHz 16ビット, モノラル サウンドの場合)

soundPlaySample(janken_raw, SoundFormat_16Bit, janken_raw_size, 11025, 64, 64, false, 0);


サウンドデータの所在は make 実行時に出力される *_raw.h にあるので
出力されたヘッダファイルもインクルードすること。


インクルード例

#include "janken_raw.h"


make 実行時に出力されるサウンドデータのヘッダファイル
(* には RAW サウンドファイル名(*.raw)の名前が入る)


*_raw.h

extern const u8 *_raw_end[]; //サウンドデータ終了アドレス
extern const u8 *_raw[];     //サウンドデータ開始アドレス
extern const u32 *_raw_size; //サウンドデータサイズ
void soundPause(int soundId);

サウンドを停止する(一時停止ではない)


void soundKill(int soundId);
void soundResume(int soundId);

サウンドを再生する(頭出し再生)