在Roland钢琴伴侣的开发中,首先将mid文件解析出来取到每一个音符的起始时间,每一个音符的时值,音符值(比如中央C的值是60),在绘五线谱的时候需要将每一个音符值与它对应的度(octave)和音名之间相互转换。

WhiteNote.h

/**@class WhiteNote

* The WhiteNote class represents a white keynote, a non-sharp,non-flat note.  Todisplay midi notes as sheet music, the notes

must be converted to white notes andaccidentals.

*

* White notes consist of a letter (A thru G)and an octave (0 thru 10).

* The octave changes from G to A.  After G2 comes A3.  Middle-C is C4.

*

* The main operations are calculatingdistances between notes, and comparing notes.

*/

/*The table below is very important,you must be understand it.

@class WhiteNote includes two attributes(one is ‘letter’,another is‘Octave’)

int letter;  /* The letter of the note, A thru G */

int octave;   /* The octave, 0 thru 10. */

*/

这个类里面有一个很重要的枚举类型:

/** Enumeration of the notes in a scale (A, A#, ... G#) */

enum {

NoteScale_A       = ,

NoteScale_Asharp  = ,

NoteScale_Bflat   = ,

NoteScale_B       = ,

NoteScale_C       = ,

NoteScale_Csharp  = ,

NoteScale_Dflat   = ,

NoteScale_D       = ,

NoteScale_Dsharp  = ,

NoteScale_Eflat   = ,

NoteScale_E       = ,

NoteScale_F       = ,

NoteScale_Fsharp  = ,

NoteScale_Gflat   = ,

NoteScale_G       = ,

NoteScale_Gsharp  = ,

NoteScale_Aflat   =

};

这个枚举里面的值和下表里面的A   A#   B    C C# D   D#   E    F    F#   G    G# 这些值一一对应。

/**Convert a note (A, A#, B, etc) and octave into a Midi Note number.

*/

int notescale_to_number(int notescale, int octave) {

+ notescale +octave * ;

}

notescale对应上面枚举里面的值,octave对应下表的组数,举一个例,我们找到第四组的的C,在上面枚举中查找C的值和NoteScale_C的值相等(等于3),

所以notescale_to_number(NoteScale_C, ) = 60,刚好和第四组的C的音符值对应。这是一个通过scale和octave转换成音符的核心算法。

第-1组

0      1     2     3     4     5     6     7     8      

C    C#   D    D#   E    F    F#   G    G#  

 

第0组

9     10   11   12   13   14   15   16   17   18

A    A#   B     C     C#    D   D#   E    F    F#

19   20  

G    G#

第1组

21    22   23    24   25   26   27   28   29   30

A     A#   B      C    C#    D   D#    E    F     F#  

31   32

G    G#

第2组

33   34   35    36   37   38   39   40   41   42

A    A#   B     C    C#   D    D#    E    F     F#

43   44     

G    G#  

第3组

45   46   47    48   49   50   51   52   53   54

A    A#   B     C    C#    D    D#    E     F    F#

55   56

G    G#

 

 

第4组

57   58   59   60   61   62   63   64   65   66   

A    A#   B     C   C#    D     D#    E     F     F#

67   68   

G    G#

               

    

第5组

69   70   71    72   73   74   75   76   77   78

A    A#   B     C    C#   D    D#   E    F    F#

79   80  

G    G#

 

第6组

81   82   83    84   85   86   87   88   89   90

A    A#   B     C    C#    D    D#   E    F     F#

91   92  

G    G#

 

第7组

93    94   95    96   97   98   99   100  101  102

A    A#    B      C     C#   D    D#    E      F     F#

103  104 

G     G#

 

第8组

105  106  107  108  109  110  111  112  113  114

A       A#     B     C     C#      D    D#     E        F    F#
115  116 

G       G#

 

 

第9组

117  118  119  120  121  122  123  124  125  126

A       A#      B     C    C#      D     D#    E       F    F#

127

 G

接下来介绍另外一个核心方法,这个方法是将音符值转换成NoteScale枚举值,例如60,转换之后notescale_from_number()就等于NoteScale_C( 3 ).

int notescale_from_number(int number) {

) % ;

}

/** Return true if this notescale number is a black key */

BOOL notescale_is_black_key(int notescale) {

if (notescale == NoteScale_Asharp ||

notescale == NoteScale_Csharp ||

notescale == NoteScale_Dsharp ||

notescale == NoteScale_Fsharp ||

notescale == NoteScale_Gsharp) {

return YES;

}

else {

return NO;

}

}

上面这个方法是判断一个音符是否为black key.

Roland钢琴开发中音符值、度、与音名之间的转换算法的更多相关文章

  1. java中数组、集合、字符串之间的转换,以及用加强for循环遍历

    java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...

  2. java中 列表,集合,数组之间的转换

    java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 List和Set都是接口,它们继承Collection(集合),集合里面任何数据 ...

  3. IOS开发中返回值为null时的处理

    在IOS开发中,如果得到了null返回值很容易造成程序崩溃,null和nil的判断方法不同. nil的判断方法: if(data==nil) {      NSLog(@"data is n ...

  4. HTML中字体单位px pt em之间的转换

    在实现打印功能时,遇到一个问题,使用px作为单位在不同的机器或者打印机上打印出的字体大小不一样,所以经过查询,发现使用pt为单位能够进行物流适配,下面是各单位之间的转换: 定义字体大小有常见三种单位, ...

  5. OpenCV中Mat与二维数组之间的转换

    ---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...

  6. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  7. org.Hs.eg.db包简介(转换NCBI、ensemble等数据库中基因ID,symbol等之间的转换)

    1)安装载入 ------------------------------------------- if("org.Hs.eg.db" %in% rownames(install ...

  8. java中byte,byte[]和int之间的转换

    1>byte类型转换为,直接隐式转换,适用于要求保持数值不变,例如要求进行数值计算 如 byte b=0x01; int i=b; 2>另一种是要求保持最低字节中各个位不变,3个高字节全部 ...

  9. iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误

    控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...

随机推荐

  1. 安装程序时出现错误代码0x80070422

    通过win10应用商店,下载应用,安装时出现错误代码0x80070422. 需要打开services.msc,将windows update服务打开.

  2. Java Servlet的配置文件web.xml配置内容和具体含义

    文件名:“SimpleServlet.java” package cn.mldn.lxh.servlet ;//定义包 import java.io.* ; // HttpServlet属于javax ...

  3. (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0)

    (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0) 更新:ios4.1现在已经将这个做到SDK了.你可以设置键盘类型为UIKeyboardTypeDecimal ...

  4. 新手必看:如何快速看懂VC++项目

    1.在具备必需的编程基础知识后,试图理解一份完整的代码可以从以下几个方面入手:   1)首先运行以下程序,从外部角度感受一下有哪些功能.  2)了解代码中每个类的功能.看看文档,或者类的注释,那么仅仅 ...

  5. 自定义和扩展 SharePoint 2010 Server 功能区

    了解构成 SharePoint 2010 服务器功能区的组件以及如何通过演练两个功能区自定义项方案来自定义功能区. 适用范围: Microsoft SharePoint Foundation 2010 ...

  6. TCP/IP协议族

    1.TCP(传输控制协议)/IP(网际协议)协议族是一个网络通讯模型,以及一整个网络传输协议家族,为互联网的基础通讯架构. TCP/IP四层协议的表示方法: 2.TCP/IP参考模型映射到OSI模型: ...

  7. 自定义构造方法和description方法

    知识回顾在第5讲中已经介绍了如何定义类和创建并初始化对象,比如有Student这个类1.Student.h 1 #import <Foundation/Foundation.h>23@in ...

  8. js——cookie

    cookie:存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来向访问者电脑上存储数据 1.不同的浏览器存放的cookie位置不一样,也是不能通用的 2. cookie的存储是 ...

  9. hdu 4681 string

    字符串DP 题意:给你三个字符串a,b,c求字符串d的长度. 字符串d满足的要求:是a和b的公共子序列,c是它的子串. 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包 ...

  10. 加密传输SSL协议5_Hash Function

    怎么对一个大的文件进行签名,因为文件比较大,非对称签名很慢.那么想,我能把这个大的文件通过一种函数变换,变成一个和源文件唯一对应的的小的文件吗?答案是可以的. Hash Function 这里任何的文 ...