用Beep()函数来实现c语言编写歌曲

用Beep()函数来实现c语言编写歌曲

Beep()函数是一个可以控制扬声器发出提示音的函数,包含在windows.h内.实际上,所有用到Sleep()函数的地方,都可以用这个,待后面细细说来。

要准备什么?

  1. 一首歌的所有音符所对应的音高,音值。
  2. 将这些信息转换为音符频率,持续时间

怎样做?

  1. 首先,让我们知道,什么是音

  音是由于物体的震动而产生的.在自然界中能为我们人的听觉所感受的音是非常多的,但并不是所有的音都可以作为音乐的材料.在音乐中所使用的音,是人们在长期的生产斗争和阶级斗争中为了表现自己的生活和思想感情而特意挑选出来的.这些音被组成为一个固定的体系,用来表现音乐思想和塑造音乐形象.
  音有高低,强弱,长短,音色等四种性质.
  音的高低是由于物体在一定时间内振动次数(频率)而决定的.振动的次数多,音则高;振动次数少,音则低.
  音的长短是由于音的延续时间的不同而决定的.音的延续时间长,音则长;音的延续时间短,音则短.
  音的强弱是由于振幅(音的振动范围的幅度)的大小而决定的.振幅大,音则强;振幅小,音则弱.
  音色则由于发音体的性质,形状及其泛音的多少等而不同.
  音的以上四种性质,在音乐表现中都是非常重要的,但音的高低和长短则具有更为重大的意义.试以《社会主义好》这首歌为例,不管你用人声来演唱或用乐器来演奏,用小声唱或是大声唱,虽然音的强弱以音色都有了变化,仍然很容易辨认出这支旋律.但是,假如将这首歌的音高或音值加以改变的话,则音乐形象就会立即受到严重的破坏.因此,不管创作也好,演奏演唱也好,对音高和音值应加以特别的注意.
      -->>引用自《音乐理论基础》李重光编,第1页

  1. 在上面提到的四种性质中,无可置疑,最重要的是音高和音值,这正是Beep函数的两个参数.
  2. 准备曲谱,这里我不会做赘述,这个是与编程本身相差甚远的知识面,需要扒谱的基础.

  扒谱可以获取音高,bpm,演奏节拍的学习的信息,学起来也不难,这里推荐,b站善哉君的金坷垃制作技术的P2,P3的一些内容.

  1. 转为机器可以看懂的程序.
#include
#include

#define K 0//这个频率0,就是不响,作为空拍 

//以下的所有表示音符的符号均来自fl studio 14 的fl keys的标注,或许和一般钢琴的标注不一样 。 
//只有三个八度的音高频率 ,因为一般人声可以达到的频率大概都会落在这些里面 
#define C4 523
#define C#4 554
#define D4 588
#define D#4 623
#define E4 660
#define F4 700
#define F#4 742
#define G4 786
#define G#4 833
#define A4 884
#define A#4 936
#define B4 992

#define C5 1046
#define C#5 1108
#define D5 1176
#define D#5 1246
#define E5 1320
#define F5 1400
#define F#5 1484
#define G5 1572
#define G#5 1666
#define A5 1768
#define A#5 1872
#define B5 1984

#define C6 2092
#define C#6 2216
#define D6 2352
#define D#6 2492
#define E6 2640
#define F6 2800
#define F#6 2968
#define G6 3144
#define G#6 3332
#define A6 3536
#define A#6 3744
#define B6 3968
#define P 125   //折合bpm==120,原bpm为105,此处取了个近似值 

typedef struct
{
	int frequency;
	int duration;
}PU;
	//以下谱子,正是《社会主义好》的一段 
PU t[]={B5,1,B5,2,B5,1,D6,2,B5,5,A5,2,G5,1,E5,2,G5,1,A5,2,B5,2,K,5,B5,1,B5,2,B5,1,D6,2,E6,4,D6,3,E5,1
,E5,2,E5,1,G5,2,A5,2,K,5,B5,3,A5,1,G5,3,G5,2,E5,1,D5,3,B5,2,D6,1,B5,2,A5,1,G5,2,A5,1,G5,2,A5,2,B5,3,E5,
3,G5,1,D5,2,K,5,B5,2,D6,1,B5,1,D6,2,E6,3,E6,2,D6,1,E6,5,B5,2,A5,3,B5,1,E6,3,D6,3,B5,3,A5,3,K,1,E6,2,D6,
1,B5,2,A5,1,G5,4,K,3,E6,2,D6,1,B5,2,A5,1,G5,4,};
int main()
{
    int i;
    //结构体数组的长度sizeof(t)/sizeof(PU)得到,总结构体数组大小 / 单个结构体大小
    for (i=0; i<sizeof(t)/sizeof(PU); i++)
        Beep(t[i].frequency,t[i].duration*P);
}
  1. 以此类推,你可以搞出来自己想要的曲子,只需要改变谱子,bpm相关的部分,是不是不难呢?
  2. 至于为什么它可以一定程度上取代Sleep(),想必也不用我多说,直接用起来吧.

你可能感兴趣的:(用Beep()函数来实现c语言编写歌曲)