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