咳咳,大家今天跟大家聊聊我昨天晚上搞的一个有点意思的东西——用代码实现周杰伦英雄联盟主题曲。
起因是这样的,那天我刷B站,突然听到有人用Python演奏音乐,一下子就来了兴趣。我寻思着,能不能把周董的《英雄》也用代码给整出来?这歌当年可是循环播放了好久,现在想想都热血沸腾。
说干就干!我先在网上搜了一下相关的资料,发现用Python演奏音乐主要就是靠一些库,比如`pygame`或者`playsound`。我之前用过`pygame`,感觉还不错,就决定用它了。
第一步,安装`pygame`。这个很简单,直接`pip install pygame`就搞定了。
第二步,把《英雄》的乐谱找出来。这个费了点劲,网上谱子各种版本都有,我找了一个比较靠谱的简谱。
第三步,把简谱翻译成音符。这里就比较麻烦了,因为简谱上的数字要对应到`pygame`可以识别的音符频率。我找到了一个音符频率对照表,然后就开始吭哧吭哧地把简谱上的每个音符都翻译成对应的频率。
第四步,编写代码。我先定义了一个函数,用来播放指定频率的音符。然后,把整首歌的音符频率都放到一个列表里,再循环播放这个列表里的音符。
代码大概是这样的:
import pygame
import time
def play_note(frequency, duration):
sound = *(sine_wave(frequency))
*(duration)
def sine_wave(frequency, duration=0.1, volume=1):
length = int(44100 duration)
arr = *([volume *(2 * frequency x / 44100) for x in range(length)]).astype(*32)
sound = *(arr)
return sound
# 英雄联盟主题曲音符频率列表(这里省略了,太长了)
notes = [
(262, 0.5), # C4
(294, 0.5), # D4
(330, 0.5), # E4
# ...更多音符
for note, duration in notes:
play_note(note, duration)
这里面最麻烦的就是音符频率列表了,我一个个手动输进去的,眼睛都快看瞎了。
第五步,运行代码!激动人心的时刻到了,我运行了一下代码,结果…… 声音不对!有的音符跑调了,有的节奏不对。当时我就有点懵,心想难道是我的频率对照表有问题?
然后我就开始debug。先检查了一下频率对照表,没发现问题。然后又检查了一下代码,也没发现明显的错误。我发现问题出在了音符的持续时间上。我之前设置的持续时间都是固定的,但实际上不同的音符应该有不同的持续时间。
于是我又修改了一下代码,把每个音符的持续时间都单独设置了一下。再次运行代码,这回终于对了!虽然声音有点粗糙,跟原版没法比,但是至少能听出来是《英雄》了。
这回实践让我体会到,用代码实现音乐还是挺有意思的,但是也需要耐心和细心。以后有机会,我想尝试用更高级的库,做出更逼真的音乐效果。
总结一下这回的经验:
- 准备工作很重要,乐谱和音符频率对照表一定要找准确的。
- 代码要写得规范,方便debug。
- 耐心是成功的关键,遇到问题不要轻易放弃。
好了,今天的分享就到这里。下次再跟大家聊聊我搞的其他有趣的东西!
声明: 以上代码仅供学习交流使用,请勿用于商业用途。