Python编曲实践(一):通过Mido和PyGame来编写和播放单轨MIDI文件

前言

人工智能编曲是一个十分复杂的话题,而这一话题的起点便是选择一个良好的编曲媒介,使得开发者能够将AI的音乐灵感记录下来,并且能够很方便地将其播放、编辑、分享。
MIDI文件是电脑编曲的一种通用格式,它容易通过音乐编辑软件导入、导出,也有很多现成的库函数来对其进行编辑加工。
首先,我找到了PythonWiki提供的音乐库合集 - PythonInMusic,在这里上百个库之中,仅有寥寥几个是支持Python3且仍有活力的,在其中Mido和PyGame.midi库是其中比较好用的两个库,本篇文章就采用这两个库来进行MIDI文件的编写和播放。

对摇滚史密斯和独立电子感兴趣的朋友们,欢迎关注鄙人B站主页,感谢大家支持!

Mido编曲

关于用Mido库来创建一个新的MIDI文件,官方文档给出了如下示例代码:

from mido import Message, MidiFile, MidiTrackmid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)track.append(Message('program_change', program=12, time=0))
track.append(Message('note_on', note=64, velocity=64, time=32))
track.append(Message('note_off', note=64, velocity=127, time=32))mid.save('new_song.mid')

这段示例代码虽然短,可是已经将编写MIDI文件的基本思路完全表达出来了:

  • 首先创建一个MidiFile对象
  • 创建一个(或多个)MidiTrack对象,并将其append到MidiFile中
  • 向一个(或多个)MidiTrack对象内添加Message对象(包括program_change、note_on、note_off等)和MetaMessage对象(用以表示MIDI文件的节拍、速度、调式等属性)
  • 保存MidiFile对象

下面我通过对Message和MetaMessage这两个十分重要的概念的进一步说明,来加深大家理解

Message

Message对象的类型十分复杂,是根据MIDI文件的格式实现的,官方文档有详细列表,在此我们不一一列举,而仅对我使用到的三种Message来进行分析:

1. control_change

program_change是用于更改不同channel的乐器音色的,格式为:

Message('program_change', channel, program, time=0)
  • channel是指定的0~15的一个值,因为MIDI文件给我们提供了默认的16个通道,通过这个值可以选择更改乐器的通道编号;
  • program对于乐器编号,点此可以查到不同乐器对应的编号

2.note_on

note_on消息,可以理解为音符的开始,其格式为

Message('note_on', note, velocity, time, channel)
  • 其中note是0~127的一个数字,代表音符的高低,通过实践证明60代表的音高是C4,仅供参考;
  • velocity代表音强,也是0~127的一个数字,默认为64,若要体现音符强度的变化可以修改它;
  • time是时间变量,是十分复杂的一个参数,在note_on信息这里可以理解为该音符写在前一个音符结束多久之后,单位是微秒(ms);
  • channel同上一个函数一样,代表通道的编号,即将这个音符写到哪个通道之上,这可能起到更改乐器的效果

3.note_off

note_off消息,可以理解为音符的结束,一般紧跟在note_on消息之后,其格式与上面的相同

Message('note_off', note, velocity, time, channel)
  • note参数与note_on消息保持一致,否则有可能不能成功写入
  • velocity同note_on保持一致就好
  • time在此处表示的意义是音符的持续时间,也是以微秒(ms)为单位
  • channel也是表示通道号,与note_on保持相同即可

MetaMessage

MetaMessage的种类也很多,可以参考官方文档,我只使用了3种MetaMessage,列举在下面:

	tempo = 75tempo = mido.bpm2tempo(bpm)meta_time = MetaMessage('time_signature', numerator=3, denominator=4)meta_tempo = MetaMessage('set_tempo', tempo = tempo, time=0)meta_tone = MetaMessage('key_signature', key='C')
  • 其中time_signature是对于节拍的表示,在此处即3/4,参数以分子和分母来命名,十分清晰
  • set_tempo是用于设置音乐的节奏快慢,由于这里tempo的单位不是BPM(Beat Per Minute),故一般配合bpm2tempo来使用
  • key_signature是用于设置音乐的调式的,在此处我设置为C大调,若是小调的话仅需要在后面添加小写字母m,如Cm表示C小调

编程实现

1. play_note函数

由于Message对象需要的参数比较多而且单位转换复杂繁琐,故我自己编写了一个play_note函数来更加方便编曲:

def play_note(note, length, track, base_num=0, delay=0, velocity=1.0, channel=0):meta_time = 60 * 60 * 10 / bpmmajor_notes = [0, 2, 2, 1, 2, 2, 2, 1]base_note = 60track.append(Message('note_on', note=base_note + base_num*12 + sum(major_notes[0:note]), velocity=round(64*velocity), time=round(delay*meta_time), channel=channel))track.append(Message('note_off', note=base_note + base_num*12 + sum(major_notes[0:note]), velocity=round(64*velocity), time=round(meta_time*length), channel=channel))
  • 由于我要编的歌曲是大调曲式,而大调的音阶结构是“全全半全全全半”(这一规律可以通过钢琴键盘的黑白键安排来得到,在此不赘述乐理知识),故我创建一个major_notes数组,用于根据根音计算出某一个音符的音高;
  • meta_time是根据bpm而计算出的每个节拍的时间长度,用于得到Message中的time参数
  • base_note是通过实验得到的C4的音高,作为根音来搭配major_notes得到每个音符的音高
  • base_num用于切换目前所在的音域,负值表示低几度,正值表示高几度
  • velocity是一个0~2的浮点数,以64为基准来进行比较

2. 编曲

下面开始正式编曲了,我选择的是《大海啊,故乡》这首歌,简谱如下:
大海啊,故乡
由于我们是纯乐器演奏,而前奏与后面重复率极高,故略过前奏。之后我将此音乐以八小节为单位分为3个部分,其中后两部分仅一个半音部分有区别。根据此特征,我编写了chorus和verse两个函数,代码如下:

def verse(track):play_note(1, 0.5, track)       # 小play_note(2, 0.5, track)       # 时play_note(1, 1.5, track)       # 候play_note(7, 0.25, track, -1)  # 妈play_note(6, 0.25, track, -1)  # 妈play_note(5, 0.5, track, -1, channel=1)  # 对play_note(3, 0.5, track, channel=1)      # 我play_note(3, 2, track, channel=1)        # 讲play_note(3, 0.5, track)           # 大play_note(4, 0.5, track)play_note(3, 1.5, track)           # 海play_note(2, 0.25, track)          # 就play_note(1, 0.25, track)          # 是play_note(6, 0.5, track, -1, channel=1)  # 我play_note(2, 0.5, track, channel=1)      # 故play_note(2, 2, track, channel=1)        # 乡play_note(7, 0.5, track, -1)  # 海play_note(1, 0.5, track)play_note(7, 1.5, track, -1)  # 边play_note(6, 0.25, track, -1)play_note(5, 0.25, track, -1)play_note(5, 0.5, track, -1, channel=1)  # 出play_note(2, 0.5, track, channel=1)play_note(2, 2, track, channel=1)        # 生play_note(4, 1.5, track)       # 海play_note(3, 0.5, track)       # 里play_note(1, 0.5, track)       # 成play_note(6, 0.5, track, -1)play_note(1, 3, track)         # 长def chorus(track, num):play_note(5, 0.5, track)  # 大play_note(6, 0.5, track)play_note(5, 1.5, track)  # 海play_note(3, 0.5, track)  # 啊play_note(5, 0.5, track, channel=1)  # 大play_note(6, 0.5, track, channel=1)play_note(5, 2, track, channel=1)    # 海play_note(6, 0.5, track)  # 是(就)play_note(5, 0.5, track)  # 我(像)play_note(4, 0.5, track)  # 生(妈)if num == 1:play_note(1, 0.25, track, channel=1) # 活play_note(1, 0.25, track, channel=1) # 的if num == 2:play_note(1, 0.5, track, channel=1)  # (妈)play_note(6, 0.5, track, channel=1)      # 地(一)play_note(5, 0.5, track, channel=1)play_note(5, 3, track, channel=1)        # 方(样)play_note(3, 0.5, track)  # 海(走)play_note(4, 0.5, track)  # 风(遍)play_note(3, 1.5, track)  # 吹(天)play_note(2, 0.25, track) # (涯)play_note(1, 0.25, track)play_note(6, 0.5, track, -1, channel=1)  # 海(海)play_note(2, 0.5, track, channel=1)      # 浪play_note(2, 2, track, channel=1)        # 涌(角)play_note(4, 0.5, track)              # 随(总)play_note(5, 0.5, track)              # 我(在)play_note(4, 0.5, track)              # 漂(我)play_note(3, 0.5, track)              # 流(的)play_note(1, 0.5, track, channel=1)   # 四(身)play_note(6, 0.5, track, -1, channel=1)play_note(1, 3, track, channel=1)     # 方(旁)

3. play_midi函数

PyGame的midi模块提供了一个很好的播放midi的功能,由于代码非原创,故仅仅贴出这个函数:

def play_midi(file):freq = 44100bitsize = -16channels = 2buffer = 1024pygame.mixer.init(freq, bitsize, channels, buffer)pygame.mixer.music.set_volume(1)clock = pygame.time.Clock()try:pygame.mixer.music.load(file)except:import tracebackprint(traceback.format_exc())pygame.mixer.music.play()while pygame.mixer.music.get_busy():clock.tick(30)

总结

  • 至此编曲工作已经告一段落,顺便向大家推荐一款免费MIDI播放与编辑软件MidiEditor。虽然没有Pro Tools和Cubase等专业编曲软件的全面功能,但是对于MIDI文件编写的基本需求而言足够了,我们的作品在MidiEditor像这样:
    MidiEditor

  • 单音轨的音乐听起来还是比较单薄,这篇文章也是我进行智能编曲的尝试和敲门砖,争取之后能够使用更简便的方法做出更复杂更动听的音乐,谢谢关注!

  • 完整工程见 Github

参考资料

  1. Mido官方文档
  2. PyGame播放MIDI文件参考
  3. 简谱来源
  4. MIDI Messages 深入解析
  5. MIDI音色代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25506.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑版fl studio水果音乐编曲软件 v20.8新中文版

FL Studio又称水果萝卜,是一款专业的音乐制作软件, FL Studio新版本体积过大,小编故提供FL Studio 20.8中文收藏高级版,这个版本可说是非常的经典。 01,安装第一步:flstudio20.8英文原版安装文件。安装时一…

fl studio 20.9Mac新版中文水果音乐制作工作站编曲软件

fl studio 20.9Mac水果音乐制作工作站编曲软件 fl studio 20.9Mac是Image-Line公司出品音乐制作工作站FL Studio 20.9水果音乐制作工作站一个功能齐全的音乐编曲工具,可以为需要创作高品质音乐曲目的专业和业余艺术家提供多轨录音,排序和混音。借助FL S…

Image-Line新版flstudio20.9水果编曲制作音乐

导读:昨晚Image-Line发布FL Studio 20.9,而今年也是他们成立第21周年。FL 20.9一经发行便引起了广大制作人的关注,今天我们来介绍一下这款软件。 即使你不是一位制作人,你也肯定听说过FL Studio 20.9或是“水果”的大名。在各大编…

2021年4款好用的音乐编曲软件推荐

对很多音乐爱好者而言,从单独的欣赏作品,过渡到按自己的心情创作作品,是一段奇妙又欣喜的体验。而音乐编曲,尤其是电音编曲,Daw(宿主软件)是一个很重要的元素。 编曲软件很多,但实际…

《零基础作曲编曲完全教程》(合辑)崛起的卧室音乐人 编曲教程 作曲教程精进篇

1、精进篇1展开音乐 必须反复 崛起的卧室音乐人精静篇这节是精进篇的第一讲,展开音乐入门篇的比较务实。精进篇我会把重点放在拓宽思维以及提高认知上,**经过了一番折腾,一个小乐段大家应该都能写出来了吧。**但此时距离完整的音乐还有一段比…

MIDI 音乐程序设计 (可以自己编曲的快乐)

乐器数字接口(MIDI)简介 乐器数字接口(Musical Instrument Digital Interface,MIDI),是20世纪80年代初为解决电声乐器之间的通信问题而提出的,是电子乐器制造商们建立的通信标准,是电子乐器之间以及电子乐…

FL Studio21水果编曲高级版本音乐编曲工具

说到电音已经不是很新鲜的话题了,在这个自媒体视频为王的年代,相信很多年轻人都想成为一个优秀的up主,在各大媒体网站上上传一些自己录制的游戏剪辑,再配上一段劲爆的电音,可能视频就会从3分变成7分的评价了。筱黑君也…

Fruity Loops Studio2022最新版水果音乐编曲软件

FL Studio水果编曲英文名:Fruity Loops Studio,简称FL,是国人熟知的水果编曲工具,圈内音乐人习惯叫它“水果”。FL Studio是一个全能音乐制作环境或数字音频工作站,可以进行编曲、剪辑、录音、混音 ,让电脑…

FL Studio21傻瓜式编曲音乐编辑器FL水果软件

在我看来软件只是工具.不管哪个都可以做任何风格的音乐,区别只是软件操作相对而言fl studio更容易上手,在国内也很受欢迎,弱项应该是混音上如果你做电音的话 还是FL更好一些 ,因为他就是为舞曲而生的!flstudio内配置音源、插件、录音软件、混音效果!而FLStudio则更偏向于电子音…

自己写歌怎么编曲?4款超好用编曲软件推荐

对很多音乐爱好者而言,从单独的欣赏作品,过渡到按自己的心情创作作品,是一段奇妙又欣喜的体验。而音乐编曲,尤其是电音编曲,Daw(宿主软件)是一个很重要的元素。 编曲软件很多,但实际…

FL StudioV21电脑版水果编曲音乐编辑软件

这是一款功能十分丰富和强大的音乐编辑软件,能够帮助用户进行编曲、剪辑、录音、混音等操作,让用户能够全面地调整音频。FL水果最新版是一款专业级别的音乐编曲软件,集合更多的编曲功能为一身,可以进行录音、编辑、制作、混音、调…

FL Studio21中文版编曲音乐宿主软件

FL Studio这款宿主应该算得上是全中国最多人用的宿主软件了,不知道有多少接触音乐制作的同学最开始就是用的这个,在我看来,FL Studio是对小白同学比较友好的,界面简单,自带的素材多,而且比较适合做电音。FL…

Android平台上做一个完美的音乐频谱--Music Audio Glow

一直在网上寻找一个做得比较好的音乐的频谱,始终未能找到一个很合适自己用的音乐频谱,后面实在没办法,就自己研究着做了,基本实现的功能有: 1、能够修改频谱柱子的图案 2、能够修改整个软件的颜色,包括&a…

FL Studio2022水果编曲音乐制作软件自带完整插件

FL Studio 2022是一款非常好用的音乐制作软件,又称水果编曲软件,软件集合了录音、混音、编辑等多种功能于一体,能够完成各种各样的音乐编曲工作,强大的音乐制作功能受到了很多用户的喜爱,帮你完成各种类型音乐的编曲制…

FL Studio21中文版D编曲数字音乐工作软件

随着现在人们的生活水平不断提高,我们的精神生活也越来越丰富,对于现在的年轻人来说,DJ舞曲是一个较受欢迎的领域,有许多年轻人对DJ这个职业感兴趣,想要深入了解DJ编曲这份工作,那么今天我们就来说一说DJ编…

FL Studio2023最新版编曲音乐制作数字音频软件

FL Studio2023即“Fruity Loops Studio”,也就是众所熟知的水果软件, 全能音乐制作环境或数字音频工作站(DAW)。FL Studio可以编曲、剪辑、录音、混音,让你的计算机成为全功能录音室。 FL Studio2023是一个完整的软件音…

FL Studio21电脑版免费音乐编曲宿主软件下载

编曲主要考验电脑的处理器(CPU)性能、声卡。所以配置电脑的时候有条件的伙伴可以着重考虑这两方面。现在市面上惠普、戴尔、华为、苹果等品牌的电脑,在四五千这个范围的商务本,就可以胜任编曲工作。但是在一些较为庞大的工程中可能…

同样的参数,jmeter请求失败,postman可以请求成功的原因

postman可以不用手动输入编码 jmeter需要手动输入编码方式 在jmeter路径后加入编码方式就可以请求成功了

HTTP Postman发请求响应失败问题

1、Postman发送请求时会自动加上一些请求头信息,如:Postman自带的token信息有时候会导致一些系统不识别而响应错误信息,可以关闭Postman的token信息

postman请求失败

先确保自己的请求链接没有问题,再来找找postman setting的问题 首先看看setting里面的ssL这个是否处于off状态没有的话,设置一下off重启 如果还不行,就看看这个代理是否打开了,打开的话,也设置掉,本人就…