今天跟大家聊聊我用Python“演奏”周杰伦《玫瑰花的葬礼》的故事,纯属个人爱大佬们轻喷。
起初,我就是单纯喜欢这首歌,然后突发奇想,能不能用代码把它“唱”出来? 毕竟程序员嘛总想着啥都用代码搞定。
说干就干,我先在网上搜了一堆资料,发现Python确实能做到,主要是用到`numpy`和`scipy`这两个库,前者用来处理数据,后者用来生成音频。
第一步,先把乐谱搞到手。我找了个简谱,然后对着简谱把每个音符对应的频率扒下来。这步是最麻烦的,因为要一个一个对照,而且简谱上有些音符还不太标准,得自己稍微调整一下。
扒下来之后,我把音符和对应的频率存到一个字典里,方便后面调用。
就是写代码生成声音了。我定义了一个函数,输入音符的频率和时长,就能生成一段正弦波。然后把所有音符对应的正弦波拼接起来,就成了一段音频。
代码大概是这样子的:
- 定义一个函数,接收频率和时长
- 计算每个时间点的正弦值
- 把所有时间点的正弦值组合起来
刚开始弄出来的时候,声音那叫一个刺耳,完全没法听。后来发现是采样率的问题,我把采样率调高了一些,声音就好多了。
但是,光有音符还不行,还得加上节奏。我把每个音符的时长也记录了下来,然后根据时长来控制每个音符播放的时间。
为了让声音更真实,我还加了一些效果,比如淡入淡出,还有一些混响。这些效果都是用`scipy`库里的函数实现的。
我把所有的代码都整合到一起,跑了一下,终于听到了《玫瑰花的葬礼》的旋律。虽然和原版比起来差远了,但是自己用代码做出来的,感觉还是挺不一样的。
主要步骤就是:
- 扒谱,把音符和频率对应起来
- 写代码生成正弦波
- 拼接音符,控制节奏
- 加效果,让声音更真实
这回尝试让我对Python的音频处理能力有了更深的了解,也算是把自己的兴趣和技术结合了一下。下次有机会,我还想试试用代码生成其他类型的音乐。
一些踩坑记录
音符频率不准: 这个问题一开始困扰了我很久,后来发现是简谱上的音符有些偏差,需要自己手动调整。
声音刺耳: 采样率太低导致的,调高采样率就好了。
节奏不稳: 音符时长没控制需要仔细调整每个音符的时长。
希望我的分享能给大家带来一些启发,也欢迎大家一起交流学习!