1

我正在使用 MusicXML 文件进行大量工作,并试图编译一个条形列表,其中有许多片段发生了关键变化。我需要一些帮助,使用 python 首先确定<key>标签在 XML 文件中出现的位置,然后从<measure number ='*'>上面的标签中提取数字。这是我正在使用的度量的示例:

<measure number='30' implicit='yes'>
    <print new-page='yes'/>
    <barline location='left'>
        <bar-style>heavy-light</bar-style>
        <repeat direction='forward'/>
    </barline>
    <attributes>
        <key>
            <fifths>-1</fifths>
            <mode>major</mode>
        </key>
    </attributes>
    <direction>
        <direction-type>
            <dynamics  default-y='-82'>
                <p/>
            </dynamics>
        </direction-type>
        <staff>1</staff>
    </direction>
    <direction>
        <direction-type>
            <words default-y='15' relative-x='4'>
        </direction-type>
        <staff>1</staff>
    </direction>
    <note>
        <pitch>
            <step>F</step>
            <octave>5</octave>
        </pitch>
        <duration>768</duration>
        <voice>1</voice>
        <type>quarter</type>
        <stem>down</stem>
        <staff>1</staff>
        <notations>
            <ornaments>
                <trill-mark default-y='20'/>
                <wavy-line type='start' number='1'/>
                <wavy-line type='stop' number='1'/>
            </ornaments>
        </notations>
    </note>
</measure>

我怎样才能提取'30'位?有没有一种快速简便的方法可以用 music21 做到这一点?

4

2 回答 2

1

我不知道Music21。如果您想直接分析 XML,您可以使用以下单行XPath 查询来完成:

//measure[attributes/key]/@number

这会找到<measure>其中包含<key>元素的元素,然后number从这些度量中提取属性。有关在 Python 中执行 XPath 的信息,请参阅此问题(听起来lxml是要走的路)。

于 2013-02-26T23:22:52.043 回答
1

在 music21 中,您可以这样做:

from music21 import *
s = converter.parse(filepath)
# assuming key changes are the same in all parts, just get the first part
p = s.parts[0]
pFlat = p.flat
keySigs = pFlat.getElementsByClass('KeySignature')
for k in keySigs:
    print k.measureNumber

对于您感兴趣的简单案例,John K 的答案会很好。但是,如果您想做一些更复杂的事情(例如确定键更改时的当前仪表,查看键区域是否分析到与签名相同的键等),那么 music21 可能会有所帮助。

(编辑:透露我是软件包的生产者)。

于 2013-03-03T14:31:29.850 回答