音乐盒_C语言控制台小程序教程.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《音乐盒》C语言控制台小程序教程写在前面:请各位同学按照我的思路,一步一步的走,这样能大致了解这个过程。另外,这里的代码都是不可直接复制粘贴就能运行的。。。所以,断了这个念头,好好的跟着学吧!不要觉得难!没有什么事情比还没有做就说自己不行、不会、不做更难的事情了!还有,千万不要半途而废!既然踏上了这条船,就把这条船开到彼岸去!一、准备写音乐盒最主要的一个函数就是Beep函数。我们来看下关于这个函数的介绍:msdn中这样描述这个函数:The Beep function generates simple tones on the speaker.意思是说这个函数在扬声器(就是电脑的喇叭)上产生一个简单的音。函数原型是:第一个参数dwFreq表示的是声音的频率,单位就是赫兹hz,ps:人耳能听到的声音范围在20-20000之间第二个参数dwDuration表示的是声音的持续时间,单位是毫秒。这个函数需要包含windows.h头文件。我们可以写这样一段代码来测试这个函数的效果:#include stdio.h#include windows.hmain(){int i = 0;for (i = 0; i 20000; i += 100){Beep(i, 500);}}上面这个程序的作用是,频率从0开始,每次加100,然后持续500毫秒,即0.5秒的时间。运行起来后可以听到从低沉一直增加到尖锐的声音。二、进一步有了这个函数后,我们就可以开始写我们的【音乐盒】了!我们要做的就是把一首歌的每个音符用Beep函数发出声来。那么怎么知道歌曲每个音符的频率是多少赫兹呢?每个音符又该持续多长时间呢?这里介绍两个网站,一个是音符的音频对照网站,每种音符对应的频率是多少在这里可以查到。网址是:/blog/static/114147985201122624025880/。另一个是如何看简谱的教程,主要是要看简谱中的音符持续的是多长时间。网址是:/article/0bc808fc9f0cf61bd485b9cf.html。其中,常用的音符分为低音的Do,Re,Mi,Fa,So,La,Si,在简谱中通常是数组1到7,还有中音的1到7以及高音的1到7。中音、低音、高音是如何区分的呢?通常在简谱中使用一个点来区分,例如下面这个简谱其中前三个是普通的数字,后面3个1上面有1点。注意这里:普通的数字表示的中音,数字上有一点表示的是高音,而点在数字下表示的低音。因此上面的图中,就是中音6、中音6、中音5、高音1、高音1、高音1。那么持续时间如何分辨呢?在第二个网页中我们在其中可以找到【简谱如何表示音的长短】这节内容。同样,拿来举例,前三个音符持续了半拍,而后面第一个高音1持续了1拍,后两个高音1各自持续了半拍。那么1拍到底是多久?通常在简谱的左上角会有一个标识,例如其中红色圈圈部分,表示的就是1分钟有60拍,那么自然1拍就是1秒钟了。大部分歌曲一分钟大概都是120拍或者60拍,具体时间可以去查,如果查不到,那么就在程序中改时间自己感觉。注意这里第二个高音1旁边的点。点在音符的“脚边”的时候,不是用来区分高低音了,这是一个“附点音符”,在第二个网页中也有相关说明:那么上面的第二个高音1持续的时间就是1个半拍加一个四分之一拍。三、动手有了频率及时间,我们就可以来写音乐盒啦!以《生日快乐》歌为例。通过百度查到其简谱是有些看不懂的字符我们不管他们。。比方说什么C调3/4.。C G7啥的。。别理他们,先把程序搞出来。#include stdio.h#include windows.hmain(){Beep(中音5对应的频率,半拍+四分之一拍时间);Beep(中音5,四分之一拍时间);…}感觉怎么样?痛苦!这样写下去,每个Beep我都得查一下音符对应的频率是多少,然后填进去,再计算拍子数占用的时间,再写进去,累死了!!所以我们要做些优化。既然每种音符对应的频率是固定的,那么我们可以用宏来做。这样,我们在填参数的时候,就不需要再去翻网页啦!Beep(MID_5, 时间);是不是省了很多事!那么持续时间,我们同样可以用宏来做!前面提到,一般拍子数都是1分钟120拍或者60拍,1分钟120拍的话,每拍就是60/120为0.5秒,即500毫秒,1分钟60拍的话,每拍就是1000毫秒。那么我们可以写两个宏分别用来计算x拍所持续时间:那么上面生日快乐歌,我们就可以这样来写了:Beep(MID_5, BEAT_120(0.5) + BEAT_120(0.25));以此类推下去。是不是已经优化了很多了呢!我们还能继续优化!四、深入在前面的教程中,我们是使用很多个Beep函数调用来发出每个音符的声音。可是一首歌这样写下来也很麻烦,我们再来优化一下:因为Beep函数的参数形式是一样的,我们做了这么

文档评论(0)

wyjy + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档