7

我试图用它们的持续时间(措施)来获取所有音符。

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 什么都不返回。谢谢你。

4

1 回答 1

7

这是您的脚本的一个版本,可以满足您的需求:

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会导致一个空迭代器,因为没有Notes哪个是 that 的直接子级Score。但是使用.flat.notes会展平层次结构,因此您可以直接访问Notes.

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

在您的问题中,您似乎将“持续时间”和“度量”的概念混为一谈。在音乐理论中,持续时间是一个音符持续的时间(通常以节拍为单位),“小节”是包含一定数量的节拍(由音符和/或休止符组成)的格律划分的(美国英语)名称,由正在运行的当前拍号。在符号上,测量是由垂直线在五线谱上划定的。

于 2016-05-09T22:47:55.080 回答