快过年了,搞个AI作曲,用TensorFlow训练midi文件

快过年了,搞个AI作曲,用TensorFlow训练midi文件,第1张

一、老张需求:AI作曲营造新年氛围

我有一个搞嵌入式的朋友老张,全名叫张三。是真的,他的身份证上就叫张三。据说,出生时,他父母准备了一堆名字。但是两人各执一派,大打出手。吵闹声引来隔壁李大爷:实在不行叫张三,我叫李四,也活得挺好。于是,互不相让的一对年轻夫妻,给孩子上了户口,起名叫:张三。

老张长大后,一直不和李大爷说话。李大爷告诉小张三:当时,如果,不是我冲进去,急中生智给你定下名字,你可能就没命了。听到这里,小张三才稍微得以释怀,并且给李大爷磕了个头,以示感谢。李大爷说:客气了,我起名字时,我父母也一样,最后还是你爷爷给起的李四,咱两家是世交。

我打断了老张:快说,找我么事?

老张说,其实我一直觉得,我不是普通的凡人。

“嗯,你特别的烦人”。

老张说,是平凡的“凡”。我今年40岁了,哎,你知道吗?我前天刚过完40岁生日,买了一个大蛋……

“说事情!”

老张说,兄弟,帮帮忙吧,我想搞一个发明,需要你人工智能方向的帮助。

我说,啊,你又搞发明?这次什么想法。

老张说,现在快过年了,我想搞一个仿老式留声机的盒子,安装到餐厅里面。

快过年了,搞个AI作曲,用TensorFlow训练midi文件,第2张

机器采用自助模式,只要顾客付钱,盒子就会自动播放一段,由AI生成的原创新年音乐,给他们送去祝福,扫码还可以下载保存。

我问老张,你有销售渠道吗?

老张说,放心吧,餐厅我都谈好了。他们提供场地和网络,我们只承担电费就行。

我沉思了一会,问老张:老张啊,你认识一个“耿”姓做手工的人吗?

老张说,相信我,我绝对不认识他,他的那些发明,不是没用,是真没用。

我点了点头:那就好,我支持你!

二、midi格式:便携式音乐描述文件

想让AI学会作曲,首先要找到一批音乐样本,让它学。

AI作曲,遵循“种瓜得瓜,种豆得豆”的原则:你给它训练什么风格的样本,它最终就会生成什么风格的音乐。

因此,我们需要找一些轻松活泼的音乐,这适合新年播放。

音乐文件的格式,我们选择MIDI格式。MIDI的全称是:Musical Instrument Digital Interface,翻译成中文就是:乐器数字接口。

这是一种什么格式?为什么会有这种格式呢?

话说,随着计算机的普及,电子乐器也出现了。电子乐器的出现,极大地节省了成本,带来了便利。

快过年了,搞个AI作曲,用TensorFlow训练midi文件,第3张

基本上有一个电子乐器,世间的乐器就都有了。

这个按钮是架子鼓,那个按钮是萨克斯。而在此之前,你想要发出这类声音,真的得敲架子鼓或者吹萨克斯管。

快过年了,搞个AI作曲,用TensorFlow训练midi文件,第4张

而且还有更为放肆的事情。你想用架子鼓一秒敲五下,得有专业的技能。但是用电子乐器,一秒敲五十下也毫不费力,因为程序就给搞定了。

这些新生事物的出现,常常让老艺术家们口吐鲜血。

电子乐器既然可以演奏音乐,那么就有乐谱。这乐谱还得有标准,因为它得在所有电子乐器中都起作用。这个“计算机能理解的乐谱”,就是MIDI格式。

下面我们就来解析一下MIDI文件。看看它的结构是怎么样的。

我找到一个机器猫(哆啦A梦)的主题曲,采用python做一下解析:

import pretty_midi
# 加载样本文件
pm = pretty_midi.PrettyMIDI("jqm.midi")
# 循环乐器列表
for i, instrument in enumerate(pm.instruments):
instrument_name = pretty_midi.program_to_instrument_name(instrument.program)
print(i, instrument_name) # 输出乐器名称

这个音乐,相信大家都很熟悉,就是:哦、哦、哦,哆啦A梦和我一起,让梦想发光……

通过pretty_midi库加载MIDI文件,获取它的乐器列表pm.instruments,打印如下:

Acoustic Grand Piano(原声大钢琴)、Glockenspiel(钢片琴)、String Ensemble(弦乐合奏) 、Muted Trumpet(闷音小号)、Trombone(长号)、Electric Bass(电贝斯)、Acoustic Guitar(原声吉他)、Flute(长笛)、Acoustic Grand Piano(原声大钢琴)、Harmonica(口琴)、Vibraphone(电颤琴)、Bagpipe(苏格兰风笛)、Marimba(馬林巴琴)……

我们看到,短短一个片头曲,就动用了近20种乐器。如果不是专门分析它,我们还真的听不出来呐。

那么,每种乐器的音符可以获取到吗?我们来试试:

# 承接上个代码片段,假设选定了乐器instrument
for j, note in enumerate(instrument.notes):
# 音高转音符名称
note_name = pretty_midi.note_number_to_name(note.pitch)
info = ("%s:%.2f->%.2f")%(note_name, note.start, note.end)

打印如下:

Acoustic Grand Piano

F#3:1.99->2.04 F#2:1.98->2.06 E2:1.99->2.07 C2:1.98->2.08 F#3:2.48->2.53 F#2:2.48->2.56 F#3:2.98->3.03 F#2:2.98->3.06 ……

通过获取instrumentnotes,可以读到此乐器的演奏信息。包含:pitch音高,start开始时间,end结束时间,velocity演奏力度。

名称pitchstartendvelocity
示例
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 快过年了,搞个AI作曲,用TensorFlow训练midi文件

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情