【新人制作】单音MIDI音乐程序,只要有谱什么歌都能写 ~-Arduino中文社区 - Powered by Discuz! Archiver

Mitsuka 发表于 2017-2-7 03:29

suoma 发表于 2016-6-5 21:44
你的蜂鸣器不刺耳吗?我是接电阻消噪声了

还可以,我用的是生日贺卡的那种蜂鸣器

jackten 发表于 2017-2-7 09:35

楼主好厉害啊,,,,

Mitsuka 发表于 2017-2-8 17:21

jackten 发表于 2017-2-7 09:35
楼主好厉害啊,,,,

这只是我把《Anduino CookBook》(就是Anduino Toolkit里的初学者参考书)里面的一个项目做了一次魔改出来的,网上也有和我差不多的项目,但是自己看别人写的代码不太容易理解所以就自己做一个,你们能够理解的话就好,不能理解的代码我随时可以为你解答。(- w -) ♪~

MACE 发表于 2017-2-17 17:11

谢谢楼主,学习了:)

rockze 发表于 2017-2-17 23:30

不错啊,进来学习了,谢谢共享

四年级 发表于 2017-3-6 19:13

我自己曾经做过一个点歌机

zzthouzi 发表于 2017-3-10 13:09

我的为什么不出声?

OnlyCode 发表于 2017-3-13 22:56

我知道和弦咋弄

大云 发表于 2017-5-22 20:44

楼主真厉害!哈哈哈

四年级 发表于 2017-5-23 21:37

看#define NOTE_0-1

#define NOTE_A1 441
#define NOTE_A2 495
#define NOTE_A3 556
#define NOTE_A4 589
#define NOTE_A5 661
#define NOTE_A6 742
#define NOTE_A7 833

#define NOTE_AL1 221
#define NOTE_AL2 248
#define NOTE_AL3 278
#define NOTE_AL4 294
#define NOTE_AL5 330
#define NOTE_AL6 371
#define NOTE_AL7 416

#define NOTE_AH1 882
#define NOTE_AH2 990
#define NOTE_AH3 1112
#define NOTE_AH4 1178
#define NOTE_AH5 1322
#define NOTE_AH6 1484
#define NOTE_AH7 1665


#define NOTE_B1 495
#define NOTE_B2 556
#define NOTE_B3 589
#define NOTE_B4 661
#define NOTE_B5 742
#define NOTE_B6 833
#define NOTE_B7 935

#define NOTE_BL1 248
#define NOTE_BL2 278
#define NOTE_BL3 294
#define NOTE_BL4 330
#define NOTE_BL5 371
#define NOTE_BL6 416
#define NOTE_BL7 467

#define NOTE_BH1 990
#define NOTE_BH2 1112
#define NOTE_BH3 1178
#define NOTE_BH4 1322
#define NOTE_BH5 1484
#define NOTE_BH6 1665
#define NOTE_BH7 1869


#define NOTE_C1 262
#define NOTE_C2 294
#define NOTE_C3 330
#define NOTE_C4 350
#define NOTE_C5 393
#define NOTE_C6 441
#define NOTE_C7 495

#define NOTE_CL1 131
#define NOTE_CL2 147
#define NOTE_CL3 165
#define NOTE_CL4 175
#define NOTE_CL5 196
#define NOTE_CL6 221
#define NOTE_CL7 248

#define NOTE_CH1 525
#define NOTE_CH2 589
#define NOTE_CH3 661
#define NOTE_CH4 700
#define NOTE_CH5 786
#define NOTE_CH6 882
#define NOTE_CH7 990


#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 1112


#define NOTE_E1 330
#define NOTE_E2 350
#define NOTE_E3 393
#define NOTE_E4 441
#define NOTE_E5 495
#define NOTE_E6 556
#define NOTE_E7 624

#define NOTE_EL1 165
#define NOTE_EL2 175
#define NOTE_EL3 196
#define NOTE_EL4 221
#define NOTE_EL5 248
#define NOTE_EL6 278
#define NOTE_EL7 312

#define NOTE_EH1 661
#define NOTE_EH2 700
#define NOTE_EH3 786
#define NOTE_EH4 882
#define NOTE_EH5 990
#define NOTE_EH6 1112
#define NOTE_EH7 1248


#define NOTE_F1 350
#define NOTE_F2 393
#define NOTE_F3 441
#define NOTE_F4 495
#define NOTE_F5 556
#define NOTE_F6 624
#define NOTE_F7 661

#define NOTE_FL1 175
#define NOTE_FL2 196
#define NOTE_FL3 221
#define NOTE_FL4 234
#define NOTE_FL5 262
#define NOTE_FL6 294
#define NOTE_FL7 330

#define NOTE_FH1 700
#define NOTE_FH2 786
#define NOTE_FH3 882
#define NOTE_FH4 935
#define NOTE_FH5 1049
#define NOTE_FH6 1178
#define NOTE_FH7 1322


#define NOTE_G1 393
#define NOTE_G2 441
#define NOTE_G3 495
#define NOTE_G4 556
#define NOTE_G5 624
#define NOTE_G6 661
#define NOTE_G7 742

#define NOTE_GL1 196
#define NOTE_GL2 221
#define NOTE_GL3 234
#define NOTE_GL4 262
#define NOTE_GL5 294
#define NOTE_GL6 330
#define NOTE_GL7 371

#define NOTE_GH1 786
#define NOTE_GH2 882
#define NOTE_GH3 990
#define NOTE_GH4 1049
#define NOTE_GH5 1178
#define NOTE_GH6 1322
#define NOTE_GH7 1484
//以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写各种歌,我这里用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
//这部分是用英文对应了拍子,这样后面也比较好看
#define DURATION 400//每个音符持续的时间,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
int t1[] =
{
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_0,
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_0,NOTE_D6,
NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_0,NOTE_D6,
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_0,

NOTE_D1,NOTE_D1,NOTE_D3,
NOTE_D1,NOTE_D1,NOTE_D3,NOTE_0,
NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_D5,NOTE_D1,NOTE_D3,NOTE_0,
NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_D5,NOTE_D1,NOTE_D2,NOTE_0,
NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,
NOTE_D5,
NOTE_DH1,NOTE_0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_0,
NOTE_DH1,NOTE_0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_0,
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_0,NOTE_D7,NOTE_D5,
NOTE_D6
};
//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数

float d1[]=
{
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 t2[] =
{
   NOTE_CL6, NOTE_CL6, NOTE_C1, NOTE_C2,
    NOTE_C3, NOTE_C5,
   NOTE_C6, NOTE_CL6, NOTE_C1, NOTE_C2,
      NOTE_C3,
       NOTE_C2, NOTE_C2, NOTE_C2, NOTE_C3,
      NOTE_C5 , NOTE_C5, NOTE_C5, NOTE_C6,
         NOTE_C3,
         NOTE_CL6, NOTE_CL6, NOTE_C1, NOTE_C2,
    NOTE_C3, NOTE_C5,
   NOTE_C6, NOTE_CL6, NOTE_C1, NOTE_C2,
      NOTE_C3,
       NOTE_C2, NOTE_C2, NOTE_C2, NOTE_C3,
       NOTE_C5,NOTE_C5,NOTE_0,NOTE_CL5,
       NOTE_CL6
         
};
float d2[]=
{
1,1,1,1,3,1,1,1,1,1,4,1,1,1,1,1,1,1+1,4,1,1,1,1,3,1,1,1,1,1,4,1,1,1,1,1,1,1,1,4
};
//同上
int tonePin =6;//定义数字11 接口
int potpin=0;   //定义模拟接口0
int inpin =13 ;//定义数字7 接口
int val;//定义变量val
int gal=0;
int length;//这里定义一个变量,后面用来表示共有多少个音符
void setup()
{
pinMode(tonePin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
length = sizeof(t1)/sizeof(t1);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符
lcd.begin(16, 2);//初始化LCD
}
void loop()
{
while(1)
gal=analogRead(potpin);
val=digitalRead(inpin);//读取数字7 口电平值赋给val
{
if(val==HIGH)//检测按键是否按下
{
if (gal<=30)
{
for(int x=0;x<length;x++)//循环音符的次数
{
    tone(tonePin,t1);//此函数依次播放tune序列里的数组,即每个音符
    delay(400*d1);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
    noTone(tonePin);//停止当前音符,进入下一音符
    if(val==LOW) break;//加上这一句就行了
}
}
else
{
    if(gal<=60 and gal>=30)
    {
       for(int x=0;x<length;x++)//循环音符的次数
{
      tone(tonePin,t2);//此函数依次播放tune序列里的数组,即每个音符
    delay(DURATION*d2);
    noTone(tonePin);//停止当前音符,进入下一音符
    if(val==LOW) break;
    }
}
}
}
}
}



页: 1 2 [3]
查看完整版本: 【新人制作】单音MIDI音乐程序,只要有谱什么歌都能写 ~