music21是否包含音符转换计数器?

时间:2016-03-26 00:25:33

标签: python music21

我试图在给定的旋律中获得音符音高(只是名字,没有八度)之间的转换率。 例如,如果我的旋律音高是(按顺序)C D E D F C B C,我应该得到C-D转换以0.5速率发生,B-C具有速率1等等。

我应该能够用Python编写一个函数来执行此操作(可能使用了很多elifs ...)但看起来音乐21也必须能够轻松完成。我查看了文档,谷歌,这里的其他问题......我无法找到,但我怀疑我错过了一个对我来说真的很有用的工具包。

2 个答案:

答案 0 :(得分:1)

你可能正在寻找的是一种双字母表示,我通常用字典来处理。这可能有点草率,但你可以轻松地整理它:

note_list = ...a list containing all notes in order
bigram_dict = {}
for note in range(1, len(note_list)):
    bigram = (note -1, note)
    if bigram not in bigram_dict:
        bigram_dict[bigram] = 1 / len(note_list)
    else:
        bigram_dict[bigram] += 1 / len(note_list)

这将为您提供每个二元组的百分比。如果使用Python 2.x,则必须使bigram_dict[bigram += float(1 / len(note_list))避免整数/浮点问题。此外,如果字典给您带来麻烦,您可以尝试使用defaultdict。

答案 1 :(得分:0)

我建议做类似的事情:

from music21.ext.more_itertools import windowed
from collections import Counter
# assuming s is your Stream
nameTuples = []
for n1, n2 in windowed(s.recurse().notes, 2):
    nameTuples.append((n1.name, n2.name))
c = Counter(nameTuples)
totalNotes = len(s.recurse().notes) # py2 cast to float
{k : v / totalNotes for k, v in c.items()}

关于窗口的好处是它很容易创建Trigrams等。