我为基于音乐的问题道歉,但细节并不是真的意味着那么多。我按顺序浏览midi文件,并且我正在寻找一种有效的方法来查找数据中的模式以找到称为连音符的内容。见下图:
连音符的顶部有数字(3或6)。我需要知道他们在数据文件中的哪个位置。注释下面的数字是您在数据文件中按顺序看到的值。万一你无法解读下面的数据,这里是:
1,2,2.33333,2.6666,3,3.5,3.6666,3.83333,4,4.1666,4.3333,4.5,4.6666,4.8333,
5,6.3333,6.6666,7.1666,7.3333,7.5,7.6666,7.8333,8,8.1666,8.333,8.5,8.6666。
主要问题是,在注释中,与下图不同,数据文件中不会记录位置7,因为仅数据文件仅列出注释位置。您在该位置看到的图标称为休息,未在数据文件中标注。
如何找到一种有效的方法来查找每个连音符的开头?有某种递归方法吗?
答案 0 :(得分:2)
我认为你不需要任何递归。
正常音符值只能用类型a / 2^b
的节拍分数表示。连音符可以是任意分数,但大多数情况下我看过像三胞胎,五胞胎或(在你的情况下是sextuplets)。
所以最简单的方法是计算每个音符的长度(也许是两个MIDI事件之间的时差?或者长度是否明确存储在MIDI中?我不熟悉格式)并计算合理的表示这个长度。
每组具有不是2的幂的分母属于这样的连音符。要将笔记组合在一起,我建议采用以下方法(假设连音符的所有音符都具有相同的值):
a
和其余b
(例如a * b = 4 * 5
)b
l
来计算连音符的长度,因此贪婪地添加它们直到这些音符的结尾超过连音符开头的l * b
距离