简谱两个|之间的时间称为节每个节都是固定的时间,每个音符所占的时间都是半拍的整数倍.我们把每个节的时间分成8份,然后用123~8(8就是0)之间的数字表示每个节中本音符的结束位置.
程序中一个音符占用8位(一个字节),高三位表示音符开始时间,中间两位指定音阶,最低三位指定音符.
//宏函数转换成音符,第一参数0~7时长,第二参数0~3音调,第三参数0~7音符,宏函数中有这段
#define CMS(time,level,symbol) ((unsigned char)((time<<5) | (level<<3) | symbol))
举个例子,荷塘月色第一节http://www.sooopu.com/html/?id=110312
{1下划,1,6下划点,5点,6点}
我们先计算时长,下划线表示这个音符占用半拍,没有下划线表示一拍,一个横道表示这个音符延长一拍,两个横道表示这个音符占三拍...
先不看音符这一节是{1/8,2/8,1/8,2/8,2/8},所以各音符的时间单位表示成1,3,4,6,8因此每个音符第一参数依次为1,3,4,6,0
中间一个宏参数是音阶,假设用2做中音,有下点是1,没有是2,有上点是3,所以第二参数依次2,2,1,1,1
第三个就是音符了1234567对应,依次为1,1,6,5,6
三个和在一起就是
CMS(1,2,1),CMS(3,2,1),CMS(4,1,6),CMS(6,1,5),CMS(0,1,6), //13468
[ 本帖最后由 huo_hu 于 2013-8-13 11:53 编辑 ] |