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哈哈~

原创粉丝点击