python - Music21 获取所有带持续时间的音符

标签 python python-2.7 machine-learning music-notation music21

我正在尝试获取所有音符及其持续时间(小节)。

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

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

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

在您的问题中,您似乎将“持续时间”和“度量”这两个概念混为一谈。在音乐理论中,持续时间是一个音符持续的时间(通常以节拍来衡量),“小节”是一个格律划分的(美国英语)名称,其中包含一些节拍(由音符和/或休止符组成)由正在运行的当前拍号。在符号中,小节由竖线分隔。

关于python - Music21 获取所有带持续时间的音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647054/

相关文章:

Python 替换函数输出不同的结果

python-2.7 - 如何通过从下拉选项中选择一个值而不使用 Selenium 来获取数据

r - 为什么我们在 R 中的 model.matrix 函数中提到 -1 ?是为了一种热编码还是有其他原因?

python - 仅为python中的所有对象创建一个pexpect session

python - kivy 语言不处理枚举?

python - 将更改为数字代码的分类变量转换回其原始形式

machine-learning - 图像和视频的 RGB 深度数据集

python - Pyspark 抛出 IllegalArgumentException : 'Unsupported class file major version 55' when trying to use udf

python - 如何在 Django 日志中添加请求 id 而不修改记录器调用?

python - 线性回归 : Cost function working independently, 但不在 scipy.optimize 函数内