pythonプログラミング で楽譜作成!| music21 ~ 繰り返し処理 | パート | コード

pythonプログラミング で楽譜作成!| music21 ~ 繰り返し処理 | パート | コード

みなさん、こんにちは!

今回はmusic21を用いた繰り返し処理のsampleを紹介します。

今回作るもの

以下のイメージのような楽譜を作ります。

① 3つのパートに分ける

② パート1は「C D E D」の繰り返し

③ パート2は「E F G F」の繰り返し

④ パート3は「C major」のコードを全音符で繰り返し

参考にしたユーザガイド↓

プログラム

以下のとおりです。

from music21 import *

s = stream.Score(id="mainsheet")
p0 = stream.Part(id="part0")
p1 = stream.Part(id="part1")
p2 = stream.Part(id="part2")

for i in range(8):
    #Part0
    p0.append(note.Note('C4'))
    p0.append(note.Note('D4'))
    p0.append(note.Note('E4'))
    p0.append(note.Note('D4'))

    #Part1
    p1.append(note.Note('E4'))
    p1.append(note.Note('F4'))
    p1.append(note.Note('G4'))
    p1.append(note.Note('F4'))
    
    #コード
    cMaj = chord.Chord(["C4","E4","G4"])
    cMaj.quarterLength=4
    p2.append(cMaj)
    

s.insert(0,p0)
s.insert(0,p1)
s.insert(0,p2)

s.show()
s.show('midi')

1小節毎に移調をする場合

transposeを用いる事で、1小節毎に移調させることも可能です。

from music21 import *

s = stream.Score(id="mainsheet")
p0 = stream.Part(id="part0")
p1 = stream.Part(id="part1")
p2 = stream.Part(id="part2")

for i in range(8):
    #Part0
    p0.append(note.Note('C4').transpose(i))
    p0.append(note.Note('D4').transpose(i))
    p0.append(note.Note('E4').transpose(i))
    p0.append(note.Note('D4').transpose(i))

    
    #Part1
    p1.append(note.Note('E4').transpose(i))
    p1.append(note.Note('F4').transpose(i))
    p1.append(note.Note('G4').transpose(i))
    p1.append(note.Note('F4').transpose(i))
    
    #コード
    cMaj = chord.Chord(["C4","E4","G4"])
    cMaj.quarterLength=4
    p2.append(cMaj.transpose(i))
    

s.insert(0,p0)
s.insert(0,p1)
s.insert(0,p2)

s.show()
s.show('midi')

輪唱させる場合

サンプルプログラムは以下の通りです。

from music21 import *

s = stream.Score(id="mainsheet")

p0 = stream.Part(id="part0")
p1 = stream.Part(id="part1")
p2 = stream.Part(id="part2")

#かえるの歌
sStr = 'c4 d4 e4 f4 e4 d4 c2 e4 f4 g4 a4 g4 f4 e2 '
sStr +='c4 r4 c4 r4 c4 r4 c4 r4 '
sStr +='c8 c8 d8 d8 e8 e8 f8 f8 e4 d4 c2'

p0 = converter.parse('tinyNotation: 4/4 ' + sStr)
p1 = converter.parse('tinyNotation: 4/4 ' + 'r1 r1 ' + sStr)
p2 = converter.parse('tinyNotation: 4/4 ' + 'r1 r1 r1 r1 ' + sStr)
    
s.insert(0,p0)
s.insert(0,p1)
s.insert(0,p2)

s.show()
s.show('midi')

輪唱の人数を可変的に変えるのであれば、以下の様な書き方でしょうか?

例では4名の輪唱です。

tinyNotationの書き方として、「同じ長さの音符が連続する時は数字を省略できる」ルールがありますので、今回はその書き方を元に楽譜を書きました。(上記のカエルの歌と同意です。)

from music21 import *

class vocalist:
    def __init__(self,arg1,arg2):
        junban = arg1
        kyoku = arg2
        
        self.p = stream.Part()
        self.p = converter.parse('tinyNotation: 4/4 ' + (' r1 r1 ')*junban +  kyoku)


#かえるの歌
uta = 'c4 d e f e d c2 e4 f g a g f e2 '
uta +='c4 r c r c r c r '
uta +='c8 c d d e e f f e4 d c2'

vocalists = 4


s = stream.Score(id="mainsheet")

for i in range(vocalists):
    tmp_vocalist = vocalist(i,uta)
    s.insert(0, tmp_vocalist.p)

s.show()
s.show('midi')

次のステップへ