Arduino—超简单音乐制作

2015-01-012.9万
AI 快速预览详细 收起
本文介绍了如何使用Arduino UNO板和蜂鸣器进行简单的音乐制作。首先介绍了所需的材料和连接方法,然后讲解了基本的乐理知识,包括音符频率和拍子。接着详细说明了如何将简谱翻译成代码,并提供了《葫芦娃》的完整代码示例。通过这个项目,初学者可以轻松地学习到音乐制作的基本原理,并且能够实际操作实现音乐播放。


Arduino—超简单音乐制作
一曲葫芦娃 带你回归美好童年
本文很简单,需要用到的材料:Arduino UNO板一块,七彩跳线若干条,蜂鸣器或小喇叭一个(小喇叭更好蜂鸣器要接电阻不然声音有点刺耳)



连接方法如图:

首先讲下简单的乐理知识,知道音乐是怎么演奏出来的自然就可以通过代码来进行编排了。
1.演奏单音符  一首乐曲有若干音符组成,一个音符对应一个频率。我们知道到相对应的频率 让arduino输出到蜂鸣器 蜂鸣器就会放出相应的声音,这里有个表供大家参考:


2.音符的演奏时间  我们知道了音符是如何演奏出来的,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。如何确定每个音符演奏的单位时间呢?
我们知道,音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125以此类推,每个音符赋予这样的拍子播放出来,音乐就成了。
好了 我们看看如何将简谱翻译成对应频率和拍子。
以葫芦娃为例:



先看下左上角1=D这里,用的是D调,好那我们就看《音符频率表》中的D行(红色部分)

第一个音符是1 但上面有个点,所以对应的就是589,时间是一拍=1。
第二个音符6(没有点)就是495,时间也是一拍=1。
第三个音符5 即441,因为有下划线所以是半拍=0.5。
以此类推
第四0这里要注意下,这里是没有声音,但是要是用频率0表示还是会有声音,所以我们用一个很高频率的声音,这样人耳听不到就达到了没有声音的效果,所以频率为-1,拍子=1拍。
第五,再接着看到第一句歌词葫芦娃 这个娃的音是3—,这表示是两拍,后面每加一个“-”,表示拍子+1(1+1),本例中最多是加到4。
第六,第二句歌词葫芦娃这个娃,3•带个点,点的意思是去3的拍子的一半,即3•的拍子是1+0.5。
第七,大家可能会问那弧线怎么表示,这在音乐中属于连音,我们要表示的话,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,但操作上更复杂了,本例没有做连音的处理,大家有兴趣可以自己调整下。
所以说了一大堆,规律就是时间上单个音符没有下划线,就是一拍(1),有下划线是半拍(0.5),两个下划线是四分之一拍(0.25),有“—”=前面音符的拍子+1;频率上就是按照音符是否带点,点在上还是在下到表中查找就可以了。
至此原理清楚,随便拿个简谱来我们都可以翻译成代码了。

好,下面进入代码部分,来看下这首《葫芦娃》的代码:

#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556
#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278
#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112
//以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写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_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,
  NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,
  NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6,
  NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,
  
  NOTE_D1,NOTE_D1,NOTE_D3,
  NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,
  NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
  NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
  NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
  NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
  NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,
  NOTE_D5,
  NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
  NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
  NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
  NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
  NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,
  NOTE_D1,
  NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
  NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
  NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,
  NOTE_D6,
};//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数
float duration[]=
{
  1,1,0.5,0.5,1,
  0.5,0.5,0.5,0.5,1,0.5,0.5,
  0.5,1,0.5,1,0.5,0.5,
  0.5,0.5,0.5,0.5,1,1,
  
  1,1,1+1,
  0.5,1,1+0.5,1,
  1,1,0.5,0.5,1,
  0.5,1,1+0.5,1,
  0.5,0.5,0.5,0.5,1+1,
  0.5,1,1+0.5,1,
  1+1,0.5,0.5,1,
  1+1+1+1,
  0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
  0.5,1,0.5,1,1,
  0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
  0.5,1,0.5,1,1,
  1+1,0.5,0.5,1,
  1+1+1+1,
  0.5,1,0.5,1+1,
  0.5,1,0.5,1+1,
  1+1,0.5,0.5,1,
  1+1+1+1
};//这部分是整首曲子的接拍部分,也定义个序列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秒后,循环重新开始
}



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(6)
Youyou
Youyou
挺不错的样子,明天把代码放在智能水杯上面试试看:lol
qq815076543322
qq815076543322
作者
回复Youyou
想法和不错哦
qq815076543322
qq815076543322
作者
回复Youyou
这想法很不错哦,您可以尝试尝试
共4条回复,已加载2条,点击查看更多共4条回复,已加载全部
Grey
Grey
这个可以收藏一下
qq815076543322
qq815076543322
作者
回复Grey
也制作制作
qq815076543322
qq815076543322
作者
您也可以做做 给点改进的建议,可以让他更完善
hnyzcj
hnyzcj
qq815076543322
qq815076543322
作者
回复hnyzcj
这样就可以当做播放器了
hnyzcj
hnyzcj
不过用MP3 MINI , 更省事。
hnyzcj
hnyzcj
顶一个,支持下林老师。
qq815076543322
qq815076543322
作者
回复hnyzcj
谢谢啦@互相学习
- 没有更多了 -