如何用C程序简单演奏乐曲

首先我们要介绍一个函数:

Beep(Frequency,time)

如果我们在程序中运行这个函数

Int main(void)

{

Beep(Frequency,time);

}

那么系统将会以Frequency Hz 的频率发出滴的一声并持续time ms。

显然,多次调用这个函数,我们就可以简单演奏乐曲了。

很简单是吧!

但是当你开始实践时,你就会发现,你的乐理水平简直为零,根本无法看懂一般的简谱。

于是我们来补充一点乐理知识。

根据这个函数的作用,我们只需明白乐曲中每个音的频率以及持续的时间就能解决问题了。

先说说音调:

这东西太复杂了,表示看了一大堆关于音调的资料后按着曲谱搞出来一个程序,结果还整体的低了半个八度。最后我的解决办法是:直接找了个大部分情况下靠谱的频率先用着,万一不行再调整。

我找的频率是:

do          re           mi          fa           sol          la           si

440        495     550        587        660        733        825   单位:Hz

关于怎么调整,鉴于我可怜的乐理水平,就不在此误人子弟了。我就祈祷你们不用调吧。

除了基本的频率外,有时音符的上方或者下方会有个小点,这表示这个音升八度或者降八度,反映在频率上就是这个音的频率乘以2或者除以二。

比如说  1 的频率是 440 Hz 则 1(·)的频率就是 440*2=880Hz 而 1 的频率就是 440/2=220Hz,现在音调方面基本上没什么问题了。

再说说时间:

在简谱中

普通的音符就代表1拍

如果音符后面跟着像这样的 – 符号,那么有几个这个符号这个音符就延长几拍。

还有些音符下面有下划线,有的还有两根甚至三根下划线。

对于这种音符,它每有一根下划线它的时间就会除以二

这样时间基本上也没有什么问题了。

但是最重要的,1拍到底是多少秒呢?

根据我查的资料,1拍的长度并不固定,可能是1分钟60拍,也可能是120拍。具体的你可以调整1拍的长度试着看来找到一个最好的长度。

基本的乐理了解完毕,剩下的事情就简单了,不过就是对着乐谱打无数个Beep了。

但是这么机械的事情有什么意思,我们绝不重复造轮子。于是,考虑到所需的程序结构及其简单,我们可以用另一个程序来生成这个程序。而我们只需在程序中输入每个音符的符号和时间以及1拍的长度这些必不可少的数据。

现用我做的程序为例子这个程序运行后会生成一个所需的,能演奏乐曲的程序源代码。

#include<stdio.h>

int T;                                   //用全局变量表示一拍的时间,这里的T表示1分钟有多少拍

int Hz[8]={0,440,495,550,587,660,733,825};                  //用全局变量存储好各个音符的基本频率

FILE *p;                                                                         //用于指向目标文件的指针

void music(int hz,int i,int t)                                             //定义一个函数用于在目标的程序中打印Beep函数

{

hz=Hz[hz];

if (i==0)                           //这些if语句用于决定频率是升八度、不变、还是降八度

hz=hz/2;

if (i==2)

hz=hz*2;

fprintf(p,"       Beep(%d,%d);\n",hz,60000/T/4*t);      //打印Beep

}

int main(void)

{

int n=1;

int hz,t,x;

p=fopen("music.c","w");                                             //创建目标文件

scanf("%d",&T);                                              //从外部输入T,方便调整1拍的长度

fprintf(p,"int main(void)\n{\n");                                   //打印目标程序

while(n)

{

scanf("%d %d %d %d",&hz,&x,&t,&n);                  //输入每个音符的音调、是否升降调、时间,和用于表示输入未结束的标志

music(hz,x,t);

}

fprintf(p,"       return 0;\n}");

fclose(p);

return 0;

}

我的输入数据为《我的山大我的家》:

80

3 1 2 1

3 1 2 1

3 1 2 1

2 1 2 1

3 1 8 1

2 1 2 1

2 1 2 1

2 1 2 1

6 0 2 1

1 1 8 1

6 0 2 1

5 0 2 1

6 0 2 1

2 1 2 1

2 1 8 1

3 1 2 1

5 1 2 1

5 1 2 1

3 1 2 1

2 1 8 1

3 1 2 1

3 1 2 1

2 1 2 1

5 1 2 1

3 1 8 1

2 1 2 1

2 1 2 1

1 1 2 1

2 1 2 1

6 0 8 1

6 0 2 1

5 0 2 1

6 0 2 1

2 1 2 1

2 1 8 1

2 1 2 1

2 1 1 1

3 1 1 1

2 1 2 1

6 0 2 1

1 1 8 1

3 1 2 1

3 1 2 1

2 1 2 1

3 1 2 1

3 1 8 1

2 1 2 1

2 1 1 1

3 1 1 1

2 1 2 1

6 0 2 1

1 1 8 1

6 0 2 1

1 1 2 1

1 1 2 1

6 0 2 1

2 1 8 1

5 1 2 1

5 1 2 1

1 1 2 1

3 1 2 1

2 1 8 1

3 1 2 1

3 1 2 1

2 1 2 1

5 1 2 1

3 1 8 1

2 1 2 1

2 1 2 1

1 1 2 1

2 1 2 1

6 0 8 1

6 0 2 1

5 0 2 1

6 0 2 1

2 1 2 1

2 1 8 1

2 1 2 1

6 0 2 1

1 1 2 1

2 1 2 1

1 1 8 1

5 1 4 1

5 1 2 1

3 1 2 1

5 1 2 1

6 1 2 1

1 2 2 1

1 2 1 1

6 1 1 1

5 1 2 1

5 1 1 1

6 1 1 1

5 1 2 1

1 1 2 1

2 1 2 1

6 1 1 1

5 1 1 1

5 1 8 1

6 1 2 1

6 1 2 1

5 1 2 1

3 1 1 1

2 1 1 1

1 1 2 1

3 1 2 1

2 1 2 1

2 1 1 1

3 1 1 1

5 1 2 1

5 1 2 1

1 1 2 1

3 1 2 1

2 1 8 1

5 1 2 1

5 1 1 1

3 1 1 1

5 1 2 1

6 1 2 1

1 2 2 1

1 2 1 1

6 1 1 1

5 1 2 1

5 1 1 1

6 1 1 1

5 1 2 1

1 1 2 1

2 1 2 1

1 1 2 1

6 0 8 1

2 1 2 1

2 1 2 1

2 1 2 1

1 1 2 1

2 1 2 1

6 1 1 1

5 1 1 1

5 1 2 1

2 1 1 1

3 1 1 1

2 1 2 1

2 1 2 1

6 0 2 1

1 1 2 1

1 1 8 1

5 1 4 1

3 1 2 1

6 1 1 1

5 1 1 1

5 1 8 1

3 1 4 1

3 1 2 1

3 1 2 1

2 1 8 1

5 1 4 1

1 1 2 1

2 1 2 1

6 0 8 1

2 1 4 1

2 1 2 1

1 1 2 1

2 1 8 1

5 1 4 1

3 1 2 1

6 1 1 1

5 1 1 1

5 1 8 1

3 1 4 1

3 1 2 1

3 1 2 1

2 1 8 1

5 1 4 1

1 1 2 1

2 1 2 1

6 0 8 1

2 1 4 1

2 1 2 1

6 0 2 1

1 1 8 1

2 1 8 1

2 1 4 1

6 0 4 1

1 1 16 0

最后生成的源代码:

int main(void)

{

Beep(550,374);

Beep(550,374);

Beep(550,374);

Beep(495,374);

Beep(550,1496);

Beep(495,374);

Beep(495,374);

Beep(495,374);

Beep(366,374);

Beep(440,1496);

Beep(366,374);

Beep(330,374);

Beep(366,374);

Beep(495,374);

Beep(495,1496);

Beep(550,374);

Beep(660,374);

Beep(660,374);

Beep(550,374);

Beep(495,1496);

Beep(550,374);

Beep(550,374);

Beep(495,374);

Beep(660,374);

Beep(550,1496);

Beep(495,374);

Beep(495,374);

Beep(440,374);

Beep(495,374);

Beep(366,1496);

Beep(366,374);

Beep(330,374);

Beep(366,374);

Beep(495,374);

Beep(495,1496);

Beep(495,374);

Beep(495,187);

Beep(550,187);

Beep(495,374);

Beep(366,374);

Beep(440,1496);

Beep(550,374);

Beep(550,374);

Beep(495,374);

Beep(550,374);

Beep(550,1496);

Beep(495,374);

Beep(495,187);

Beep(550,187);

Beep(495,374);

Beep(366,374);

Beep(440,1496);

Beep(366,374);

Beep(440,374);

Beep(440,374);

Beep(366,374);

Beep(495,1496);

Beep(660,374);

Beep(660,374);

Beep(440,374);

Beep(550,374);

Beep(495,1496);

Beep(550,374);

Beep(550,374);

Beep(495,374);

Beep(660,374);

Beep(550,1496);

Beep(495,374);

Beep(495,374);

Beep(440,374);

Beep(495,374);

Beep(366,1496);

Beep(366,374);

Beep(330,374);

Beep(366,374);

Beep(495,374);

Beep(495,1496);

Beep(495,374);

Beep(366,374);

Beep(440,374);

Beep(495,374);

Beep(440,1496);

Beep(660,748);

Beep(660,374);

Beep(550,374);

Beep(660,374);

Beep(733,374);

Beep(880,374);

Beep(880,187);

Beep(733,187);

Beep(660,374);

Beep(660,187);

Beep(733,187);

Beep(660,374);

Beep(440,374);

Beep(495,374);

Beep(733,187);

Beep(660,187);

Beep(660,1496);

Beep(733,374);

Beep(733,374);

Beep(660,374);

Beep(550,187);

Beep(495,187);

Beep(440,374);

Beep(550,374);

Beep(495,374);

Beep(495,187);

Beep(550,187);

Beep(660,374);

Beep(660,374);

Beep(440,374);

Beep(550,374);

Beep(495,1496);

Beep(660,374);

Beep(660,187);

Beep(550,187);

Beep(660,374);

Beep(733,374);

Beep(880,374);

Beep(880,187);

Beep(733,187);

Beep(660,374);

Beep(660,187);

Beep(733,187);

Beep(660,374);

Beep(440,374);

Beep(495,374);

Beep(440,374);

Beep(366,1496);

Beep(495,374);

Beep(495,374);

Beep(495,374);

Beep(440,374);

Beep(495,374);

Beep(733,187);

Beep(660,187);

Beep(660,374);

Beep(495,187);

Beep(550,187);

Beep(495,374);

Beep(495,374);

Beep(366,374);

Beep(440,374);

Beep(440,1496);

Beep(660,748);

Beep(550,374);

Beep(733,187);

Beep(660,187);

Beep(660,1496);

Beep(550,748);

Beep(550,374);

Beep(550,374);

Beep(495,1496);

Beep(660,748);

Beep(440,374);

Beep(495,374);

Beep(366,1496);

Beep(495,748);

Beep(495,374);

Beep(440,374);

Beep(495,1496);

Beep(660,748);

Beep(550,374);

Beep(733,187);

Beep(660,187);

Beep(660,1496);

Beep(550,748);

Beep(550,374);

Beep(550,374);

Beep(495,1496);

Beep(660,748);

Beep(440,374);

Beep(495,374);

Beep(366,1496);

Beep(495,748);

Beep(495,374);

Beep(366,374);

Beep(440,1496);

Beep(495,1496);

Beep(495,748);

Beep(366,748);

Beep(440,2992);

return 0;

}

如何用C程序简单演奏乐曲的更多相关文章

  1. C#基础--.net平台的重要组成部分以及.net程序简单的编译原理

    .net平台的组成只要有两部分   FCL:框架类库    CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...

  2. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  3. 微信小程序简单封装图片上传组件

    微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...

  4. verilog实验1:基于FPGA蜂鸣器演奏乐曲并数码管显示

    一.实验任务 利用FPGA进行代码开发,使蜂鸣器演奏出乐曲<生日快乐>,将音调显示在数码管.原理为蜂鸣器为交流源蜂鸣器,在引脚上加一定频率的方波就可以发声,而且发声的频率由所加方波决定.这 ...

  5. 详解树莓派Model B+控制蜂鸣器演奏乐曲

    步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...

  6. MVC入口程序 | 简单调用及实例化

    入口程序: 现在大多采用单一入口机制,单一入口就是指在一个web应用程序中,所有的请求都指向一个脚本文件.通俗点说就是一幢大楼只有一个大门入口可以进去... 目录: 建立一个控制器/模型/视图调用函数 ...

  7. 微信小程序简单入门1

    参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/index.html 1  创建项目 开发者工具安装完成后,打开并使用微信扫码登录.选择创建"项 ...

  8. 微信小程序简单入门理解

    简单的小程序示例结构: (一):理解小程序结构app.js,app.json,app.wxss ①app.js,app.json是小程序结构必要的部分,app.wxss可选择 ②app.js用于创建小 ...

  9. 微信小程序简单介绍 一

    一 组件及api网址: 组件 :https://developers.weixin.qq.com/miniprogram/dev/component/view.html api:https://dev ...

随机推荐

  1. Java用链表实现栈和队列

    1.用链表实现栈 package stack; /** * * @author denghb * */ class Link { public long dData; public Link next ...

  2. [TypeScript] Using Exclude and RootDir until File Globs Lands in 2.0.

    Files globs will be available in TypeScript 2.0, so in the meantime, we need to use "exclude&qu ...

  3. socket编程原理

    socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...

  4. abap中的弹出窗体函数

    POPUP_TO_CONFIRM_WITH_MESSAGE     会话框确实处理步骤; 用识别正文POPUP_TO_SELECT_MONTH             日历:弹出 POPUP_TO_C ...

  5. Amazon S3 上传文件 SSL23_GET_SERVER_HELLO握手错误

    题外话:今天偶尔来逛逛,发现我真是懒到家了.居然有半年前的留言我都没有来看过,真对不起留言的同学,希望他的问题已经解决了. 这两三天一直被亚马逊S3上传文件的问题困扰着,直到昨天晚上终于搞定了,工作群 ...

  6. "ORA-00942: 表或视图不存在 "的原因和解决方法

    "ORA-00942: 表或视图不存在 "的原因和解决方法   采用Oracle数据库,使用Powerdesigner设计,生成Sql文件导入后查询出现“ORA-00942: 表或 ...

  7. HTML+CSS基础学习笔记(4)

    一.认识CSS样式 1.定义 CSS全称:层叠样式表(Cascading Style Sheets) 主要作用:定义HTML内容在浏览器内的显示样式,比如文字大小.颜色.字体加粗等 优点:通过定义某个 ...

  8. git warning: LF will be replaced by CRLF in 解决办法

    在使用git的时候,每次执行 #git add "目录" git add . 都会提示这样一个警告消息: warning: LF will be replaced by CRLF  ...

  9. (转)META http-equiv="refresh" 实现网页自动跳转

    ***.html自动跳转文件代码如下: <HTML> <HEAD><META http-equiv="Refresh" content="5 ...

  10. 微信Demo导入遇到的问题

    最近做支付宝和微信接入自己APP工程的功能,遇到了一些问题,跟大家分享: 这里先说Android开发微信支付接入. 首先根据官方文档进行,对比支付宝的官方文档,微信部分更显得“摘要”一些. 导入后自行 ...