繁体   English   中英

模式识别算法/技术

[英]Pattern Recognition Algorithm/Technique

背景

对于基于音乐的问题,我深表歉意,但细节并没有真正意义那么大。 我依次浏览了一个midi文件,并且正在寻找一种有效的方法来在数据中找到模式,以找到称为tuplet的东西。 见下图:

在此处输入图片说明

小号上方有数字(3或6)。 我需要知道它们在数据文件中的开始位置。 注释下方的数字是您将在数据文件中顺序看到的值。 万一您无法解密下面的数据,这里是:

1,2,2.3333,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将不会在数据文件中被注释,因为仅数据文件仅列出注释位置。 您在该位置看到的图标称为其余图标,该图标未在数据文件中标记。

我如何找到一种有效的方法来找到每个连音的开始? 是否有某种递归方法?

我认为您不需要为此进行任何递归。

普通音符值只能用a / 2^b类型的节拍表示。 连音符可以是任意分数,但大多数情况下,我见过类似三连音,五连音或(在您的情况下为六连音)的东西。

因此,最简单的方法是计算每个音符的长度(也许是两个MIDI事件之间的时间差?还是将长度明确存储在MIDI中?我不太熟悉格式),然后计算该长度的合理表示形式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM