【问题标题】:Text, string-based chord recognition algorithms?文本、基于字符串的和弦识别算法?
【发布时间】:2013-07-31 02:23:06
【问题描述】:

我正在寻找将字符串表示的音符作为输入并产生和弦名称作为输出的算法。

例如:

chordName("C", "E", "G")
>>> "C major"
chordName("C", "E", "G", "B")
>>> "C major 7"
chordName("A", "C", "E")
>>> "A minor"

【问题讨论】:

标签: algorithm music-notation


【解决方案1】:

不是一个完整的解决方案,但也许可以帮助您入门:

  1. 您应该首先将所有可能的音调定义到一个数组中,例如

    var scale=[['B#','C'],['C#','Db'],['E'],'[F]',['F#','Gb'], . .. 这实际上是一个小数组的数组,其中包含“相同”音符的所有可能名称。我知道纯粹主义者会坚持认为 F# 和 Gb 根本不同,但在钢琴键盘上它们位于同一个键后面。音阶数组应与自身组合以跨越一个八度音程。

  2. 然后应该在音阶数组中找到和弦数组的组件。它们在音阶数组中的相对位置是允许识别和弦的指纹。

  3. 需要设置另一个数组 chordtypes 来保存“和弦类型指纹”,例如

    ctfp={'major':[4,3,5],'minor':[3,4,5],...

【讨论】:

  • 我已经尝试了不同的方法,这些方法适用于简单的三和弦和两个叠加的三和弦(第 7 和弦)。现在我正在寻找可以处理反转和其他类型的不基于三和弦的和弦的其他实现。不过,我找不到任何关于这个主题的文献,我迷路了。澄清一下:我正在为 Python 和 Java 开发一个开源库,用于编程音乐开发和学习。我是处理和弦识别的最有效算法,但找不到任何算法。许多程序已经这样做了,但找不到实际的算法/代码。
  • 当您真的想识别所有可能的转位和缺少单个音调的和弦时,它肯定会涉及更多。但基本上通过寻找和弦类型指纹中的最小间隔(它的子数组也需要扩展以适应所有可能的反转)应该会让你走得更远。
【解决方案2】:

查看Mingus Python库的chords模块源码,了解基于字符串输入的和弦识别算法示例:

https://code.google.com/p/mingus/

https://code.google.com/p/mingus/source/browse/mingus/core/chords.py

和弦模块中的determine()函数,我引用:“命名一个和弦。可以确定几乎所有的和弦,从简单的三和弦到十四音符的多和弦。”

【讨论】:

    【解决方案3】:

    我自己的号角(即,我是图书馆的首席开发人员,当然有偏见),但使用 music21 (http://web.mit.edu/music21/) 你可以这样做:

    >>> from music21 import chord
    >>> chord.Chord(['C','E','G']).pitchedCommonName
    'C-major triad'    
    >>> chord.Chord(['C','E','G','B']).pitchedCommonName
    'C-major seventh chord'
    

    或更多不为人知的东西......

    >>> chord.Chord(['C','C#','D','E','F#']).pitchedCommonName
    'D-tritone-expanding pentachord'
    

    Chord (http://web.mit.edu/music21/doc/moduleReference/moduleChord.html) 的完整文档将帮助您弄清楚如何以您想要的格式获得文本输出。

    【讨论】:

    • 你实现了什么算法?您知道我在哪里可以找到有关和弦识别算法的文献、方法或研究吗?
    • 我不记得我们从哪里得到名称列表(我认为它在文档中带有确认的代码),但我们将所有和弦简化为它们的正常形式(chord.Chord ().normalForm) 然后与存储的列表进行比较。然后我们根据那里的一个函数找到和弦的根——对于标准和弦,找到根并不难。对于非常复杂的和弦,我们使用自己的算法,虽然可能不正确,但似乎效果很好。
    • 哦,看这里music.stackexchange.com/questions/12425/…了解更多信息。
    猜你喜欢
    • 2011-06-22
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2017-05-10
    相关资源
    最近更新 更多