|
本帖最后由 wabil 于 2012-3-5 20:04 编辑
俺用NXC写了个节拍录音器供大家研究,在NXT的IN2接入声音传感器就可以用了,下面的程序在BCC中可以编译通过.
程序运行后,你对着声音传感器用手打节拍," 啪啪-啪-啪", 当你停止打啪后2秒,NXT就会将你刚才打的节拍播放出来了哦.
播完后还可以继续的.
////////////////////////////////////////////////////
// Project: NXT节奏模仿器
// Maker: Wabil
// Time: 2012-3
//////////////////////////////////////////////////////
///请在安静的环境下测试.
///NXT硬件接口: IN2接入声音传感器.
///NXT程序效果: 当你用手拍完节奏后,2秒,nxt会跟着模仿出一个节奏然后发声.
#define ONCODE(X) {static bool flag=0; if(!(X)) flag=1; if((X)&&flag){
#define ENDONCODE flag=0;}}
#define STOP_TIME 2000 ///节奏后停顿2秒才开始模仿(MSec)
#define VOLUME_START 80
byte volume; ///记录音量的振幅
long startTick;
long endTick;
long sndGroup[30];//一次最多记录30下节拍,时间长度值
byte sndTm=0;
byte repeatTm=0;
//============================
// 将节拍声音重复一遍
//============================
void ReaptSound()
{
TextOut(4,LCD_LINE4,"---Reapt!---");
repeatTm=0;
startTick=CurrentTick();
while(repeatTm<sndTm)
{
if(CurrentTick()-startTick==sndGroup[repeatTm] )
{
repeatTm++;
PlayTone(1000,150); //Freq,playLong
}
}
Wait(500);
}
//======================================
// 等待玩家拍节奏
//=====================================
void WaitToStart()
{
sndTm=0;
TextOut(4,LCD_LINE4,"===End======");
NumOut(25,LCD_LINE3,sndTm);
do ///等待拍手
{
volume=SENSOR_2;
Wait(1);
}while(volume<(VOLUME_START-10)); //请在安静的环境下测试
TextOut(2,LCD_LINE2,"---Recording---");
startTick=CurrentTick();
endTick=startTick;
}
//================================
// 主任务线程
//================================
task main()
{
SetSensorSound(IN_2);///听觉接口S2
TextOut(1,LCD_LINE1,"---make sound---");
WaitToStart();
while(true)
{
volume=SENSOR_2;
ONCODE(volume>VOLUME_START) //当拍手的音量大于设定值时触发记录
endTick=CurrentTick();
sndGroup[sndTm]=endTick-startTick;
sndTm++;
TextOut(3,LCD_LINE3,"Clk= "); //显示节拍数
NumOut(25,LCD_LINE3,sndTm);
ENDONCODE
if(CurrentTick()-endTick>STOP_TIME){
ReaptSound();
WaitToStart();//重新开始
}
if(sndTm>29) //记录次数满后自动开始播放
{
ReaptSound();
WaitToStart();//重新开始
}
}/////while(true)
}///////main
|
|