|
发表于 2012-10-2 21:44:01
|
显示全部楼层
lz太给力了写了这么好玩的程序,但是好像基准频率有点问题,有些音节失真了。
小弟不才微改了一下频率,放一首欢乐颂上来与大家分享,多多包涵 - #define NOTE_D0 -1
- #define NOTE_D1 523
- #define NOTE_D2 580
- #define NOTE_D3 659
- #define NOTE_D4 698
- #define NOTE_D5 783
- #define NOTE_D6 800
- #define NOTE_D7 987
- #define NOTE_DL1 261
- #define NOTE_DL2 293
- #define NOTE_DL3 329
- #define NOTE_DL4 349
- #define NOTE_DL5 391
- #define NOTE_DL6 400
- #define NOTE_DL7 493
- #define NOTE_DH1 1046
- #define NOTE_DH2 1174
- #define NOTE_DH3 1318
- #define NOTE_DH4 1396
- #define NOTE_DH5 1567
- #define NOTE_DH6 1700
- #define NOTE_DH7 1975
- //以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写D调的各种歌,我这里用NOTE_D+数字表示音符,NOTE_DH+数字表示上面有点的那种音符,NOTE_DL+数字表示下面有点的那种音符。这样后面写起来比较好识别。
- #define WHOLE 1
- #define HALF 0.5
- #define QUARTER 0.25
- #define EIGHTH 0.25
- #define SIXTEENTH 0.625
- //这部分是用英文对应了拍子,这样后面也比较好看
- int tune[] =
- {
- NOTE_D3,NOTE_D3,NOTE_D4,NOTE_D5,NOTE_D5,NOTE_D4,NOTE_D3,NOTE_D2,
- NOTE_D1,NOTE_D1,NOTE_D2,NOTE_D3,NOTE_D3,NOTE_D2,NOTE_D2,
- NOTE_D0,
- NOTE_D3,NOTE_D3,NOTE_D4,NOTE_D5,NOTE_D5,NOTE_D4,NOTE_D3,NOTE_D2,
- NOTE_D1,NOTE_D1,NOTE_D2,NOTE_D3,NOTE_D2,NOTE_D1,NOTE_D1,
- NOTE_D0,
- NOTE_D2,NOTE_D2,NOTE_D3,NOTE_D1,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D1,
- NOTE_D2,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D2,NOTE_D1,NOTE_D2,NOTE_DL5,
- NOTE_D0,
- NOTE_D3,NOTE_D3,NOTE_D4,NOTE_D5,NOTE_D5,NOTE_D4,NOTE_D3,NOTE_D2,
- NOTE_D1,NOTE_D1,NOTE_D2,NOTE_D3,NOTE_D2,NOTE_D1,NOTE_D1,
- };//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数
- float duration[]=
- {
- 1,1,1,1,1,1,1,1,1,1,1,1,2,0.5,1,
- 1,
- 1,1,1,1,1,1,1,1,1,1,1,1,2,0.5,1.5,
- 1,
- 1,1,1,1,1,0.5,0.5,1,1,1,0.5,0.5,1,1,1,1,1.5,
- 1,
- 1,1,1,1,1,1,1,1,1,1,1,1,2,0.5,1.5,
- };//这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么)
- int length;//这里定义一个变量,后面用来表示共有多少个音符
- int tonePin=5;//蜂鸣器的pin
- void setup()
- {
- pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式
- length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符
- }
- void loop()
- {
- for(int x=0;x<length;x++)//循环音符的次数
- {
- tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符
- delay(400*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
- noTone(tonePin);//停止当前音符,进入下一音符
- }
- delay(5000);//等待5秒后,循环重新开始
复制代码 |
|