我试图用他们的持续时间(措施)得到所有笔记。
[[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没有返回任何东西。 谢谢。
答案 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实现容器的分层结构,包括:Scores
,Parts
和Measures
。大多数迭代只读属性(包括.notes
)通过而不是任意降序来尊重该层次结构。然后,music21将只读属性.flat
提供给将该层次结构提供给叶型对象(注释和休止符)。
您从p.parts.stream()
调用回来的对象是Score
对象,因此直接询问其.notes
会导致空迭代器,因为没有Notes
这是Score
的直接孩子。但是使用.flat.notes
可以展平层次结构,因此您可以直接访问Notes
。
在解决方案中,还要注意我直接访问了.pitch.name
,.pitch.octave
和.duration.quarterLength
值,而不仅仅是要求str
表示Note
1}}对象。
在你的问题中,你似乎把概念“持续时间”和“量度”混为一谈。在音乐理论中,持续时间是音符持续的时间(通常以节拍测量),而“测量”是包含由音符确定的一些节拍(由音符和/或休止符组成)的度量分区的(美国英语)名称。运行中的当前时间签名。在表示法中,工作人员通过垂直线划定了措施。