マイク機能を使ったプログラムを書いてて不満点が発生。
・現在の入力の有無が欲しい
・入力の状態(エッジ)まで欲しい
つーことで追記しました。
ARM9 コードだけ記述が増えてます。
input ライブラリと同じような記述で使えます。
毎フレーム scanMic() でマイクの入力状態を更新。
micIsOn(), micIsOff(), micIsHeld(), micIsCurrent() がそれぞれ
keysDown(), keysUp(), keysHeld(), keysCurrent() と同じ作用をもたらします。
んで 整数データである入力値からオン/オフへの割り振りなのですが
unsigned char 型の AUX 値(12 ビットデータを 4 ビット左シフトしたもの)ですと
128 前後で無音状態、それ以外なら(大きい値、小さい値とも)音を検出してる状態なので
無音値(128 前後)から ±64 を超えた値を拾った場合をオン、
無音値から ±64 以内ならオフという具合で処理してます。
この取り方では甘い!とか何かありましたらコメントに文句でも頂けたらなーと(汗)。
microphone get current value sample
プロジェクト一式
ttp://page.freett.com/ntr/example/mic.zip
ソース
mic.h
/*--------------------------------------------------------------------------------- mic arm9 module header version 0.02 Mar 20, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #ifndef _MIC_H_ #define _MIC_H_ #ifdef __cplusplus extern "C" { #endif void micEnable(void); void micDisable(void); void scanMic(void); bool micIsOn(void); bool micIsOff(void); bool micIsHeld(void); bool micIsCurrent(void); u8 micGetValue8(void); u16 micGetValue12(void); #ifdef __cplusplus } #endif #endif // _MIC_H_
mic.c
/*--------------------------------------------------------------------------------- mic arm9 module routine version 0.02 Mar 20, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <nds/ndstypes.h> #include <nds/fifocommon.h> #include "micdef.h" #include "mic.h" typedef struct{ u8 value; bool bit; bool bit_old; }MicStatus; static MicStatus st_mic = {0, false, false}; //--------------------------------------------------------------------------------- void micEnable(void){ //--------------------------------------------------------------------------------- fifoSendValue32(FIFO_USER_01, MIC_ENABLE); } //--------------------------------------------------------------------------------- void micDisable(void){ //--------------------------------------------------------------------------------- fifoSendValue32(FIFO_USER_01, MIC_DISABLE); } //--------------------------------------------------------------------------------- void scanMic(void){ //--------------------------------------------------------------------------------- st_mic.value = micGetValue8(); st_mic.bit_old = st_mic.bit; st_mic.bit = (st_mic.value < 64 || st_mic.value >= 192) ? true:false; } //--------------------------------------------------------------------------------- bool micIsOn(void){ //--------------------------------------------------------------------------------- return st_mic.bit & ~st_mic.bit_old; } //--------------------------------------------------------------------------------- bool micIsOff(void){ //--------------------------------------------------------------------------------- return ~st_mic.bit & st_mic.bit_old; } //--------------------------------------------------------------------------------- bool micIsHeld(void){ //--------------------------------------------------------------------------------- return st_mic.bit & st_mic.bit_old; } //--------------------------------------------------------------------------------- bool micIsCurrent(void){ //--------------------------------------------------------------------------------- return st_mic.bit; } //--------------------------------------------------------------------------------- u8 micGetValue8(void){ //--------------------------------------------------------------------------------- fifoSendValue32(FIFO_USER_01, MIC_GETVAL8); while(!fifoCheckValue32(FIFO_USER_01)); return (u8)fifoGetValue32(FIFO_USER_01); } //--------------------------------------------------------------------------------- u16 micGetValue12(void){ //--------------------------------------------------------------------------------- fifoSendValue32(FIFO_USER_01, MIC_GETVAL12); while(!fifoCheckValue32(FIFO_USER_01)); return (u16)fifoGetValue32(FIFO_USER_01); } //---------------------------------------------------------------------------------