2013-07-30 4 views
6

Я ищу алгоритмы, которые принимают ноты, представленные строками в качестве входных данных, и вызывают имя аккорда в качестве выхода.Текст, строковые алгоритмы распознавания аккордов?

Например:

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

[Здесь вы можете помочь.] (Https://code.google.com/p/python-musical/source/browse/trunk/musical/theory/chord.py?r=2) – Josh

+2

@Josh «# TODO: идентификация аккорда» :( – Rob

ответ

2

Окуните мой собственный рожок (то есть, я ведущий разработчик библиотеки, так предубежденный, конечно), но с музыкой21 (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' 

полных Документами для аккорда (http://web.mit.edu/music21/doc/moduleReference/moduleChord.html) поможет вам понять, как получить вывод текста в точно формате, который вы хочет.

+0

Какой алгоритм вы реализовали? Вы знаете, где я могу найти литературу, методологию или исследования алгоритмов распознавания аккордов? – Rob

+1

Я точно не помню, где мы получили список имен (я думаю, что это в документах для кода с подтверждением), но мы сводим все аккорды к их Нормальной форме (chord.Chord(). NormalForm), а затем сравните с сохраненным списком. Затем мы находим корень аккорда на основе функции там - для стандартных аккордов нетрудно найти корень. Для очень сложных аккордов мы используем собственный алгоритм, который может быть неправильным, но, похоже, он работает очень хорошо. –

+1

О, посмотрите здесь http://music.stackexchange.com/questions/12425/looking-for-a-list-of-common-4-note-chords для получения дополнительной информации. –

1

не полное решение, но, возможно, что-то, чтобы вы начали:

  1. Вы должны начать с определения всех возможных тонов в массиве как

    вар scale = [['B #', 'C'], ['C#', 'Db'], ['E'], '[F]', ['F #', 'Gb'], ... Это на самом деле представляет собой массив небольших массивов со всеми возможными именами для «той же» заметки. Я знаю, что пуристы будут настаивать на том, что F # и Gb принципиально разные, но на клавиатуре пианино они находятся за одним и тем же ключом. Массив шкалы должен сочетаться с собой, чтобы охватить более октавы.

  2. Компоненты массива аккордов следует затем найти в массиве шкалы. Их относительные позиции в массиве шкалы - это отпечаток пальца, который позволяет идентифицировать аккорд.

  3. Другой chordtypes массив должен быть установлен, чтобы держать "отпечатки пальцев типа аккорд", как

    ctfp = { 'основных': [4,3,5], 'незначительные': [3,4,5 ], ...

+0

Я уже экспериментировал с различными подходами, которые работают для простых триад и двух наложенных триад (7-й аккорды). Теперь я ищу другие реализации, которые могут обрабатывать инверсии и другие типы аккордов, которые не основаны на триаде. Я не могу найти ни одной литературы по этому вопросу, хотя я потерян. Как пояснение: я работаю над библиотекой с открытым исходным кодом для Python и Java для разработки и изучения программной музыки. Я самый эффективный алгоритм обработки распознавания аккордов, но не могу найти. Многие программы уже делают это, но не могут найти настоящие алгоритмы/код. – Rob

+0

Это, безусловно, становится все более привлекательным, когда вы действительно хотите идентифицировать все возможные инверсии и аккорды с отсутствующими индивидуальными тонами. Но в основном, ища минимальные интервалы в отпечатке пальца типа аккорда (его вспомогательные массивы также должны быть расширены, чтобы приспособиться к любым возможным инверсиям), вы должны продолжить. – cars10m

1

Посмотрите на аккорды модуля исходного кода библиотеки Mingus Python для примера аккорда алгоритма распознавания на основе ввода строки:

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

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

Функция определения() в модуле аккордов, я цитирую: «Имена аккорда. Может определять почти каждый аккорд, от простой триады до четырнадцати ноты полихорда. »

Смежные вопросы