蜂鸣器演奏极乐净土

        在我初中的元旦晚会上面,我曾表演过极乐净土,这也是我值得骄傲的地方,而今天,我将用蜂鸣器演奏极乐净土,让那优美的旋律唱响宿舍。

#define NTD0 0
#define NTD1 441
#define NTD2 495
#define NTD3 556
#define NTD4 589
#define NTD5 661
#define NTD6 742
#define NTD7 833

#define NTDL1 221
#define NTDL2 248
#define NTDL3 278
#define NTDL4 294
#define NTDL5 330
#define NTDL6 371
#define NTDL7 416

#define NTDH1 882
#define NTDH2 990
#define NTDH3 1112
#define NTDH4 1178
#define NTDH5 1322
#define NTDH6 1484
#define NTDH7 1665
//列出全部D调的频率
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//列出所有节拍
int tune[]=//根据简谱列出各频率
{
NTD6,NTD6,NTD6,NTD6,NTDH1,NTDH2,NTDH3,
NTD6,NTD6,NTD6,NTD5,NTD5,NTD6,
NTD6,NTD6,NTD6,NTD6,NTDH1,NTDH2,NTDH3,
NTD6,NTD6,NTD6,NTDH4,NTDH4,NTDH3,
NTD6,NTD6,NTD6,NTD6,NTDH1,NTDH2,NTDH3,
NTD6,NTD6,NTD6,NTD5,NTD5,NTD6,
NTD6,NTD6,NTD6,NTD6,NTDH1,NTDH2,NTDH3,
NTD6,NTD5,NTD5,NTD6,NTD6,

NTD0,NTD0,NTD6,NTD6,NTD5,NTD5,NTD5,NTD6,
NTD5,NTD3,NTD3,NTD5,NTD3,
NTD0,NTD0,NTD6,NTD6,NTD5,NTD6,NTD7,
NTDH1,NTD7,NTD6,NTD7,NTD6,NTD5,

NTD0,NTD0,NTD6,NTD6,NTD5,NTD5,NTD6,NTD5,
NTD5,NTD3,NTD3,NTD5,NTD3,NTD3,NTD0,NTD5,
NTD5,NTD6,NTD0,NTD5,NTD5,NTD6,NTD0,NTD6,NTD7,

NTDH1,NTDH2,NTD6,NTD3,NTD3,NTD5,
NTD5,NTD6,NTD0,NTDH3,NTDH2,NTD0,NTD6,
NTD0,NTD6,NTD6,NTDH3,NTDH2,NTD0,
NTD0,NTDH2,NTDH2,NTDH1,NTDH2,NTDH1,NTD6,NTD6,NTD5,

NTD5,NTD5,NTD5,NTD6,NTD6,NTD3,NTD3,NTD5,
NTD5,NTD6,NTD0,NTD3,NTDH2,NTD0,NTD6,
NTD0,NTD6,NTD6,NTDH3,NTDH2,NTD0,

NTD0,NTDH2,NTDH2,NTDH1,NTDH2,NTDH1,NTD6,NTD6,NTD3,NTD5,
NTD5,NTD6,NTD6,NTD5,NTD6,NTD3,NTD0,NTD3,NTD5,
NTD5,NTD6,NTDH3,NTDH3,NTD0,NTD7,NTDH1,
NTDH2,NTDH1,NTDH2,NTDH2,NTDH3,NTD6,NTD0,NTD5,NTD5,
NTD6,NTDH3,NTDH3,NTDH2,NTDH1,NTD6,NTD5,
NTD6,NTD6,NTD6,NTDH1,NTDH2,NTD0,
NTD6,NTD6,NTD6,NTD6,NTD5,NTD6,NTDH3,NTD0,NTDH1,
NTDH2,NTDH1,NTDH2,NTDH2,NTDH3,NTDH3,NTD0,NTD5,
NTD6,NTDH1,NTD0,NTD5,NTD6,NTDH3,NTD0,NTDH3,NTDH2,

NTDH1, NTD7, NTD6, NTD5, NTD5, NTD6, NTD0,
NTD3, NTD3, NTD5,
NTD5,NTD6,NTD0,NTDH3,NTDH2,NTD0,NTD6,
NTD0,NTD6,NTD6,NTDH3,NTDH2,NTD0,
NTD0, NTDH2, NTDH2, NTDH1, NTDH2, NTDH1, NTD6, NTD6, NTD3, NTD5,
NTD5, NTD6, NTD6, NTD5, NTD6, NTD3, NTD3, NTD5,
NTD5, NTD6, NTD6, NTDH3, NTDH3, NTD0, NTD7, NTDH1,
NTDH2,NTDH1,NTDH2,NTDH2,NTDH3,NTD6,NTD0,NTD5,NTD5,
NTD6,NTDH3,NTDH3,NTDH2,NTDH1,NTD6,NTD5,
NTD6,NTD6,NTD6,NTDH1,NTDH2,NTD0,
};
float duration[]=//根据简谱列出各节拍
{
1,1,1,0.25,0.25,0.25,0.25,
1,1,0.5,0.5,0.5,0.5,
1,1,1,0.25,0.25,0.25,0.25,
1,1,0.5,0.5,0.5,0.5,
1,1,1,0.25,0.25,0.25,0.25,
1,1,0.5,0.5,0.5,0.5,
1,1,1,0.25,0.25,0.25,0.25,
1.5,0.5,0.5,0.5,1,

1,0.5,0.5,0.5,0.25,0.25,0.5,0.5,
0.5,0.5,1,0.25,2,
1,0.5,0.5,0.5,0.5,0.5,0.5,
1,1,0.5,0.25,0.25,1,

1,0.5,0.5,0.5,0.5,0.5,0.25,0.25,
0.5,0.5,0.5,0.25,0.25,1,0.5,0.5,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,

1,1,0.5,0.5,0.5,0.5,
0.5,0.5,0.5,0.5,1,0.5,0.5,
0.5,0.5,0.5,0.5,1,1,
0.5,0.5,0.5,0.5,0.5,0.25,0.25,0.5,0.5,

0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
0.5,0.5,0.5,0.5,1,0.5,0.5,
0.5,0.5,0.5,0.5,1,1,

0.5,0.5,0.5,0.5,0.5,0.25,0.25,0.25,0.25,0.5,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,
0.5,1,0.5,1,0.5,0.25,0.25,

0.5,0.25,0.25,0.5,0.5,1,0.5,0.25,0.25
,1,1,0.25,0.5,0.5,0.5,0.5,
1,0.25,0.5,0.5,1,1

,0.5,0.25,0.25,0.5,0.5,0.5,0.5,0.5,0.5,
0.5,0.25,0.25,0.5,0.5,1,0.5,0.5,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,

0.5,0.5,0.5,0.5,0.5,1,0.5,

0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,1,1,

0.5,0.5,0.5,0.5,0.5,0.25,0.25,0.5,0.25,0.25,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
0.5,0.5,0.5,0.5,1,0.5,0.25,0.25,

0.5,0.25,0.25,0.5,0.5,1,0.5,0.25,0.25
,1,1,0.25,0.5,0.5,0.5,0.5,
1,0.25,0.5,0.5,1,1

,0.5,0.25,0.25,0.5,0.5,0.5,0.5,0.5,0.5,
0.5,0.25,0.25,0.5,0.5,1,0.5,0.5,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,

0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,
0.5,0.5,0.5,0.5,1,1

};
int length;

int tonePin=8;


void setup()
{
pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数,查出数组里有多少个音符
}

void loop()
{
for (int x = 0; x < length; x++) //循环音符的次数
{
  tone(tonePin, tune[x]); 
  delay(430 * duration[x]); 
  noTone(tonePin);//停止当前音符,进入下一音符
}
  delay(3000);

        这就是演奏极乐净土的代码,下面我将来简单解释一下运作的原理。

        首先是很多的#define,对用到的每个音符用数字来代替,简化了后面的操作。

        然后创作一个tune的数组,用的是整型,因为里面的字符串都已经被定义为了整型。

        下一个是float duration[]的一个数组,这个数组主要就是控制节拍的。

        上面的解释都比较玄学,理解为主吧,反正我觉得一般放歌都是在网上找曲子,后面才是主体部分。

        先是定义了我们下面会用到的变量,一个是length,并把tonePin初始化为8。在setup函数中,我们将tonePin设置为OUTPUT输出模式;下一个是用来计算有多少个音符的。用到了 sizeof(tune) / sizeof(tune[0])这个方程, sizeof(tune) 是整个数组的大小,  sizeof(tune[0])是每个数组的大小(整型的话数组大小为4),两个相除就是音符个数。

        在loop函数中,我们用了一个for循环去控制音符重复的次数,在这个循环中,我们会依次播放tune里面的每个元素,即音符。delay的用处是每个音符持续的时间,即节拍duration,430是调整时间的越大,曲子速度越慢,越小曲子速度越快。最后是停止当前音符,进入下一音符。

        就是这样了,后面的setup和loop函数几乎都不变,只要把前面的代码改掉,就可以放你想听的歌了。(解决复制时出现报错的方法,切记把里面的空格改一下,空格重新输一次)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁不动AI了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值