我试图在给定的旋律中获得音符音高(只是名字,没有八度)之间的转换率。 例如,如果我的旋律音高是(按顺序)C D E D F C B C,我应该得到C-D转换以0.5速率发生,B-C具有速率1等等。
我应该能够用Python编写一个函数来执行此操作(可能使用了很多elifs
...)但看起来音乐21也必须能够轻松完成。我查看了文档,谷歌,这里的其他问题......我无法找到,但我怀疑我错过了一个对我来说真的很有用的工具包。
答案 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等。