首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Musicxml中提取信息

从Musicxml中提取信息
EN

Stack Overflow用户
提问于 2013-01-30 20:37:36
回答 2查看 3.5K关注 0票数 7

我是编程和Python的新手,但我目前的许多研究都是关于从musicxml文件中提取数据。我有一段音乐,我想提取在一段音乐中出现的意外事件的数量,这些意外事件不是密钥签名的一部分。我不知道该怎么做,请帮帮忙好吗?下面是我正在查看的musicxml文件中的一个度量示例:

代码语言:javascript
复制
<measure number='19'>
        <print new-system='no'/>
        <note>
            <rest/>
            <duration>768</duration>
            <voice>1</voice>
            <type>quarter</type>
            <staff>1</staff>
        </note>
        <backup>
            <duration>768</duration>
        </backup>
        <note>
            <pitch>
                <step>E</step>
                <octave>4</octave>
            </pitch>
            <duration>2304</duration>
            <tie type='start'/>
            <voice>2</voice>
            <type>half</type>
            <dot/>
            <staff>1</staff>
            <notations>
                <tied type='start'/>
                <slur type='stop' number='1'/>
            </notations>
        </note>
        <backup>
            <duration>1536</duration>
        </backup>
        <note>
            <pitch>
                <step>E</step>
                <alter>3</alter>
                <octave>3</octave>
            </pitch>
            <duration>1536</duration>
            <voice>1</voice>
            <type>half</type>
            <staff>1</staff>
        </note>
        <note>
            <chord/>
            <pitch>
                <step>G</step>
                <alter>4</alter>
                <octave>3</octave>
            </pitch>
            <duration>1536</duration>
            <voice>1</voice>
            <type>half</type>
            <staff>1</staff>
        </note>
        <backup>
            <duration>2304</duration>
        </backup>
        <note>
            <pitch>
                <step>E</step>
                <octave>2</octave>
            </pitch>
            <duration>2304</duration>
            <voice>5</voice>
            <type>half</type>
            <dot/>
            <staff>2</staff>
        </note>
    </measure>

问题转化为搜索musicxml文件并计算次数

代码语言:javascript
复制
<pitch>
   <step>*</step>
   <alter>**</alter>
       ...

在*不是(F或C)的情况下发生,并查找*为F或C且后面没有<alter>标记的次数。

任何帮助或建议都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2013-02-01 15:17:27

关于Python的细节我无能为力,但我有两个与MusicXML相关的建议:

1)您的问题是以意外事件为术语的,但您的代码关注的是alter元素。alter元素用于音调更改;意外元素用于书面意外。你在找哪一个?在MusicXML中,声音的多少和它在符号中的显示方式之间的二元性是很常见的,对于使用MusicXML文件进行研究来说,理解这一点很重要。

2)如果你是编程和Python的新手,我建议你使用一个更高级的工具包,这个工具包是专门为音乐学设计的,有很好的MusicXML支持。你将把问题域提升到一个更高的层次,这应该会让你的进展更快。最明显的选择是music21工具包,它也是用Python语言编写的。在http://web.mit.edu/music21/上有更多的信息。

祝你的研究好运!

票数 8
EN

Stack Overflow用户

发布于 2013-01-30 21:09:03

python有一个xml.dom模块,允许您快速浏览xml文件。如果你有web开发的经验,它与javascript的文档对象模型非常相似。

代码语言:javascript
复制
from xml.dom.minidom import parse, parseString

def get_step(note):
    stepNode = note.getElementsByTagName("step")[0]
    #get the text from the Text Node within the <step>,
    #and convert it from unicode to ascii
    return str(stepNode.childNodes[0].nodeValue)

def get_alter(note):
    alters = note.getElementsByTagName("alter")
    if len(alters) == 0:
        return None
    return alters[0]

def is_rest(note):
    return len(note.getElementsByTagName("rest")) > 0

def is_accidental(note):
    return get_alter(note) != None

dom = parse("data.xml")

notes = dom.getElementsByTagName("note")
#rests don't have steps or alters, so we don't care about them. Filter them out.
notes = filter(lambda note: not is_rest(note), notes)

#compile a list of notes of all accidentals (notes with <alter> tags)
accidentals = filter(is_accidental, notes)
#remove notes that are F or C
accidentals_that_are_not_f_or_c = filter(lambda note: get_step(note) not in ["F", "C"], accidentals)

#compile a list of notes that don't contain the alter tag
non_accidentals = filter(lambda note: not is_accidental(note), notes)
#remove notes that are not F or C
non_accidentals_that_are_f_or_c = filter(lambda note: get_step(note) in ["F", "C"], non_accidentals)

print "Accidental notes that are not F or C:"
if len(accidentals_that_are_not_f_or_c) == 0:
    print "(None found)"
else:
    for note in accidentals_that_are_not_f_or_c:
        print get_step(note)

print "Non-accidental notes that are F or C:"
if len(non_accidentals_that_are_f_or_c) == 0:
    print "(None found)"
else:
    for note in non_accidentals_that_are_f_or_c:
        print get_step(note), get_step(note) in ["F", "C"]

输出:

代码语言:javascript
复制
Accidental notes that are not F or C:
E
G
Non-accidental notes that are F or C:
(None found)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14604192

复制
相关文章

相似问题

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