我试着得到所有音符的持续时间(度量)。
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
*************我知道音高是音阶八度音符的名字,但我试着用它的持续时间(度量)来得到音符值。
另外,如果您能在这方面帮助我,您还能解释为什么p.notes什么都不返回吗?谢谢。
发布于 2016-05-09 22:47:55
下面是您的脚本的一个版本,可以实现您想要的功能:
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,将该层次结构简化为叶型对象(注释和rests)。
从对p.parts.stream()的调用中得到的对象是一个Score对象,因此直接询问它的.notes会导致一个空迭代器,因为没有Notes,而Notes是该Score的直接子级。但是使用.flat.notes会使层次结构变平,从而使您可以直接访问Notes。
在解决方案中,还请注意,我已经直接访问了.pitch.name、.pitch.octave和.duration.quarterLength值,而不仅仅是请求Note对象的str表示。
在你的问题中,你似乎把“持续时间”和“衡量”混为一谈。在音乐理论中,持续时间是一个音符持续的时间(通常用节拍来衡量),而“度量”是包含由当前时间符号所决定的一定数量的节拍(由音符和/或休息组成)的韵律分部的(美国英语)名称。在表示法中,测量在工作人员上用垂直线分隔。
https://stackoverflow.com/questions/36647054
复制相似问题