钢琴按键分布
钢琴 一共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哈哈~