2016-04-15 10 views
1

Ich versuche, alle Noten mit ihrer Dauer (Takte) zu erhalten.Music21 Getting All notes with Durations

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) 

Above Code erzeugt eine Ausgabe folgende

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 
************* 

Ich weiß, dass Tonhöhe ein nur Namen der Note mit seiner Oktave ist, aber ich bin versucht, Notenwerte mit seiner Dauer (Maßnahmen) zu erhalten.

Auch wenn Sie mir dabei helfen können, könnten Sie auch erklären, warum p.notes nichts zurückgibt. Danke.

Antwort

2

Hier ist eine Version des Skripts, das tut, was Sie wollen:

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) 

Die Hauptsache Sie ertappt wurde das Verhalten der .notes Eigenschaft auf Stream Objekte war. music21 implementiert eine hierarchische Struktur von Containern einschließlich: Scores, Parts und Measures. Die meisten der iterativen schreibgeschützten Eigenschaften (einschließlich .notes) respektieren diese Hierarchie durch nicht beliebig absteigend. music21 stellt dann die Nur-Lese-Eigenschaft .flat zu zur Verfügung, die diese Hierarchie nur in die blattartigen Objekte (Noten und Pausen) einbügelt.

Das Objekt, das Sie von Ihrem Anruf p.parts.stream() war ein Score Objekt und so fragt in einem leeren Iterator für seine .notes führte direkt zurückkamen, da es keine Notes war, die diese Score direkte Kinder waren. Aber mit .flat.notes flacht die Hierarchie ab und gibt Ihnen direkten Zugriff auf die Notes.

In der Lösung auch feststellen, dass ich die eher direkt .pitch.name, .pitch.octave und .duration.quarterLength Werte zugegriffen haben gefragt als nur für die str Darstellung eines Note Objekt.

In Ihrer Frage scheinen Sie die Begriffe "duration" und "measure" zusammenzufassen. In der Musiktheorie ist die Dauer die Zeit, in der eine Note dauert (oft in Beats gemessen), und "measure" ist der Name einer metrischen Division, die eine bestimmte Anzahl von Beats (aus Noten und/oder Pausen) enthält aktuelle Taktart in Betrieb. In der Notation sind die Messungen durch vertikale Linien auf dem Notensystem begrenzt.