今天跟大家唠唠嗑,说说我最近一直在死磕的 – 用代码实现林俊杰的《伟大的渺小》。别误会,我不是要搞个AI歌手,而是想用程序模拟歌曲的旋律、节奏,生成一段MIDI或者数字音频。
我啥也不懂,对着电脑屏幕发呆。 第一步,先得了解音乐的基本知识?于是我疯狂的在网上找乐理知识,什么是音符、什么是节拍、什么是和弦,啃得我头昏脑涨。
稍微有点眉目后,第二步,就开始扒谱子。还好《伟大的渺小》这首歌的谱子网上挺好找,各种版本都有。我挑了一个相对简单,适合入门的版本,然后把它一行一行的抄下来,标记好每个音符、每个节奏。这比我当年抄英语课文还认真!
然后就是最痛苦的第四步,把抄下来的谱子上的音符一个一个的输入到代码里。这简直就是体力活!而且还特别容易出错,经常输错个音符、输错个节拍啥的。我只能一遍一遍的检查,改到眼都花了。
中间还遇到各种各样的坑。比如,有的音符在MIDI里没有对应的编码,我就得想办法用其他的音符来代替;有的节奏太复杂,我用代码很难实现,就只能稍微简化一下。
总算是,花了差不多一个星期的时间,我把整首歌的代码都写完了。怀着忐忑的心情运行了一下,结果… 出来的声音简直就是噪音!音符乱七八糟的,节奏也不对,完全听不出是《伟大的渺小》。
当时我就想放弃了,感觉自己搞不定。但是想想都花了这么多时间和精力了,就这么放弃太可惜了。于是我开始冷静下来,一步一步的调试代码。
我把MIDI文件导入到GarageBand里,对着谱子一句一句的听,一句一句的改。哪个音符错了,就改哪个音符的代码;哪个节奏不对,就调整哪个节奏的代码。
改了整整两天,总算是把声音调顺了。虽然还是有点生硬,有点机械,但是至少能听出来是《伟大的渺小》了。
一步,就是把MIDI文件转换成数字音频文件。我用了`pydub`库,它可以把MIDI文件转换成WAV或者MP3格式。转换完之后,我用手机放了一下,感觉还不错,虽然跟原版比差远了,但是至少是我自己用代码做出来的。这回实践,让我深刻体会到,做任何事情都要从基础开始,一步一个脚印的走。而且遇到困难不要轻易放弃,要坚持下去,总会找到解决办法的。 虽然最终的效果不是特别完美,但是我觉得这回经历非常有意义。
总结一下这回的实践过程:
第一步:学习乐理知识。 第二步:扒谱子。希望我的分享能对大家有所帮助。如果你也对用代码生成音乐感兴趣,不妨也尝试一下,相信你也能做出自己的音乐作品!