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

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

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

要准备什么?

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

怎样做?

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

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

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

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

  1. 转为机器可以看懂的程序.
#include<stdio.h>
#include<windows.h>

#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(),想必也不用我多说,直接用起来吧.
  • 27
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是一个简单的C语言程序,实现开机哔哔2次和关机哔一次长声: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <wiringPi.h> #define BUZZER_PIN 0 // 定义蜂鸣器连接的GPIO引脚 void beep(int times, int duration) { for (int i = 0; i < times; i++) { digitalWrite(BUZZER_PIN, HIGH); // 发出蜂鸣器哔哔的第一声 delay(duration); // 持续一段时间 digitalWrite(BUZZER_PIN, LOW); // 发出蜂鸣器哔哔的第二声 delay(duration); // 持续一段时间 } } int main() { wiringPiSetup(); // 初始化wiringPi库 pinMode(BUZZER_PIN, OUTPUT); // 将蜂鸣器连接的GPIO引脚设置为输出模式 // 开机哔哔2次 beep(2, 100); // 等待用户按下关机按钮 printf("请按下关机按钮...\n"); while (digitalRead(BUTTON_PIN) == HIGH) { delay(100); } // 关机哔一次长声 digitalWrite(BUZZER_PIN, HIGH); delay(1000); digitalWrite(BUZZER_PIN, LOW); return 0; } ``` 在上面的代码中,我们使用了wiringPi库来控制GPIO引脚,实现了蜂鸣器的控制。首先,我们定义了一个beep函数,用于发出蜂鸣器哔哔的声音。它接受两个参数:哔哔的次数和每次哔哔的持续时间。然后,在main函数中,我们初始化了wiringPi库,并将蜂鸣器连接的GPIO引脚设置为输出模式。接着,我们调用beep函数发出开机哔哔的声音。最后,我们等待用户按下关机按钮,然后发出关机哔一次长声的声音。 需要注意的是,上面的代码中使用了wiringPi库来控制GPIO引脚。如果你的系统没有安装wiringPi库,可以使用其他的GPIO库来代替。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值