首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Music21获取具有持续时间的所有注释

Music21获取具有持续时间的所有注释
EN

Stack Overflow用户
提问于 2016-04-15 12:21:55
回答 1查看 3.5K关注 0票数 9

我试着得到所有音符的持续时间(度量)。

代码语言:javascript
复制
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)

上面的代码产生以下输出

代码语言:javascript
复制
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什么都不返回吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-09 22:47:55

下面是您的脚本的一个版本,可以实现您想要的功能:

代码语言:javascript
复制
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,将该层次结构简化为叶型对象(注释和rests)。

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

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

在你的问题中,你似乎把“持续时间”和“衡量”混为一谈。在音乐理论中,持续时间是一个音符持续的时间(通常用节拍来衡量),而“度量”是包含由当前时间符号所决定的一定数量的节拍(由音符和/或休息组成)的韵律分部的(美国英语)名称。在表示法中,测量在工作人员上用垂直线分隔。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36647054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档