【新人制作】自制MIDI乐谱 - 九九八十一-Arduino中文社区 - Powered by Discuz! Archiver

Mitsuka 发表于 2016-4-26 14:14

【新人制作】自制MIDI乐谱 - 九九八十一

本帖最后由 Mitsuka 于 2016-4-29 15:27 编辑

昨天写的帖子,今天发布。然后继续放上一部鄙人的拙作:九九八十一。这首歌确实不错,节奏感很强,乐风和权御天下神似(作者一样的怎么不可能一样!)。程序源代码:http://www.arduino.cn/thread-20602-1-1.html
前奏和间奏没做出来,而且没用做成库文件,因为....懒....~~希望有越来越多的乐曲能够然我改编哟~~
附上参考乐谱,部分内容经过艺(xiao)术(fu)加(gai)工(dong):
const float bpm = 220; //bpm = beats per min, changable

void dura(int x)
{ int dura[] = {240000/bpm,120000/bpm,60000/bpm,30000/bpm,15000/bpm,7500/bpm,3750/bpm};
delay(dura);
rest(8);
delay(50);
}

void durac(int x)
{ int durac[] = {240000/bpm,120000/bpm,60000/bpm,30000/bpm,15000/bpm,7500/bpm,3750/bpm};
delay(durac);
}

void withdot(int x)
{
durac;
dura;
}

void do_ut(int pin,int x)
{ int C[] = {33,65,131,262,523,1047,2093};
tone(pin,C);}

void do_up(int pin,int x)
{ int CU[] = {35,69,139,277,554,1109,2217};
tone(pin,CU);}

void re_dw(int pin,int x)
{ int DD[] = {35,69,139,277,554,1109,2217};
tone(pin,DD);}

void re(int pin,int x)
{ int D[] = {37,73,147,294,587,1175,2349};
tone(pin,D);}

void re_up(int pin,int x)
{ int DU[] = {39,78,156,311,622,1245,2489};
tone(pin,DU);}

void mi_dw(int pin,int x)
{ int ED[] = {39,78,156,311,622,1245,2489};
tone(pin,ED);}

void mi(int pin,int x)
{ int E[] = {41,82,165,330,659,1319,2637};
tone(pin,E);}

void fa(int pin,int x)
{ int F[] = {44,87,175,349,698,1397,2794};
tone(pin,F);}

void fa_up(int pin,int x)
{ int FU[] = {46,93,185,370,740,1480,2960};
tone(pin,FU);}

void sol_dw(int pin,int x)
{ int GD[] = {46,93,185,370,740,1480,2960};
tone(pin,GD);}

void sol(int pin,int x)
{ int G[] = {49,98,196,392,784,1568,3136};
tone(pin,G);}

void sol_up(int pin,int x)
{ int GU[] = {52,104,208,415,831,1661,3322};
tone(pin,GU);}

void la_dw(int pin,int x)
{ int AD[] = {52,104,208,415,831,1661,3322};
tone(pin,AD);}

void la(int pin,int x)
{ int A[] = {55,110,220,440,880,1760,3520};
tone(pin,A);}

void la_up(int pin,int x)
{ int AU[] = {58,117,233,466,932,1865,3729};
tone(pin,AU);}

void si_dw(int pin,int x)
{ int BD[] = {58,117,233,466,932,1865,3729};
tone(pin,BD);}

void si(int pin,int x)
{ int B[] = {62,123,247,494,988,1976,3951};
tone(pin,B);}

void rest(int pin)
{
tone(pin, 0);
}

void setup()
{
/* Attention:
* whole = 1;
* half = 2;
* quarter = 3;
* eighth = 4;
* sixteenth = 5;
* thirtysecond = 6;
* sixtyforth = 7;
*/
}

void loop()
{
int pin = 13;
   
/* Here's an example:
* do_ut(pin,4); dura(3);
* do_ut(pin,4); dura(3);
* sol(pin,4);   dura(3);
* sol(pin,4);   dura(3);
* la(pin,4);    dura(3);
* la(pin,4);    dura(3);
* sol(pin,4);   dura(2);
* rest(pin);
* delay(50);
*/

la(pin,4);    dura(4);
rest(pin);    dura(4);
la(pin,4);    dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
sol(pin,4);   dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);

rest(pin);    dura(3);
la(pin,4);    dura(4);
rest(pin);    dura(4);
la(pin,4);    dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(4);
mi(pin,4);    dura(4);
sol(pin,4);   dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

mi(pin,4);    dura(4);
re(pin,4);    dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);
rest(pin);    dura(4);
sol(pin,3);   dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);

rest(pin);    dura(3);
la(pin,4);    dura(4);
rest(pin);    dura(4);
la(pin,4);    dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
sol(pin,4);   dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);

rest(pin);    dura(3);
la(pin,4);    dura(4);
rest(pin);    dura(4);
la(pin,4);    dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(4);
mi(pin,4);    dura(4);
sol(pin,4);   dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(3);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

mi(pin,4);    dura(4);
re(pin,4);    dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);
rest(pin);    dura(4);
sol(pin,3);   dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);

rest(pin);    dura(3);
do_ut(pin,4); dura(3); withdot(3);
si(pin,3);    dura(3); withdot(3);
la(pin,3);    dura(3);

la(pin,3);    dura(4);
sol(pin,3);   dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);
rest(pin);    dura(4);
sol(pin,3);   dura(4);
la(pin,3);    dura(3);

la(pin,3);    dura(4);
sol(pin,3);   dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);
sol(pin,3);   dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(4);
sol(pin,3);   dura(4);

rest(pin);    dura(4);                  // Here has a little different!
la(pin,3);    dura(4);
sol(pin,3);   dura(4);
rest(pin);    dura(4);
la(pin,3);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
re(pin,4);    dura(4);withdot(4);

mi(pin,4);    dura(4);               // To HERE!
re(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
mi(pin,4);    durac(4);

mi(pin,4);    dura(2);
rest(pin);    dura(3);
mi(pin,3);    dura(4);
sol(pin,3);   dura(4);

la(pin,3);    dura(3);withdot(3);
sol(pin,3);   dura(3);withdot(3);
mi(pin,4);    dura(4);withdot(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(4);

mi(pin,4);    dura(4);
sol(pin,4);   dura(4);
la(pin,4);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
mi(pin,4);    dura(3);withdot(3);
la(pin,3);    dura(4);withdot(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
mi(pin,4);    dura(3);withdot(3);
sol(pin,4);   dura(4);withdot(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
la(pin,3);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
mi(pin,4);    dura(4);withdot(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(4);

mi(pin,4);    dura(4);
sol(pin,4);   dura(4);
la(pin,4);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
re(pin,4);    dura(4);withdot(4);
re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
re(pin,4);    dura(4);withdot(4);

re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
la(pin,3);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
mi(pin,4);    dura(4);withdot(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(4);

mi(pin,4);    dura(4);
sol(pin,4);   dura(4);
la(pin,4);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
mi(pin,4);    dura(3);withdot(3);
la(pin,3);    dura(4);withdot(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
mi(pin,4);    dura(3);withdot(3);
sol(pin,4);   dura(4);withdot(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
la(pin,3);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
mi(pin,4);    dura(4);withdot(4);
rest(pin);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(4);

mi(pin,4);    dura(4);
sol(pin,4);   dura(4);
la(pin,4);    dura(4);
mi(pin,4);    dura(4);
rest(pin);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);

re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
re(pin,4);    dura(4);withdot(4);
re(pin,4);    dura(3);withdot(3);
do_ut(pin,4); dura(3);withdot(3);
re(pin,4);    dura(4);withdot(4);

re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
re(pin,4);    dura(4);
mi(pin,4);    dura(4);
re(pin,4);    dura(4);
do_ut(pin,4); dura(4);
do_ut(pin,4); dura(4);
sol(pin,3);   dura(4);

sol(pin,3);   durac(4);
la(pin,3);    dura(1);

rest(8);
delay(1000);
}


参考乐谱:




renjianyu 发表于 2017-1-23 10:28

请问这个和乐谱是怎么联系起来的?为啥你这没有波特率?

Mitsuka 发表于 2017-2-5 09:57

renjianyu 发表于 2017-1-23 10:28
请问这个和乐谱是怎么联系起来的?为啥你这没有波特率?

函数dura内的dura[]数组和函数durac内的durac[]数组就是每个音符的时值,001行声明的全局变量bpm应该就是你说的波特率

renjianyu 发表于 2017-2-5 16:11

Mitsuka 发表于 2017-2-5 09:57
函数dura内的dura[]数组和函数durac内的durac[]数组就是每个音符的时值,001行声明的全局变量bpm应该就是 ...

音符的时值是怎么确定的呀?

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

renjianyu 发表于 2017-2-5 16:11
音符的时值是怎么确定的呀?

以本曲谱为例:
开头定义了bpm=220,即每分钟220拍,OK?

接着定义函数dura[]作为音符时值,分别是:全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符的时值。

以四分音符为例,四分音符的时值为1拍,对吧。假设1分钟(60000毫秒)内全是四分音符,则在本曲谱中,1拍的时值为(60000/bpm)毫秒,即四分音符=1拍=(60000/bpm),这就是数组dura[]中第三个数。

以此类推:
全音符是四分音符的4倍,则:4×60000/bpm=240000/bpm;
二分音符是四分音符的2倍,则:2×60000/bpm=120000/bpm;
八分音符是四分音符的1/2,则:1/2×60000/bpm=30000/bpm;……

这样解释可以吗?

renjianyu 发表于 2017-2-12 09:13

Mitsuka 发表于 2017-2-7 03:38
以本曲谱为例:
开头定义了bpm=220,即每分钟220拍,OK?



嗯嗯,谢谢

晴天是什么样子 发表于 2018-6-12 21:11

有没有效果视频啊
页: [1]
查看完整版本: 【新人制作】自制MIDI乐谱 - 九九八十一