最近心血来潮,想把光良的《约定》这首歌用代码实现出来,就当是练手了。
第一步: 肯定是找音源!直接去网上搜,下了一个《约定》的纯钢琴伴奏,格式是mp3的。
第二步: 把mp3转成midi。这步挺关键的,因为midi文件包含了音符、时长、音高等信息,方便我用代码来处理。用了一个在线的mp3转midi工具,免费的,效果还行。
第三步: 读取midi文件。我用的是Python,安装了一个叫mido
的库,专门用来处理midi文件的。代码很简单,几行就搞定了:
import mido

midi_file = *('yue_*') # 替换成你的midi文件路径
for track in midi_*:
for message in track:
print(message)
运行一下,控制台哗出来一大堆音符信息,看的我眼花缭乱。
第四步: 分析midi数据。我需要把这些音符信息提取出来,包括音符的音高(note)、起始时间(time)和持续时间。这步比较费劲,因为midi文件里的信息比较底层,需要理解它的格式。大概的思路是:遍历每个音符事件,记录音符的开始和结束时间,然后计算出它的持续时间。
第五步: 根据音符信息,生成乐谱。我想把乐谱以一种可视化的方式展示出来,比如用简谱或者五线谱。简谱比较简单,就先用简谱。我用matplotlib
库画了一些简单的线条和数字,把音符按照音高和时间顺序排列起来。
第六步: 播放乐谱。这步还没实现,打算用pygame库来播放音乐。把每个音符的音高转换成对应的频率,然后生成声音,再按照时间顺序播放出来。
遇到了一些坑:
- mp3转midi的质量不是很有些音符不太准确。
- midi文件的格式比较复杂,需要花时间去理解。
- 用代码生成乐谱比较麻烦,需要考虑各种细节。
虽然还没完全实现,但是已经能看到一些雏形了。感觉还是挺有意思的,下一步打算把乐谱播放功能搞定,再美化一下乐谱的显示效果。希望能成功!