Music21 获取所有带持续时间的音符
Music21 Getting All notes with Durations
我正在尝试获取所有音符及其持续时间(小节)。
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 returns 什么都没有。
谢谢。
这是您的脚本版本,可以满足您的需求:
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
对象。
在您的问题中,您似乎混淆了概念 "duration" 和 "measure"。在音乐理论中,持续时间是音符持续的时间(通常以节拍衡量),"measure" 是包含一定节拍数的格律划分的(美国英语)名称(由音符 and/or 休止符组成) ) 由操作中的当前拍号决定。在符号中,小节由竖线分隔。
我正在尝试获取所有音符及其持续时间(小节)。
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 returns 什么都没有。 谢谢。
这是您的脚本版本,可以满足您的需求:
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
对象。
在您的问题中,您似乎混淆了概念 "duration" 和 "measure"。在音乐理论中,持续时间是音符持续的时间(通常以节拍衡量),"measure" 是包含一定节拍数的格律划分的(美国英语)名称(由音符 and/or 休止符组成) ) 由操作中的当前拍号决定。在符号中,小节由竖线分隔。