![AI源码解读:推荐系统案例(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/894/44509894/b_44509894.jpg)
项目1 PROJECT 1 基于马尔可夫模型的自动即兴音乐推荐
本项目通过用户选择主音调式即兴参数,输入歌曲信息BPM(Beat Per Minute,节拍)、弦级数及重复次数后生成音乐,实现上下文相关的即兴演奏。
1.1 总体设计
本部分包括系统整体结构和系统流程。
1.1.1 系统整体结构
系统整体结构如图1-1所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P13_1.jpg?sign=1739353166-W7ZBveM8fqnWFhUCf9lntVng8DgOfrCn-0-7c04cf6a2aa1fe05ec6ec152fee41f33)
图1-1 系统整体结构
1.1.2 系统流程
伴奏制作、即兴旋律生成的流程如图1-2所示,贝斯模块及GUI (Graphical User Interface,图形用户接口)制作流程如图1-3所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P14_1.jpg?sign=1739353166-BnlmLS3dIKcXW8L5NWX5tQaLpOIHkI4x-0-2fb59038bd2d96b0818bcafc24c2047a)
图1-2 伴奏制作、即兴旋律生成的流程
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P15_1.jpg?sign=1739353166-C9bbLyY5CJGjhN1dajjPDv1VcICbAy4e-0-0f1f54fd826680f63c65df1e713054a1)
图1-3 贝斯模块及GUI制作流程
1.2 运行环境
本部分包括Python环境和PC环境配置。
1.2.1 Python环境
需要Python 3.7及以上配置,安装库包括hmmlearn、numpy、pypianoroll、pygame、mido、musthe、PyQt 5、PyQt-tools(仅支持Windows),在Windows cmd中使用以下命令:
pip install hmmlearn、numpy、pypianoroll、pygame、mido、musthe
安装PyQt 5和PyQt-tools:
pip install sip pip install PyQt5 pip install PyQt-tools
将当前目录下的4.ui转换输出成4.py文件:
python - m PyQt5.uic.pyuic 4.ui - o 4.py
1.2.2 PC环境配置
本程序最终将打包成.exe,在Windows环境下运行。安装能读取并播放MIDI文件程序的用户可自行查看生成文件;反之,在选项卡中选择“自动播放”选项播放生成的MIDI文件。
1.3 模块实现
本项目包括5个模块:钢琴伴奏制作、乐句生成、贝斯伴奏制作、汇总歌曲制作和GUI设计,下面分别给出各模块的功能介绍及相关代码。
1.3.1 钢琴伴奏制作
用户选择调式、输入和弦级数后,首先,将和弦级数转换为和弦名称;其次,用musthe将和弦名称转换为对应音;最后,根据用户选择的预置节奏型向MIDI中的钢琴轨写入钢琴伴奏。
1.和弦的实现
本部分代码完成添加和弦功能。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P16_1.jpg?sign=1739353166-Lb9b59QEaCAP2xeAvgWaIXagwFEGLiar-0-641b94e42c08570c9277875e36132898)
2.和弦级数转为当前调式音阶
将用户输入的和弦级数(数字1~7)转换为绝对的和弦名称,再用musthe()方法将和弦名称转为当前调式下的音阶。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_1.jpg?sign=1739353166-4OSaKKA8BAIFVJ2xhfZ8Gbmpq779W6vY-0-7d97fe0feb5eefcbff7deeee94c5bcb6)
3.根据预置节奏生成伴奏
本项目为4/4拍和3/4拍的歌曲各提供了6种预置节奏型,共12种节奏型的钢琴伴奏,其中预置节奏型由日常演奏经验而得,是常用的节奏型,能适应大多数曲目。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_2.jpg?sign=1739353166-3kaqeX1WdXz7olc6wcWCq0TsImrL4yz0-0-b10543f2147d7e71325a4e8ba4af4de3)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P18_1.jpg?sign=1739353166-ynJqG95Py4H50f3v69Wdtt5xUEC1wYBH-0-bf2696e9c17429af1cc29ad35bd15c27)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P19_1.jpg?sign=1739353166-5dc6xxfE5suHNdAJ7yO3taz0Vece4iVN-0-42b442e56a720fe29717b0f5201edd87)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P20_1.jpg?sign=1739353166-CC9HLJRGzsquMCComU5McJhF7LkXmFf6-0-a30b6e563cf2b004ea29a4bcec4a8be6)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_1.jpg?sign=1739353166-rqaV6B5pVrAwaYBrspMLDphvrhVMjMQn-0-bd61945a0df4c72bbf83e1daa3050bc3)
1.3.2 乐句生成
使用hmmlearn,利用马尔可夫模型生成旋律和节奏。其中旋律表示为数字1~7,加上0和-1,1~7对应音阶中第1~7音(五声音阶对应五个音),0对应休止符,-1对应延音音符;节奏表示为数字1、2、4、8、16、32、6、12、24,分别表示全音符、二分音符、四分音符、八分音符等。
1.添加音符
音轨内添加一个普通音符/休止符/延音音符的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_2.jpg?sign=1739353166-yizFUWkGLEYboksanJCtZBBzr3USFARJ-0-dbb71f789a64fef3ff7d489c6626d630)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P22_1.jpg?sign=1739353166-j6HPoYwJuhrXa8Pk1tYBv5mPANBJHhNk-0-f0540fa9a9863bee0fa16c70ad3737e7)
2.旋律生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_1.jpg?sign=1739353166-kKYPA5wppeQuv7FXbzD5KDVYfOs40mNY-0-2b80b639b9a4eead1568ccc50cf7df77)
3.节奏生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_2.jpg?sign=1739353166-YkGMFkApWg3eO8nifsk4NqxCWXhLCtCb-0-44393168b5c435fb4999f5a780842c7d)
1.3.3 贝斯伴奏制作
为丰富曲目内容,预置14组贝斯供用户选择。
1.添加贝斯轨
向歌曲内添加贝斯轨的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P24_1.jpg?sign=1739353166-KBb9zlQGeTf8LumQncJ6WOPfcNDcibiN-0-87a7bb463d146f41151f887dd65ddecf)
2.预置贝斯轨
根据日常演奏经验,对4/4拍和3/4拍的歌曲分别给出7种常用贝斯轨,共14种,其中函数的输入chord_progression可以是和弦名称,也可以是和弦级数。例如:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P25_1.jpg?sign=1739353166-Z6KN5BKexpJxKRjHKahhowxQ2y6KgmVV-0-8fa6fa1179a236ce4e851ae6013c8ec5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P26_1.jpg?sign=1739353166-uqJm0Irg0Lf7De7LHbeTW3qmwHssFxgj-0-96285f52c29ce7c8601d3554ab4d6f1c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P27_1.jpg?sign=1739353166-S3yr0otGejhXMnAU5lS5lMMOYRJHRquh-0-4befe992ff03b3512c2d29e7e539dce1)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P28_1.jpg?sign=1739353166-gyW7leq57kbvPHXSxJ7ve6CKV6KqLzSL-0-342ef8a0221a53478ee571de839945d1)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_1.jpg?sign=1739353166-6kbCNmRqkDVNPauCOLMYSUmibdPzEe52-0-c4471e3a21e3c4145736ef5fa3e5198a)
1.3.4 汇总歌曲制作
完成钢琴伴奏制作、乐句生成模块后,使用类Impromptu调用并完成MIDI文件的写入与播放,并使用装饰器完成日志记录,函数piano_roll_test()实现音乐的可视化。
1.日志模块
制作歌曲时记录日志,在当前目录下生成日志文件。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_2.jpg?sign=1739353166-qJDAVojck074nE1w2aDbvXdqLoq8mnRF-0-86cfbe08b258d6d2d3649b0d0c6e8bbe)
2.音乐可视化
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_3.jpg?sign=1739353166-ucrhag9TAIjxg2vqH2y60PEQNG7gBsaY-0-1fa011d2aef62aaedf3635f29bc3653a)
3.Impromptu类
后台所有功能汇总类,在此实现即兴曲目的信息输入,可以保存并播放文件,实现音乐可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P30_1.jpg?sign=1739353166-dcDFJ7Nw25Xm93EXL0K8rq7mBk4cwJJW-0-c23abde0bf6c5eb7de8224f86318232e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P31_1.jpg?sign=1739353166-jBtNhKS7UDLPqMRNEajfwy07l1ZR9rGq-0-b92af64304310df56a21898b0be5dcaa)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P32_1.jpg?sign=1739353166-GAYuBPQmZGXspeO0JyIosRRW7l6qfaTN-0-d8e273550aedfb42eff53eec452b0498)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_1.jpg?sign=1739353166-9gcOOLV3rwtzMFqSlryrtvlxqsxMcTqS-0-02b7fafa6509f7782d57b9322b125436)
1.3.5 GUI设计
为方便用户交互,使用PyQt 5 Designer拖动控件,设计图形界面,使用PyQt-tools将制作好的.ui文件转为.py代码,完成用户界面初始化,再将控件绑定对应功能。
1.用户界面空间初始化
此代码由制作好的.ui文件经PyQt-tools转换而成,在Windows下运行。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_2.jpg?sign=1739353166-8kNeIvWT9wMZnFfZ8SUseFlnR9AZl4Gu-0-8b97dfafe02c0ec3524e4b2c017df8a2)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P34_1.jpg?sign=1739353166-8TtUGUxVmeVWuDMSHVuXkwZgXNS1uUsQ-0-d0f42644e52a750406c1c6e487426f22)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P35_1.jpg?sign=1739353166-IwHSdjbcTE2tdMpEkfb8hVHp3EC2cCPQ-0-7bea22c10aa1ecf1052201eeacd4861f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P36_1.jpg?sign=1739353166-AiESa2yQ0P1DkTCBOVoVmlWxuPheOAWr-0-307ec65831864b05a0d89595689bbeab)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P37_1.jpg?sign=1739353166-VLWnGCByFq08qxGVmMFXmZf0TMbP1Lgp-0-4b089c8a5ce23e015684c17b30ecfe27)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_2.jpg?sign=1739353166-EKiGwH7rvdd6jFTNLcBMdyepulYdso8D-0-6ecb57befa3468800333900fdcd98c08)
2.将控件绑定功能(信号与槽的绑定)
通过MainCode实现的继承关系如图1-4所示,其中Impromptu类为可运行的脚本,Ui_MainWindow为PyQt 5。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_1.jpg?sign=1739353166-u0ODjQVq6lPHQsE89hKxv67NBrkfkXC1-0-2f8c39d0aa6e5d5feb49dadc0e831a04)
图1-4 继承关系
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P39_1.jpg?sign=1739353166-uq0ovzGqCHPFtuwgoW5K9qYi4mImw3V5-0-57d1f5b2c1a9a845feb82d76a092960c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P40_1.jpg?sign=1739353166-cx7kxQT3TF2RezJQB1tjzDofHAl0IAHB-0-b06939e16dfdd0a0cffa747efb191802)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P41_1.jpg?sign=1739353166-s4H5ckpRx1GY1s8qTkYvur33WjHW6eek-0-7e9a483cc955c7b93f71f59703bc918d)
1.4 系统测试
GUI界面选择的和弦级数都是调内和弦。在Impromptu中使用self.chord_progression = ['Cmaj7 ', 'Am7 ', 'F', 'E7 '],可以使用调外和弦,给歌曲引入更丰富的和声。
运行主程序后显示GUI界面如图1-5所示。用户可选择的歌曲信息有主音、调式、bpm、拍号、钢琴伴奏类型、贝斯伴奏类型、和弦进行、重复次数和即兴的强度,另外还有右下角音色的切换(普通/安静)。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P42_1.jpg?sign=1739353166-pBW7Kw4S6ubQi7xBWu34dvVAdDbKCS1w-0-2491d9e06db1c0b6c7736f62b0bbde5b)
图1-5 模型训练效果
由于即兴的特点,每次运行产生的音频都不同,此处展示C大调下和弦进行为4321,重复次数为1,贝斯和钢琴伴奏类型均为类型1的歌曲可视化结果,如图1-6所示。钢琴伴奏位于中音区(C3~C4)。即兴旋律可视化结果如图1-7所示,即兴旋律位于高音区(C4~C5)。贝斯伴奏可视化结果如图1-8所示,即兴旋律位于低音区(C1~C2)。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P42_2.jpg?sign=1739353166-XboLOcuQGGr0trNQM4vMaYNSTPzvWkEz-0-adf05e9f6dc55d2333dd53ac7a3042b4)
图1-6 钢琴伴奏可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_1.jpg?sign=1739353166-jfTJxItdYGPIhjVvKB6Nmj820LUKcXqy-0-8323f16d83093e466228e50b5a804bc0)
图1-7 即兴旋律可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_2.jpg?sign=1739353166-l6oxbfVnUvOGzNPVt5o66cO67xoSdj2Y-0-a5858bc40e613a33ee2be8dae7922c92)
图1-8 贝斯伴奏可视化