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 实现了容器的层次结构,包括:ScoresPartsMeasures。大多数迭代只读属性(包括 .notes)通过 而不是 任意降级来尊重该层次结构。然后 music21 提供只读 属性 .flat 将层次结构展平 到叶型对象(音符和休止符)。

你从调用 p.parts.stream() 得到的对象是一个 Score 对象,所以直接询问它的 .notes 导致一个空的迭代器,因为没有 NotesScore 的直接子代。但是使用 .flat.notes 会展平层次结构,因此您可以直接访问 Notes.

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

在您的问题中,您似乎混淆了概念 "duration" 和 "measure"。在音乐理论中,持续时间是音符持续的时间(通常以节拍衡量),"measure" 是包含一定节拍数的格律划分的(美国英语)名称(由音符 and/or 休止符组成) ) 由操作中的当前拍号决定。在符号中,小节由竖线分隔。