python玩音乐

再Github上看到一个rnn生成音乐的小案例,觉得非常有趣。接下来没事可以玩玩音乐方面的。从零开始学习,记录一下学习笔记。pip install music21

1.音符note

from music21 import *

#1.音符类型music.note.Note
f=note.Note('F5#')#创建音高维f5#的音符

f.name#音符的音名属性》》'F#'

f.step#不包含变化音和八度信息的音级》》'F'

f.octave#八度信息》》》5即第5个八度

f.pitch#音符的音高,返回一个音高对象》》》<music21.pitch.Pitch F#5>

f.pitch.pitchClassString#音级,以C为0级,》》》'6'》》》意思是有6个半音阶

f.duration#音符的时值,返回一个时值对象》》》<music21.duration.Duration 1.0>

f.duration.type#音符的时值类型》》》'quarter'

f.octave=6#改变八度

f.octave》》》》6

f.pitch#<music21.pitch.Pitch F#6>

f#<music21.note.Note F#>

f.pitch.accidental=pitch.Accidental(-1)#pitch.accidental是变化音的类型

f#<music21.note.Note F->

f.duration.dots+=1#改变浮点数量

f.duration#<music21.duration.Duration 1.5>

f.duration.quarterLength=2#直接改变时值,以四分音符计

f.duration#<music21.duration.Duration 2.0>

2.和弦

#2.和旋music21.chord.Chord
cMajor=chord.Chord(['c4','e4','g4'])
print(cMajor)#<music21.chord.Chord C4 E4 G4>


cMajor=chord.Chord()
cMajor.add(note.Note('c4'))
cMajor.add(note.Note('e4'))
print(cMajor)#<music21.chord.Chord C4 E4>

cMajor.duration#和旋时值》》》<music21.duration.Duration 1.0>

cMajor.duration.quarterLength=2#修改和旋时值

cMajor.duration#<music21.duration.Duration 2.0>

3.乐句

#3.乐句streamStream是在music21中类似list的基本单位,它可以储存任意music21对象及其组合。
stream1=stream.Stream()

stream1.append(f)

stream1#<music21.stream.Stream 0x17aee4a7a08>

print(len(stream1))#1

stream1.show('text')#0.0} <music21.note.Note F->

n3=note.Note('D#5')
stream1.repeatAppend(n3,4)

print(len(stream1))#5

stream1.show('text')
'''{0.0} <music21.note.Note F->
{2.0} <music21.note.Note D#>
{3.0} <music21.note.Note D#>
{4.0} <music21.note.Note D#>
{5.0} <music21.note.Note D#>'''

for thisNote in stream1:
    print(thisNote.step)
'''F
D
D
D
D'''

#也支持如列表的查找和删除:
noteIndex=stream1.index(f)#找到这个音符的索引值
stream1.pop(noteIndex)#把这个音符删除 》》》<music21.note.Note F->

stream1[2]#<music21.note.Note D#>

stream1.show('text')
'''{2.0} <music21.note.Note D#>
{3.0} <music21.note.Note D#>
{4.0} <music21.note.Note D#>
{5.0} <music21.note.Note D#>'''

#stream可以嵌套使用,形成层级关系。
stream2=stream.Stream()
note2=note.Note('D#5')
stream2.insert(0,note2)#指定位置插入音符
stream2.append(stream1)#结尾加上乐句
stream2.show('text')#可以看出层级关系
'''{0.0} <music21.note.Note D#>
{1.0} <music21.stream.Stream 0x17aeda1a548>
    {2.0} <music21.note.Note D#>
    {3.0} <music21.note.Note D#>
    {4.0} <music21.note.Note D#>
    {5.0} <music21.note.Note D#>'''

stream2.pitches#列出所有音高
'''[<music21.pitch.Pitch D#5>,
<music21.pitch.Pitch D#5>,
<music21.pitch.Pitch D#5>,
<music21.pitch.Pitch D#5>,
<music21.pitch.Pitch D#5>]'''
stream1.analyze('ambitus')<music21.interval.Interval P1>

4.小结

#4.小节Measure,需要插入到乐句中
m1=stream.Measure(number=0)
m1.repeatAppend(f,4)
m2=stream.Measure(number=1)
m2.repeatAppend(note2,2)
stream1=stream.Stream()
stream1.append(m1)
stream1.append(m2)

ts=meter.TimeSignature()

ts.denominator=4

ts.numerator=int(m1.duration.quarterLength)

m1.insert(0,ts)

m1.show('text')
'''{0.0} <music21.meter.TimeSignature 8/4>
{0.0} <music21.note.Note F->
{2.0} <music21.note.Note F->
{4.0} <music21.note.Note F->
{6.0} <music21.note.Note F->'''

5.生成乐谱

#5.生成乐谱Score,将乐句插入到声部,声部再插入到乐谱
score=stream.Score()#创建一个乐谱对象
part=stream.Part()#添加声部
part.partName='example part'
part.append(stream2)#将之前的乐句添加到声部中
score.insert(0,part)#将声部插入到乐谱中
#乐谱添加题目、作者等信息
score.insert(0,metadata.Metadata())
score.metadata.title='example title'#题目
score.metadata.composer='example composer'#作曲家
score.write('xml',fp=r'example.xml')#'D:\\DeepLearning\\example.xml'》》》》生成xml文件

  

posted @ 2021-07-12 11:13  Turing-dz  阅读(163)  评论(0编辑  收藏  举报