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

Does music21 include a note transition counter?

我正在尝试获取给定旋律中音符音高(仅名称,无八度)之间的转换率。 例如,如果我的旋律音高(按顺序)是 C D E D F C B C,我应该得到 C-D 过渡以 0.5 的速率发生,B-C 的速率为 1,等等

我应该能够在 Python 中编写一个函数来执行此操作(可能使用了很多 elifs...)但看起来 music21 也必须能够轻松完成.我查看了文档,Google,这里还有其他问题...但我找不到方法,但我怀疑我缺少一个可能对我真正有用的工具包。

您可能正在寻找一种二元表示法,我通常使用字典来处理它。这可能有点草率,但您可以轻松整理它:

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)) 以避免 integer/float 问题。另外,如果字典给您带来麻烦,您可以尝试使用 defaultdict。

我建议这样做:

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()}

窗口化的好处是很容易创建八卦等