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文件

浙公网安备 33010602011771号