查看: 5310|回复: 3

【单音MIDI音乐】两种代码解决方案

[复制链接]

该用户从未签到

发表于 2016-4-27 18:07 | 显示全部楼层 |阅读模式
本帖最后由 Mitsuka 于 2016-4-29 15:28 编辑

考虑到各位对代码的复杂度,所以特意推出两种解决方案:源代码地址:http://www.arduino.cn/thread-20602-1-1.html
(1)第一种方案:和原来一样,把所有函数在程序前面都预先定义好,然后再写谱,如:

[mw_shl_code=cpp,true]const float bpm = 192; //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 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()
{
// whole = 1;
// half = 2;
// quarter = 3;
// eighth = 4;
// sixteenth = 5;
// thirtysecond = 6;
// sixtyforth = 7;
}

void loop()
{
  do_ut(8,4); dura(3);
  do_ut(8,4); dura(3);
  sol(8,4);   dura(3);
  sol(8,4);   dura(3);  
  la(8,4);    dura(3);
  la(8,4);    dura(3);  
  sol(8,4);   dura(2);

  fa(8,4);    dura(3);
  fa(8,4);    dura(3);
  mi(8,4);    dura(3);
  mi(8,4);    dura(3);
  re(8,4);    dura(3);
  re(8,4);    dura(3);
  do_ut(8,4); dura(2);

  sol(8,4);   dura(3);
  sol(8,4);   dura(3);
  fa(8,4);    dura(3);
  fa(8,4);    dura(3);
  mi(8,4);    dura(3);
  mi(8,4);    dura(3);
  re(8,4);    dura(2);

  sol(8,4);   dura(3);
  sol(8,4);   dura(3);
  fa(8,4);    dura(3);
  fa(8,4);    dura(3);
  mi(8,4);    dura(3);
  mi(8,4);    dura(3);
  re(8,4);    dura(2);

  do_ut(8,4); dura(3);
  do_ut(8,4); dura(3);
  sol(8,4);   dura(3);
  sol(8,4);   dura(3);  
  la(8,4);    dura(3);
  la(8,4);    dura(3);  
  sol(8,4);   dura(2);

  fa(8,4);    dura(3);
  fa(8,4);    dura(3);
  mi(8,4);    dura(3);
  mi(8,4);    dura(3);
  re(8,4);    dura(3);
  re(8,4);    dura(3);
  do_ut(8,4); dura(2);
  rest(8);
  delay(50);
}[/mw_shl_code]


(2)第二种方案:做成库文件,然后自行调用:
在教程的帮助下,我把程序的所有函数都做成库文件: Scale.zip (3.91 KB, 下载次数: 29)

该用户从未签到

发表于 2016-6-5 23:02 | 显示全部楼层
Scale scale(pin,12)和之前的tone(pin,int)有什么区别?

该用户从未签到

 楼主| 发表于 2016-6-7 06:24 | 显示全部楼层
suoma 发表于 2016-6-5 23:02
Scale scale(pin,12)和之前的tone(pin,int)有什么区别?

你好,我的朋友。
很抱歉,由于学业原因,我未能及时回复你的信息,敬请原谅。
对于你的问题的解释是这样:
库文件中的“Scale::Scale(int pin, int bpm)”的两个参数,一个是确定输出pin口,另外一个是定义整首歌曲的bpm,即每分钟的节拍数。
而tone(pin, int)的两个参数,一个是确定输出pin口,另外一个是确定输出的声音频率。
如果是这样的话可以理解吗?
(实话:由于我近期都没进行Arduino的开发,对于我之前做的这个库文件也不太清楚了,本人记性不太好,请原谅m(_ _)m)

该用户从未签到

发表于 2016-6-8 00:00 | 显示全部楼层
Mitsuka 发表于 2016-6-7 06:24
你好,我的朋友。
很抱歉,由于学业原因,我未能及时回复你的信息,敬请原谅。
对于你的问题的解释是这样 ...

感觉挺像的,理解了,谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

arduino pid麦克纳姆轮小车程序详解
arduino pid麦克纳姆轮小
之前发过几个帖子,大家可以参考,但经过多次尝试,整套系统升级了,优化了很多地方目录:
【原创】全球最小口袋3D打印机mini one直播教程贴
【原创】全球最小口袋3D打
最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
这个库文件要怎么下载
这个库文件要怎么下载
新手求助大佬,跪谢
请问arduino怎么和耳机座连接
请问arduino怎么和耳机座
用的是uno r3
设备一个都没有但显示独立设备已使用2个
设备一个都没有但显示独立
我的点灯APP账号里怎么显示独立设备已经使用了2个,但我设备一个没有啊,接入也是0,

让社区更精彩

  • 反馈建议:service_media@36kr.com
  • 工作时间:周一到周五 10:00-19:00
400-995-3636

官方微信

Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   

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