zoukankan      html  css  js  c++  java
  • 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文件
    

      

  • 相关阅读:
    解决VB6.0中不能加载MSCOMCTL.OCX的错误提示
    修改SQL Server数据库表的创建时间简单直接有效的方法
    如何将SQL Server 2000备份的数据库文件还原(升级)为SQL Server 2005或更高版本的数据库?
    如何创建和还原SQL Server 2005数据库?
    SQL Server 2005详细安装过程及配置
    如何创建和还原SQL Server 2000数据库?
    Python接受流式输入
    图的遍历(Python实现)
    Python实现多属性排序
    python构造二维列表以及排序字典
  • 原文地址:https://www.cnblogs.com/Turing-dz/p/13278164.html
Copyright © 2011-2022 走看看