Roland钢琴开发中音符值、度、与音名之间的转换算法
在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
G G#
第9组
117 118 119 120 121 122 123 124 125 126
A A# B C C# D D# E F F#
127
接下来介绍另外一个核心方法,这个方法是将音符值转换成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钢琴开发中音符值、度、与音名之间的转换算法的更多相关文章
- java中数组、集合、字符串之间的转换,以及用加强for循环遍历
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
- java中 列表,集合,数组之间的转换
java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 List和Set都是接口,它们继承Collection(集合),集合里面任何数据 ...
- IOS开发中返回值为null时的处理
在IOS开发中,如果得到了null返回值很容易造成程序崩溃,null和nil的判断方法不同. nil的判断方法: if(data==nil) { NSLog(@"data is n ...
- HTML中字体单位px pt em之间的转换
在实现打印功能时,遇到一个问题,使用px作为单位在不同的机器或者打印机上打印出的字体大小不一样,所以经过查询,发现使用pt为单位能够进行物流适配,下面是各单位之间的转换: 定义字体大小有常见三种单位, ...
- OpenCV中Mat与二维数组之间的转换
---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...
- Java基础知识强化106:Java中 int 的各进制之间的转换
1.二.八.十.十六进制之间的转换 下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...
- org.Hs.eg.db包简介(转换NCBI、ensemble等数据库中基因ID,symbol等之间的转换)
1)安装载入 ------------------------------------------- if("org.Hs.eg.db" %in% rownames(install ...
- java中byte,byte[]和int之间的转换
1>byte类型转换为,直接隐式转换,适用于要求保持数值不变,例如要求进行数值计算 如 byte b=0x01; int i=b; 2>另一种是要求保持最低字节中各个位不变,3个高字节全部 ...
- iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误
控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...
随机推荐
- python 网络编程第四版
使用SocketServer 模块来完成服务端编程 1.服务端代码如下: #!/usr/bin/python #!coding:utf-8 import SocketServer as sockets ...
- 正则语言(转的 大额_skylar )
备注:正则表达式真的很头疼,收集起来,用起来很方便的. 常用的元字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或 ...
- Mybatis基础入门 I
作为ORM的重要框架,MyBatis是iBatis的升级版.Mybatis完全将SQL语句交给编程人员掌控,这点和Hibernate的设计理念不同(至于Hibernate的理念,待我先学习学习). 下 ...
- 使用正则表达式限制TextBox输入
/// <summary> /// 使用正则表达式限制输入 /// </summary> public class TextBoxRegex : TextBox { // 正则 ...
- 怎查看linux系统的位数
# uname -a x86_64则说明你是64位内核, 跑的是64位的系统. i386, i686说明你是32位的内核, 跑的是32位的系统
- Windows下让Git记住用户名密码(https)
最近开始跟老板共同维护公司的框架代码,于是毫不犹豫地选择了Git这个驰名的版本控制系统(公司使用的是TFS,但外网访问老是断线). 选择的托管平台是OSChina,原因是其可以新建私有项目. 在拉取和 ...
- Python学习笔记3-文件的简单操作
Python中的文件操作 Python中文件打操作离不开两个模块 os 和 shutil os:操作文件.目录: Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话, ...
- MySQL- 锁机制及MyISAM表锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许 多用户 共享的资源.如何保证数据并发访问的一致性.有效性是所 ...
- KMP模式匹配 三(弦)
原文请訪问我的博客:xiaoshig.sinaapp.com KMP模式匹配 三(串) Time Limit:1000MS Memory Limit:131072KB 64bit IO ...
- 警告框和操作表(IOS开发)
警告框(AlertView)时模态的,不关闭它就不能做其它事情,所以不是下面几种情况不应该随便使用. 1.应用不能继续执行. 如内存不足,没有网络.一般仅仅须要一个button. 2.询问还有一个解决 ...