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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14870|回复: 6

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

[复制链接]
发表于 2016-4-26 14:14 | 显示全部楼层 |阅读模式
本帖最后由 Mitsuka 于 2016-4-29 15:27 编辑

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

void withdot(int x)
{
  durac[x];
  dura[x+1];
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);
}[/mw_shl_code]


参考乐谱: Hong Eight-One.jpg




发表于 2017-1-23 10:28 | 显示全部楼层
请问这个和乐谱是怎么联系起来的?为啥你这没有波特率?
 楼主| 发表于 2017-2-5 09:57 | 显示全部楼层
renjianyu 发表于 2017-1-23 10:28
请问这个和乐谱是怎么联系起来的?为啥你这没有波特率?

函数dura内的dura[]数组和函数durac内的durac[]数组就是每个音符的时值,001行声明的全局变量bpm应该就是你说的波特率
发表于 2017-2-5 16:11 | 显示全部楼层
Mitsuka 发表于 2017-2-5 09:57
函数dura内的dura[]数组和函数durac内的durac[]数组就是每个音符的时值,001行声明的全局变量bpm应该就是 ...

音符的时值是怎么确定的呀?
 楼主| 发表于 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;……

这样解释可以吗?
发表于 2017-2-12 09:13 | 显示全部楼层
Mitsuka 发表于 2017-2-7 03:38
以本曲谱为例:
开头定义了bpm=220,即每分钟220拍,OK?

嗯嗯,谢谢
发表于 2018-6-12 21:11 | 显示全部楼层
有没有效果视频啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:46 , Processed in 0.124138 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表