Virtual Piano 自动播放乐谱
来源:互联网 发布:外国人多喜欢熊猫知乎 编辑:程序博客网 时间:2024/04/28 04:33
钢琴按键分布
钢琴 一共88个键,52个白键,36个黑键。
从左到右按音区分,可分为
低音区:不完整的大二字组、大字一组、大字组;
中音区:小字组、小字一组、小字二组;
高音区:小字三组、小字四组和不完整的小字五组。
除大字二组只有A、#A、B三个音,小字五组只有c一个音外
其它各组分别有c、#c、d、#d、e、f、#f、g、#g、a、#a、b十二个音。
Flash 钢琴游戏
网上有个flash小游戏,使用键盘弹钢琴,将键盘上的按键和钢琴对应起来,如下图:
游戏网址:http://www.hao352.com/tangangqin.htm
这个游戏出发点就是将钢琴大众化,简单化,原理如下:
上面转换表中,数字后缀有三种:
- '_' 表示低音段
- '-' 表示中音段
- '`' 表示高音段
基于这种编码的一个乐谱如下:
玩家可以根据这种编码,按相应的按键,就能够弹奏一曲~
原理分析
首先,要制作这么一个游戏,首先需要一个MiDi发声引擎:最终在codeproject上面找到了一个不错的开源MIDI引擎:MIDIWrapper
网址:http://www.codeproject.com/KB/audio-video/midiwrapper.aspx。作者实现了一个标准的钢琴键盘。
然后就是根据乐谱转化为相应的音符。乐谱就是一串字符,根据输入的字符,对照上面的转换表,转化为低音,中音,高音的音符。代码中如何实现呢?
CMIDIWrapper中定义了钢琴中基本的十二个音,
SHARP是表示高半音,但是我们常用的七音符: 1,2,3,4,5,6,7 <==> C, D, E, F, G, A B.
NOTE_PER_OCTAVE = 12, //一个组十二个音
LOW_NOTE = 36 //低音符开始值
NoteId = (octave) * NOTE_PER_OCTAVE + LOW_NOTE;
octave表示第几个音组,0-4 一共五个组,从低音到最高音五个档次,NOTE_PER_OCTAVE是一个偏移量。我们关心的是每个音组中的C,D,E,F,G,A,B的提取。
代码:
要运行代码,需要下载CMIDIWrapper:
这个库中使用MFC下的CWinThread,所以需要在stdafx中增加:
#define _AFXDLL
#include <afxwin.h>
而且设置工程使用多字节字符集;C++代码生成中,运行库:多线程DLL/MD;添加输入库:winmm.lib
程序说明
PlayLatterRhythm 函数可以播放字母音符,后面float表示停顿时间,
PlayNumberRhythm 播放数字音符,后缀标志音高,中,低;float表示停顿时间。
最后根据flash中的字母音节,制作了自己的钢琴简谱,
字母简谱的格式为: Letter,playTime
数字简谱的格式,低音,中音,高音分别为:
number_playTime number-playTime number`playTime
BJ Welcom U-letter.txt内容,只是北京欢饮你第一句:
BJ Welcom U-number.txt内容,北京欢饮你的整个简谱,数字版:
运行程序,就会自动播放制作好的简谱咯~ O(∩_∩)O哈哈~
- Virtual Piano 自动播放乐谱
- Virtual Piano破解手记
- piano
- 乐谱
- 乐谱
- 把乐谱播出来,自制Arduino简谱播放库
- CSS3 Piano
- My piano dream.....
- 节奏大师乐谱破解
- 关于光盘自动播放
- 在线自动播放
- 禁止光驱自动播放
- 关闭自动播放
- 关闭自动播放
- 禁用自动播放
- 自动播放图片代码
- 自动播放图片代码
- 怎样禁止自动播放
- 想成为嵌入式程序员应知道的0x10个基本问题——转贴 经典!
- log4net
- 查询数据库之前把密码md5加密
- 各种进制转换
- js判断邮箱代码格式
- Virtual Piano 自动播放乐谱
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:桥接接口
- 哈希表(Hashtable)
- 对职场橡皮人Say No(转)
- XP下修正“显示隐藏文件夹及文件”方法
- IT豪门的十二星座传奇(转)
- Open aero effect in win 7
- 一个人的爱情
- 读取项目AssemblyInfo.cs属性值