arduino上实现天空之城播放

代码:

 1 #define NOTE_D0 -1 
 2 #define NOTE_D1 294 
 3 #define NOTE_D2 330 
 4 #define NOTE_D3 350 
 5 #define NOTE_D4 393 
 6 #define NOTE_D5 441 
 7 #define NOTE_D6 495 
 8 #define NOTE_D7 556 
 9  
10 #define NOTE_DL1 147 
11 #define NOTE_DL2 165 
12 #define NOTE_DL3 175 
13 #define NOTE_DL4 196 
14 #define NOTE_DL5 221 
15 #define NOTE_DL6 248 
16 #define NOTE_DL7 278 
17  
18 #define NOTE_DH1 589 
19 #define NOTE_DH2 661 
20 #define NOTE_DH3 700 
21 #define NOTE_DH4 786 
22 #define NOTE_DH5 882 
23 #define NOTE_DH6 990 
24 #define NOTE_DH7 112  
25 //以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写
26  
27 #define WHOLE 1 
28 #define HALF 0.5 
29 #define QUARTER 0.25 
30 #define EIGHTH 0.25 
31 #define SIXTEENTH 0.625  
32 //这部分是用英文对应了拍子,这样后面也比较好看
33  
34  int tune[] = {  
35  NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,
36  NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1,
37  NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7,
38  NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,
39  NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1,
40  NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5,
41  NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,
42  NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1,
43  NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,
44  NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,
45  NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D7
46 };//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数
47  
48 float duration[]= {  
49   1,1,1,0.5,0.5,     1+0.5,0.5,1,1,     1,1,1,0.5,0.5,
50   1+0.5,0.5,1,1,     1,1,1,1,          1+0.5,0.5,1,1, 
51   1,1,0.5,0.5,0.5,0.5,    1+0.5,0.5,1,1,     1,1,1,0.5,0.5,
52   1+0.5,0.5,1,1,    1,1,1,0.5,0.5,     1+0.5,0.5,1,1,
53   1,1,1,0.5,0.5,    1,0.5,0.25,0.25,0.25,0.5,    0.5,0.5,0.5,0.25,0.5,1,
54   0.5,0.5,0.5,0.5,1,1,    1,1,1,0.5,0.5,    1+0.5,0.5,1,1,
55   1,1,1,0.5,0.5,    1.5,0.5,1,1,    1,1,1,1,
56   0.5,0.5,1,1,0.5,0.5,    1.5,0.25,0.5,1,    1,1,1,1,
57   1,1,1,1,    1,1,1,1,    0.5,0.5,1,1,0.5,0.5,
58   1,0.5,0.5,1,1,    1,1,1,1,    1,1,1,1,
59   0.5,0.5,1,1,0.5,0.5,    1,0.5,0.25,0.5,1,    1,1,1,0.5,0.5
60 };//这部分是整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么)
61  
62 int length;//这里定义一个变量,后面用来表示共有多少个音符 
63 int tonePin=5;//蜂鸣器的pin  
64  
65 void setup()  
66 {  
67   pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式
68   length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数, 可以查出tone序列里有多少个音符
69  } 
70  
71 void loop()  
72 {  
73  
74   for(int x=0;x<length;x++)//循环音符的次数
75   {  
76     tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符 
77     delay(400*duration[x]);//每个音符持续的时间,即节拍duration,是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
78     noTone(tonePin);//停止当前音符,进入下一音符 
79     } 
80   delay(5000);//等待5秒后,循环重新开始
81 }
原文地址:https://www.cnblogs.com/guochaoxxl/p/14122691.html