我正在尝试获取所有音符及其持续时间(小节)。
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)
以上代码产生如下输出
Pitch: E5
Pitch: G5
Pitch: A5
Pitch: D5
Pitch: F#5
Pitch: A5
Pitch: D5
Pitch: F#5
Pitch: A5
Pitch: C6
Pitch: G4
Pitch: B4
Pitch: D5
*************
我知道音高只是音符及其 Octave 的名称,但我试图通过其持续时间(小节)获取音符值。
另外,如果你能帮我解决这个问题,你能解释一下为什么 p.notes 什么都不返回吗? 谢谢。
最佳答案
这是您的脚本的一个版本,可以执行您想要的操作:
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)
您遇到的主要问题是 Stream
对象上的 .notes
属性的行为。 music21 实现容器的层次结构,包括:Scores
、Parts
和Measures
。大多数迭代只读属性(包括 .notes
)尊重该层次结构,不是 任意降低它。 music21 然后提供只读属性 .flat
以扁平化该层次结构为叶类型对象(音符和休止符)。
调用 p.parts.stream()
返回的对象是一个 Score
对象,因此直接请求它的 .notes
导致一个空迭代器,因为没有 Notes
是 Score
的直接子项。但是使用 .flat.notes
会展平层次结构,因此您可以直接访问 Notes
。
在解决方案中,还要注意我访问了 .pitch.name
、.pitch.octave
和 .duration.quarterLength
直接取值,而不仅仅是请求 Note
对象的 str
表示。
在您的问题中,您似乎将“持续时间”和“度量”这两个概念混为一谈。在音乐理论中,持续时间是一个音符持续的时间(通常以节拍来衡量),“小节”是一个格律划分的(美国英语)名称,其中包含一些节拍(由音符和/或休止符组成)由正在运行的当前拍号。在符号中,小节由竖线分隔。
关于python - Music21 获取所有带持续时间的音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647054/