Music21获取持续时间的所有笔记

时间:2016-04-15 12:21:56

标签: python python-2.7 machine-learning music-notation music21

我试图用他们的持续时间(措施)得到所有笔记。

[[1],[2,2],[3,3,3],[4],[1,1]]

以上代码产生以下输出

from music21 import *

allBach = corpus.search('bach')

x = allBach[0]
p = x.parse()

partStream = p.parts.stream()

for n in p.pitches:
    print "Pitch: " + str(n)

print "*************"

for n in p.notes:
    print "Note: " + str(n)
#print "Duration " + str(x.parse().duration)

我知道音高是八度音符的正名,但是我试图用它的持续时间(度量)来获得音符值。

另外,如果你可以帮助我,你能解释为什么p.notes没有返回任何东西。 谢谢。

1 个答案:

答案 0 :(得分:2)

这是您的脚本版本,可以满足您的需求:

from music21 import *

allBach = corpus.search('bach')

x = allBach[0]
p = x.parse()

partStream = p.parts.stream()

for n in p.flat.notes:
    print "Note: %s%d %0.1f" % (n.pitch.name, n.pitch.octave, n.duration.quarterLength)

您遇到的主要问题是.notes对象上Stream属性的行为。 music21实现容器的分层结构,包括:ScoresPartsMeasures。大多数迭代只读属性(包括.notes)通过而不是任意降序来尊重该层次结构。然后,music21将只读属性.flat提供给该层次结构提供给叶型对象(注释和休止符)。

您从p.parts.stream()调用回来的对象是Score对象,因此直接询问其.notes会导致空迭代器,因为没有Notes这是Score的直接孩子。但是使用.flat.notes可以展平层次结构,因此您可以直接访问Notes

在解决方案中,还要注意我直接访问了.pitch.name.pitch.octave.duration.quarterLength值,而不仅仅是要求str表示Note 1}}对象。

在你的问题中,你似乎把概念“持续时间”和“量度”混为一谈。在音乐理论中,持续时间是音符持续的时间(通常以节拍测量),而“测量”是包含由音符确定的一些节拍(由音符和/或休止符组成)的度量分区的(美国英语)名称。运行中的当前时间签名。在表示法中,工作人员通过垂直线划定了措施。