1

私はMusicXMLファイルを頻繁に使用しており、いくつかの部分に重要な変更があるバーのリストをコンパイルしようとしています。Pythonを使用して、最初にXMLファイルのどこにタグが存在するかを特定し、次に上記のタグ<key>から番号を抽出するためのサポートが必要です。<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ではこれを行うことができます:

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

あなたが興味を持っている単純なケースでは、ジョンKの答えは素晴らしいでしょう。しかし、もっと複雑なことをしたい場合(キーの変更時に現在のメーターを決定したり、キーの領域が署名と同じキーに分析されるかどうかを確認したりするなど)、music21が役立ちます。

(編集:私がソフトウェアパッケージのプロデューサーであることを開示するため)。

于 2013-03-03T14:31:29.850 に答える
1

私はMusic21を知りません。XML を直接分析したい場合は、次の 1 行のXPath クエリで実行できます。

//measure[attributes/key]/@number

これにより、内部に<measure>要素を持つ要素が検出され、それらのメジャーから属性が<key>抽出されます。Python で XPath を実行する方法については、この質問numberを参照してください ( lxmlが適しているようです)。

于 2013-02-26T23:22:52.043 に答える