2017-07-14 6 views
3

Je suis en train d'obtenir une table d'informations comme les éléments suivants pour chaque note:Enumérer les toutes les notes Music21

Pitch - Octave - AbsoluteStart - Duration - Tied - MeterOfMeasure - Quarterlength 

Pour chacune des notes dans un cours d'eau (qui peut contenir des voix, etc.). Existe-t-il un moyen facile d'itérer sur toutes les notes, donc je peux simplement appeler les propriétés par un?

from music21 import * 
song = converter.parse('test.xml') 

J'ai essayé:

song.show('t') 

Le problème est que l'information cruciale manque (durée, etc.). Ps: Idéalement, je peux prétraiter le flux afin que les liens soient traités comme des durées de note complètes. Je crois que c'est possible avec Stream.stripTies.

Le fichier MusicXML Je teste avec est:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.0 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd"> 
<score-partwise> 
    <identification> 
    <creator type="composer">Brennan Becker</creator> 
    <encoding> 
     <software>MuseScore 2.0.3.1</software> 
     <encoding-date>2017-07-13</encoding-date> 
     <supports element="accidental" type="yes"/> 
     <supports element="beam" type="yes"/> 
     <supports element="print" attribute="new-page" type="yes" value="yes"/> 
     <supports element="print" attribute="new-system" type="yes" value="yes"/> 
     <supports element="stem" type="yes"/> 
     </encoding> 
    <source>http://musescore.com/score/2383771</source> 
    </identification> 
    <defaults> 
    <scaling> 
     <millimeters>7.05556</millimeters> 
     <tenths>40</tenths> 
     </scaling> 
    <page-layout> 
     <page-height>1584</page-height> 
     <page-width>1224</page-width> 
     <page-margins type="even"> 
     <left-margin>56.6929</left-margin> 
     <right-margin>56.6929</right-margin> 
     <top-margin>56.6929</top-margin> 
     <bottom-margin>113.386</bottom-margin> 
     </page-margins> 
     <page-margins type="odd"> 
     <left-margin>56.6929</left-margin> 
     <right-margin>56.6929</right-margin> 
     <top-margin>56.6929</top-margin> 
     <bottom-margin>113.386</bottom-margin> 
     </page-margins> 
     </page-layout> 
    <word-font font-family="FreeSerif" font-size="10"/> 
    <lyric-font font-family="FreeSerif" font-size="11"/> 
    </defaults> 
    <credit page="1"> 
    <credit-words default-x="1167.31" default-y="1402.31" justify="right" valign="bottom" font-size="12">Brennan Becker</credit-words> 
    </credit> 
    <credit page="1"> 
    <credit-words default-x="612" default-y="1527.31" justify="center" valign="top" font-size="48">Test</credit-words> 
    </credit> 
    <part-list> 
    <score-part id="P1"> 
     <part-name>Piano</part-name> 
     <part-abbreviation>Pno.</part-abbreviation> 
     <score-instrument id="P1-I1"> 
     <instrument-name>Piano</instrument-name> 
     </score-instrument> 
     <midi-device id="P1-I1" port="1"></midi-device> 
     <midi-instrument id="P1-I1"> 
     <midi-channel>1</midi-channel> 
     <midi-program>1</midi-program> 
     <volume>78.7402</volume> 
     <pan>0</pan> 
     </midi-instrument> 
     </score-part> 
    </part-list> 
    <part id="P1"> 
    <measure number="1" width="641.30"> 
     <print> 
     <system-layout> 
      <system-margins> 
      <left-margin>21.00</left-margin> 
      <right-margin>0.00</right-margin> 
      </system-margins> 
      <top-system-distance>195.00</top-system-distance> 
      </system-layout> 
     <staff-layout number="2"> 
      <staff-distance>65.00</staff-distance> 
      </staff-layout> 
     </print> 
     <attributes> 
     <divisions>4</divisions> 
     <key> 
      <fifths>1</fifths> 
      </key> 
     <time> 
      <beats>2</beats> 
      <beat-type>4</beat-type> 
      </time> 
     <staves>2</staves> 
     <clef number="1"> 
      <sign>G</sign> 
      <line>2</line> 
      </clef> 
     <clef number="2"> 
      <sign>F</sign> 
      <line>4</line> 
      </clef> 
     </attributes> 
     <direction placement="above"> 
     <direction-type> 
      <metronome parentheses="no"> 
      <beat-unit>quarter</beat-unit> 
      <per-minute>100</per-minute> 
      </metronome> 
      </direction-type> 
     <staff>1</staff> 
     <sound tempo="100"/> 
     </direction> 
     <note> 
     <rest/> 
     <duration>8</duration> 
     <voice>1</voice> 
     <staff>1</staff> 
     </note> 
     <backup> 
     <duration>8</duration> 
     </backup> 
     <direction placement="below"> 
     <direction-type> 
      <pedal type="start" line="yes"/> 
      </direction-type> 
     <staff>2</staff> 
     </direction> 
     <note default-x="88.37" default-y="-130.00"> 
     <pitch> 
      <step>C</step> 
      <octave>3</octave> 
      </pitch> 
     <duration>1</duration> 
     <voice>5</voice> 
     <type>16th</type> 
     <stem>down</stem> 
     <staff>2</staff> 
     <beam number="1">begin</beam> 
     <beam number="2">begin</beam> 
     </note> 
     <note default-x="174.47" default-y="-125.00"> 
     <pitch> 
      <step>D</step> 
      <octave>3</octave> 
      </pitch> 
     <duration>1</duration> 
     <voice>5</voice> 
     <type>16th</type> 
     <stem>down</stem> 
     <staff>2</staff> 
     <beam number="1">continue</beam> 
     <beam number="2">continue</beam> 
     </note> 
     <note default-x="260.56" default-y="-120.00"> 
     <pitch> 
      <step>E</step> 
      <octave>3</octave> 
      </pitch> 
     <duration>1</duration> 
     <voice>5</voice> 
     <type>16th</type> 
     <stem>down</stem> 
     <staff>2</staff> 
     <beam number="1">continue</beam> 
     <beam number="2">continue</beam> 
     </note> 
     <note default-x="346.66" default-y="-115.00"> 
     <pitch> 
      <step>F</step> 
      <alter>1</alter> 
      <octave>3</octave> 
      </pitch> 
     <duration>1</duration> 
     <voice>5</voice> 
     <type>16th</type> 
     <stem>down</stem> 
     <staff>2</staff> 
     <beam number="1">end</beam> 
     <beam number="2">end</beam> 
     </note> 
     <note default-x="432.76" default-y="-110.00"> 
     <pitch> 
      <step>G</step> 
      <octave>3</octave> 
      </pitch> 
     <duration>4</duration> 
     <voice>5</voice> 
     <type>quarter</type> 
     <stem>down</stem> 
     <staff>2</staff> 
     </note> 
     <direction placement="below"> 
     <direction-type> 
      <pedal type="stop" line="yes"/> 
      </direction-type> 
     <staff>2</staff> 
     </direction> 
     </measure> 
    <measure number="2" width="448.31"> 
     <barline location="left"> 
     <bar-style>heavy-light</bar-style> 
     <repeat direction="forward"/> 
     </barline> 
     <attributes> 
     <time> 
      <beats>3</beats> 
      <beat-type>8</beat-type> 
      </time> 
     </attributes> 
     <direction placement="above"> 
     <direction-type> 
      <metronome parentheses="no"> 
      <beat-unit>quarter</beat-unit> 
      <per-minute>80</per-minute> 
      </metronome> 
      </direction-type> 
     <staff>1</staff> 
     <sound tempo="79.9998"/> 
     </direction> 
     <note default-x="37.50" default-y="-25.00"> 
     <pitch> 
      <step>A</step> 
      <octave>4</octave> 
      </pitch> 
     <duration>2</duration> 
     <tie type="start"/> 
     <voice>1</voice> 
     <type>eighth</type> 
     <stem>down</stem> 
     <staff>1</staff> 
     <beam number="1">begin</beam> 
     <notations> 
      <tied type="start"/> 
      </notations> 
     </note> 
     <note default-x="37.50" default-y="-5.00"> 
     <chord/> 
     <pitch> 
      <step>E</step> 
      <octave>5</octave> 
      </pitch> 
     <duration>2</duration> 
     <voice>1</voice> 
     <type>eighth</type> 
     <stem>down</stem> 
     <staff>1</staff> 
     </note> 
     <note default-x="168.06" default-y="-5.00"> 
     <pitch> 
      <step>E</step> 
      <octave>5</octave> 
      </pitch> 
     <duration>2</duration> 
     <voice>1</voice> 
     <type>eighth</type> 
     <stem>down</stem> 
     <staff>1</staff> 
     <beam number="1">end</beam> 
     </note> 
     <note default-x="298.62" default-y="-25.00"> 
     <pitch> 
      <step>A</step> 
      <octave>4</octave> 
      </pitch> 
     <duration>2</duration> 
     <tie type="stop"/> 
     <voice>1</voice> 
     <type>eighth</type> 
     <stem>down</stem> 
     <staff>1</staff> 
     <notations> 
      <tied type="stop"/> 
      </notations> 
     </note> 
     <note default-x="298.62" default-y="-10.00"> 
     <chord/> 
     <pitch> 
      <step>D</step> 
      <octave>5</octave> 
      </pitch> 
     <duration>2</duration> 
     <voice>1</voice> 
     <type>eighth</type> 
     <stem>down</stem> 
     <staff>1</staff> 
     </note> 
     <backup> 
     <duration>6</duration> 
     </backup> 
     <direction placement="below"> 
     <direction-type> 
      <pedal type="start" line="yes"/> 
      </direction-type> 
     <staff>2</staff> 
     </direction> 
     <note default-x="37.50" default-y="-110.00"> 
     <pitch> 
      <step>G</step> 
      <octave>3</octave> 
      </pitch> 
     <duration>6</duration> 
     <voice>5</voice> 
     <type>quarter</type> 
     <dot/> 
     <stem>down</stem> 
     <staff>2</staff> 
     </note> 
     <direction placement="below"> 
     <direction-type> 
      <pedal type="stop" line="yes"/> 
      </direction-type> 
     <staff>2</staff> 
     </direction> 
     <barline location="right"> 
     <bar-style>light-heavy</bar-style> 
     <repeat direction="backward"/> 
     </barline> 
     </measure> 
    </part> 
    </score-partwise> 
+0

Poster un échantillon de ce que ' test.xml' contient donc d'autres personnes peuvent savoir ce que vous essayez de récupérer. – aneroid

+0

@aneroid J'ai ajouté le xml à la question originale. – dorien

Répondre

1

Ma solution à itérer sur toutes les notes et obtenir des propriétés musicales retour:

import music21 as m 

song = m.converter.parse('test.xml') 
# process the ties 
song = song.stripTies() 

# unfold repetitions 
i = 0; 
for a in song: 
    if a.isStream: 
     e = m.repeat.Expander(a) 
     s2 = e.process() 
     timing = s2.secondsMap 
     song[i] = s2 
    i += 1; 

# todo: add note onsets 

def getMusicProperties(x): 
    s = ''; 
    t=''; 
    s = str(x.pitch) + ", " + str(x.duration.type) + ", " + str(x.duration.quarterLength); 
    s += ", " 
    if x.tie != None: 
     t = x.tie.type; 
    s += t + ", " + str(x.pitch.ps) + ", " + str(x.octave); # + str(x.seconds) # x.seconds not always there 
    return s 


print('pitch, duration_string, duration, tie, midi pitch, octave') 
for a in song.recurse().notes: 

    if (a.isNote): 
     x = a; 
     s = getMusicProperties(x); 
     print(s); 

    if (a.isChord): 
     for x in a._notes: 
      s = getMusicProperties(x); 
      print(s); 

print("Done.") 

Pour obtenir le début des notes absolues, nous pouvons utiliser:

for el in song.recurse(): 
    totalOffset = el.getOffsetInHierarchy(song) 
0

Vous pouvez parcourir toutes les notes en faisant findall('.//note') puis itérer sur les enfants pour obtenir chaque étiquette et texte, ou tout ce que vous avez besoin.

>>> import xml.etree.ElementTree as ET 
>>> root = ET.parse('music.xml').getroot() 
>>> for note in root.findall(".//note"): 
...  for elem in note: 
...   print elem.tag, elem.text 
...  print 
... 
rest None 
duration 8 
voice 1 
staff 1 

pitch 

duration 1 
voice 5 
type 16th 
stem down 
staff 2 
beam begin 
beam begin 
+0

Intéressant. Cependant, je n'aurais pas les informations de niveau supérieur, par ex. heure de début absolue de la note. – dorien

+0

Puis itérer sur 'measure', puis sur' note', ou simplement sur tous les éléments enfants de 'measure'. – aneroid

+0

De même, certaines fonctionnalités de music21 (par exemple, supprimer des liens) auraient disparu et il y aurait des structures d'accords imbriquées et de nombreuses autres fonctionnalités à prendre en compte manuellement. – dorien