如何用C程序简单演奏乐曲
如何用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程序简单演奏乐曲的更多相关文章
- C#基础--.net平台的重要组成部分以及.net程序简单的编译原理
.net平台的组成只要有两部分 FCL:框架类库 CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- 微信小程序简单封装图片上传组件
微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...
- verilog实验1:基于FPGA蜂鸣器演奏乐曲并数码管显示
一.实验任务 利用FPGA进行代码开发,使蜂鸣器演奏出乐曲<生日快乐>,将音调显示在数码管.原理为蜂鸣器为交流源蜂鸣器,在引脚上加一定频率的方波就可以发声,而且发声的频率由所加方波决定.这 ...
- 详解树莓派Model B+控制蜂鸣器演奏乐曲
步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...
- MVC入口程序 | 简单调用及实例化
入口程序: 现在大多采用单一入口机制,单一入口就是指在一个web应用程序中,所有的请求都指向一个脚本文件.通俗点说就是一幢大楼只有一个大门入口可以进去... 目录: 建立一个控制器/模型/视图调用函数 ...
- 微信小程序简单入门1
参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/index.html 1 创建项目 开发者工具安装完成后,打开并使用微信扫码登录.选择创建"项 ...
- 微信小程序简单入门理解
简单的小程序示例结构: (一):理解小程序结构app.js,app.json,app.wxss ①app.js,app.json是小程序结构必要的部分,app.wxss可选择 ②app.js用于创建小 ...
- 微信小程序简单介绍 一
一 组件及api网址: 组件 :https://developers.weixin.qq.com/miniprogram/dev/component/view.html api:https://dev ...
随机推荐
- HttpClient4.5.2 连接池原理及注意事项
随着微服务的流行,服务之间的http调用越来越多,遇到的问题也比较多,写这边文章的目的也是将自己遇到的坑和解决方案跟大家分享 一.为什么要用Http连接池 1.降低延迟:如果不采用连接池,每次连接发起 ...
- Linux中查看系统资源占用情况的命令【转载】
用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载 ...
- 在地图上添加POI(二)
在上一篇中实现一个icon + label的Marker需要使用两个Tangram的Marker, 今天分析了Tangram的源码后, 发现Tangram时支持单一Marker同时显示的, 这需要使用 ...
- 关于wordpress在修改固定链接后,总显示Not Found的问题
参考来源: http://chinablog.blog.51cto.com/276793/280278 一.问题背景 使用wordpress搭建网站,为了让文章URL看起来漂亮一点,wordpress ...
- BA Practice Lead Handbook 1 - Why Is Business Analysis Taking The World By Storm?
The articles in this series are focused on individual Business Analysts and their managers. https:// ...
- css3 -> 多栏布局
在进行多栏布局时.使用bootstrap的栅格系统能够非常轻松的实现效果,事实上css3本身也提供了多兰布局的功能. 比方,我们在一个section标签内填充了非常多内容.同一时候希望内容可以显示成三 ...
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...
- C语言 小游戏之贪吃蛇
还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...
- JS获取和设置光标的位置
<html> <head> <script language="javascript"> function getCursortPosition ...
- JDBC操作数据库 封装好的工具类
mysql sqlserver oracle 数据库的驱动jar包http://download.csdn.net/download/csdn576038874/8833683package cn.h ...