Я создаю программу, которая помогает композитору создать аккорд в последовательности, и одной из частей программы является определение голосов в аккорде (при его создании).
Итак, будет некоторая двусмысленность, так как у диапазона голосов есть общие ноты, организованные в B, B & T, B & T & C, B & T & C & S, T & C & S, C & S и S.
Я организовал аккорд в списке, содержащем списки возможностей для каждого из 4 голосов:
chord = [[poss_B], [poss_T], [poss_C], [poss_S]]
Ввод будет от 1 до 4 нот (да, 1 нота может образовать очень странный аккорд в моей программе между C4 и D4).
Могут быть голоса с одинаковыми нотами, но всегда будет 4 голоса.
Для каждой добавленной ноты проверяется:
если есть пустые списки: если они есть, необходимо ввести примечание
если все заметки отличаются друг от друга: если они не совпадают, тогда включается ввод заметок.
Для каждой добавленной ноты она проверяет свой диапазон и добавляет его ко всем голосам в пределах диапазона
После этого он устраняет неоднозначности :( это та часть, которую я не знаю, логично ли она правильна)
chord[0] = [min(chord[0])]
chord[3] = [max(chord[3])]
for i in chord[1]:
if i not in chord[0] and i not in chord[2]:
chord[1] = [i]
for i in chord[2]:
if i not in chord[1] and i not in chord[3]:
chord[2] = [i]
Еще одно правило, которое я, кажется, забыл: B <= T <= C <= S </p>