模式识别算法/技术

时间:2017-07-26 16:31:06

标签: algorithm iteration

背景

我为基于音乐的问题道歉,但细节并不是真的意味着那么多。我按顺序浏览midi文件,并且我正在寻找一种有效的方法来查找数据中的模式以找到称为连音符的内容。见下图:

enter image description here

连音符的顶部有数字(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。

  • 第一个连音符号从位置2开始,音符位置之间的差异为0.3333(重复)
  • 第二个连音符从位置3.5开始,音符位置之间的差异为0.1666(重复)

主要问题是,在注释中,与下图不同,数据文件中不会记录位置7,因为仅数据文件仅列出注释位置。您在该位置看到的图标称为休息,未在数据文件中标注。

问题

如何找到一种有效的方法来查找每个连音符的开头?有某种递归方法吗?

1 个答案:

答案 0 :(得分:2)

我认为你不需要任何递归。

正常音符值只能用类型a / 2^b的节拍分数表示。连音符可以是任意分数,但大多数情况下我看过像三胞胎,五胞胎或(在你的情况下是sextuplets)。

所以最简单的方法是计算每个音符的长度(也许是两个MIDI事件之间的时差?或者长度是否明确存储在MIDI中?我不熟悉格式)并计算合理的表示这个长度。

每组具有不是2的幂的分母属于这样的连音符。要将笔记组合在一起,我建议采用以下方法(假设连音符的所有音符都具有相同的值):

  • 将分母分解为两个a和其余b(例如a * b = 4 * 5
  • 的幂
  • 初始化一个大小为b
  • 的空连音符
  • 对于每个音符计算到连音符开头的距离并将音符存储在相应位置,必要时插入休止符。可以通过获取连音符中所有音符的最小长度l来计算连音符的长度,因此贪婪地添加它们直到这些音符的结尾超过连音符开头的l * b距离
    这样,您可以将连音符放在最小音符长度上,并添加适合它的所有音符。