音乐盒_C语言控制台小程序教程_第1页
音乐盒_C语言控制台小程序教程_第2页
音乐盒_C语言控制台小程序教程_第3页
音乐盒_C语言控制台小程序教程_第4页
音乐盒_C语言控制台小程序教程_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、音乐盒C语言控制台小程序教程写在前面:请各位同学按照我的思路,一步一步的走,这样能大致了解这个过程。另外,这里的代码都是不可直接复制粘贴就能运行的。所以,断了这个念头,好好的跟着学吧!不要觉得难!没有什么事情比还没有做就说自己不行、不会、不做更难的事情了!还有,千万不要半途而废!既然踏上了这条船,就把这条船开到彼岸去!一、准备写音乐盒最主要的一个函数就是Beep函数。我们来看下关于这个函数的介绍:msdn中这样描述这个函数:The Beep function generates simple tones on the speaker.意思是说这个函数在扬声器(就是电脑的喇叭)上产生一个简单的音

2、。函数原型是:第一个参数dwFreq表示的是声音的频率,单位就是赫兹hz,ps:人耳能听到的声音范围在20-20000之间第二个参数dwDuration表示的是声音的持续时间,单位是毫秒。这个函数需要包含windows.h头文件。我们可以写这样一段代码来测试这个函数的效果:#include <stdio.h>#include <windows.h>main()int i = 0;for (i = 0; i < 20000; i += 100)Beep(i, 500);上面这个程序的作用是,频率从0开始,每次加100,然后持续500毫秒,即0.5秒的时间。运行起来后

3、可以听到从低沉一直增加到尖锐的声音。二、进一步有了这个函数后,我们就可以开始写我们的【音乐盒】了!我们要做的就是把一首歌的每个音符用Beep函数发出声来。那么怎么知道歌曲每个音符的频率是多少赫兹呢?每个音符又该持续多长时间呢?这里介绍两个网站,一个是音符的音频对照网站,每种音符对应的频率是多少在这里可以查到。网址是:另一个是如何看简谱的教程,主要是要看简谱中的音符持续的是多长时间。网址是:其中,常用的音符分为低音的Do,Re,Mi,Fa,So,La,Si,在简谱中通常是数组1到7,还有中音的1到7以及高音的1到7。中音、低音、高音是如何区分的呢?通常在简谱中使用一个点来区分,例如下面这个简谱

4、其中前三个是普通的数字,后面3个1上面有1点。注意这里:普通的数字表示的中音,数字上有一点表示的是高音,而点在数字下表示的低音。因此上面的图中,就是中音6、中音6、中音5、高音1、高音1、高音1。那么持续时间如何分辨呢?在第二个网页中我们在其中可以找到【简谱如何表示音的长短】这节内容。同样,拿来举例,前三个音符持续了半拍,而后面第一个高音1持续了1拍,后两个高音1各自持续了半拍。那么1拍到底是多久?通常在简谱的左上角会有一个标识,例如其中红色圈圈部分,表示的就是1分钟有60拍,那么自然1拍就是1秒钟了。大部分歌曲一分钟大概都是120拍或者60拍,具体时间可以去查,如果查不到,那么就在程序中改时

5、间自己感觉。注意这里第二个高音1旁边的点。点在音符的“脚边”的时候,不是用来区分高低音了,这是一个“附点音符”,在第二个网页中也有相关说明:那么上面的第二个高音1持续的时间就是1个半拍加一个四分之一拍。三、动手有了频率及时间,我们就可以来写音乐盒啦!以生日快乐歌为例。通过百度查到其简谱是有些看不懂的字符我们不管他们。比方说什么C调3/4.。C G7啥的。别理他们,先把程序搞出来。#include <stdio.h>#include <windows.h>main()Beep(中音5对应的频率,半拍+四分之一拍时间);Beep(中音5,四分之一拍时间);感觉怎么样?痛苦!

6、这样写下去,每个Beep我都得查一下音符对应的频率是多少,然后填进去,再计算拍子数占用的时间,再写进去,累死了!所以我们要做些优化。既然每种音符对应的频率是固定的,那么我们可以用宏来做。这样,我们在填参数的时候,就不需要再去翻网页啦!Beep(MID_5, 时间);是不是省了很多事!那么持续时间,我们同样可以用宏来做!前面提到,一般拍子数都是1分钟120拍或者60拍,1分钟120拍的话,每拍就是60/120为0.5秒,即500毫秒,1分钟60拍的话,每拍就是1000毫秒。那么我们可以写两个宏分别用来计算x拍所持续时间:那么上面生日快乐歌,我们就可以这样来写了:Beep(MID_5, BEAT_

7、120(0.5) + BEAT_120(0.25);以此类推下去。是不是已经优化了很多了呢!我们还能继续优化!四、深入在前面的教程中,我们是使用很多个Beep函数调用来发出每个音符的声音。可是一首歌这样写下来也很麻烦,我们再来优化一下:因为Beep函数的参数形式是一样的,我们做了这么多的重复工作,这样的情况下,我们就自然想到了循环这个东西,我们把每个音符的频率和时间放到数组里,然后循环去调用Beep函数。但是频率和时间怎么放到数组里呢?部分同学应该会想到用二维数组,例如这样:int arr1002 = MID_5, BEAT_120(0.5) + BEAT(0.25), / 这里这样分开写是为

8、了区分附点音符,你写熟练了也可以直接写BEAT_120(0.75)MID_5, BEAT_120(0.25),; / 数组个数根据音符个数确定然后使用循环:for (i = 0; i < 100; i+)Beep(arri0, arri1);到这里就结束了吗?当然不!我们有更好的方式来处理!结构体!每个音符我们看作是一个整体,其中包含频率及持续时间两个成员,后面我们还可以扩展歌词进来。那么我们来定义这样一个结构体:这样,我们就可以定义个结构体数组sound s_happy_birthday_to_you = MID_5, BEAT_120(0.5) + BEAT_120(0.25),;注

9、意,这里我没有写数组的元素个数。那么循环中怎么知道有多少个音符要发声呢?再注意!在这里有个方法可以求这样的数组元素个数,那就是:sizeof(数组名) / sizeof(数组类型)对应这里就是sizeof(s_happy_birthday_to_you) / sizeof(sound)记住这样的用法!那么我们的程序就可以再优化为/*头文件包含*/*main函数*/main()sound s_happy_birthday_to_you = ; /*直接根据简谱初始化音符数组,此处略去*/int i, len;len = sizeof(s_happy_birthday_to_you) / size

10、of(sound);for (i = 0; i < len; i+)Beep(s_happy_birthday_to_you i.n_frequence, s_happy_birthday_to_you i.n_duration);再再注意!这里的循环调用我们只能对这一首歌用,因为循环体内调用Beep写的参数是s_happybirthday。如果想要初始化了多首歌,然后一个循环来解决,如何做呢?函数!将循环体封转到函数里!在写函数之前,相信大家对歌词的功能也很感兴趣,其实就是在结构体中加一个成员,就一个字符数组,然后初始化结构体数组时,把对应音符下面的歌词一并写上。像这样:sound s

11、_happy_birthday_to_you = MID_5, BEAT_120(0.5) + BEAT_120(0.25), “祝”,;调用的话就是这样,我们就可以放很多的歌,想听哪首,就直接调用这个函数,传递歌的结构体数组名及其长度。五、总结以上,讲解了C语言控制台小程音乐盒的制作。以上代码均需要个人去完善,并不能直接拷贝粘贴就能使用!而且将简谱转化为音符结构体数组是一个漫长的过程,千万不要怕麻烦!当你的音乐盒响起你亲手一个一个录入的音符的时候,那会是很幸福的事情!小结一下:本程序中涉及到的知识点有:变量定义、宏定义、数组相关、函数相关、结构体相关,就差指针和文件,就能把整个C语言的大概都

12、涵盖进来了,当然后续也是可以这样做的!嗯,我们还学到了一点音乐知识哈!当把这个程序做出来时,还觉得C语言是那么的枯燥?无趣?这还只是一个小小的系统函数所衍生出来的应用,还有更多有趣的功能等着你们去发掘!希望看到这里的同学是真的一步一步看下来的,这里附上一个生日快乐歌的完整源码吧。里面的结构体定义和宏可以拿去用的噢!#include <stdio.h>#include <windows.h>typedef struct _soundint n_frequence;int n_duration;char text16;sound;#define LOW_1262#defin

13、e LOW_2294#define LOW_3330#define LOW_4349#define LOW_5392#define LOW_6440#define LOW_7494#define MID_1523#define MID_2578#define MID_3659#define MID_4698#define MID_5784#define MID_6880#define MID_7988#define HIGH_11046#define HIGH_21175#define HIGH_31318#define HIGH_41397#define HIGH_51568#define

14、HIGH_61760#define HIGH_71976#define BEAT_120(x) (int)(x * 500)#define BEAT_60(x) (int)(x * 1000)void play_sound(sound s, int n_len)int i = 0;for (i = 0; i < n_len; i+)if (strlen(si.text) != 0)printf("%s", si.text);Beep(si.n_frequence, si.n_duration);main()sound s_happy_birthday_to_you =

15、 MID_5, BEAT_120(0.5) + BEAT_120(0.25), "祝", MID_5, BEAT_120(0.25), "你", MID_6, BEAT_120(1), "生",MID_5, BEAT_120(1), "日",HIGH_1, BEAT_120(1), "快",MID_7, BEAT_120(2), "乐n", MID_5, BEAT_120(0.5) + BEAT_120(0.25), "祝",MID_5, BEAT_120

16、(0.25), "你",MID_6, BEAT_120(1), "生",MID_5, BEAT_120(1), "日",HIGH_2, BEAT_120(1), "快", HIGH_1, BEAT_120(2), "乐n",MID_5, BEAT_120(0.5) + BEAT_120(0.25), "祝",MID_5, BEAT_120(0.25), "你", HIGH_5, BEAT_120(1), "生",HIGH_3, BEAT_120(1), "日", HIGH_1, BEAT_120(1), "快", MID_7, BEAT_120(1), "乐n", MID_6, BEAT_120(1),HIGH_4, BEAT_120(0.5) + BEAT_120(0.25), "祝",HIG

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论