首页 热门歌手 正文

英雄联盟周杰伦主题曲来了!青春回忆瞬间拉满!

咳咳,大家今天跟大家聊聊我昨天晚上搞的一个有点意思的东西——用代码实现周杰伦英雄联盟主题曲。

起因是这样的,那天我刷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。
  • 耐心是成功的关键,遇到问题不要轻易放弃。

英雄联盟周杰伦主题曲来了!青春回忆瞬间拉满!

好了,今天的分享就到这里。下次再跟大家聊聊我搞的其他有趣的东西!

声明: 以上代码仅供学习交流使用,请勿用于商业用途。

本文转载自互联网,如有侵权,联系删除

相关推荐