找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 4291|回复: 0

NXC--节拍录音器

  [复制链接]
发表于 2012-3-5 19:53:24 | 显示全部楼层 |阅读模式
本帖最后由 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
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-3-29 21:00 , Processed in 0.085900 second(s), 19 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表