2016-04-15 18 views
1

すべての音符の再生時間(メジャー)を取得しようとしています。上記のコードMusic21再生時間のあるすべてのノートを取得する

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) 

私はピッチがそのオクターブとノートの名前だけですが、イムは、その期間(対策)と音符の値を取得しようとしていることを知っている次の出力

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

を生成します。

また、私がこれを手伝うことができれば、p.notesが何も返さない理由も説明できますか? ありがとうございます。

答えて

2

はここで何をしたいんスクリプトのバージョンです:

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) 

あなたがによって巻き込まれた主なものは、Streamオブジェクト上.notesプロパティの動作でした。 music21は、Scores,PartsおよびMeasuresを含むコンテナの階層構造を実装しています。ほとんどの反復読み取り専用プロパティ(.notesを含む)は、その階層をではなく、で任意に降格します。 music21は、読み取り専用プロパティ.flatにフラット化して、の階層構造をリーフタイプのオブジェクト(ノートとレスト)に提供します。

あなたはp.parts.stream()に戻ってあなたの呼び出しから得たオブジェクトがScore目的であったし、そのScoreの直接の子供だった何Notesがなかったようにその.notesに直接尋ねることは、空のイテレータになりました。しかし、.flat.notesを使用すると、階層が平坦化されるため、Notesに直接アクセスできます。溶液に

は、また、私は.pitch.name.pitch.octave.duration.quarterLengthおよび値にアクセスし、直接ではなく、単にNoteオブジェクトのstr表現を求めたことに気づきます。

あなたの質問では、 "期間"と "測定"のコンセプトが混在しているようです。音楽理論では、継続時間はノートが持続する時間(しばしば拍で測定される)であり、「測定」は、(拍子で測定される)いくつかの拍数現在の拍子は動作中です。表記法では、測定値はスタッフに縦線で区切られています。

関連する問題