python音乐可视化:好玩的matplotlib南丁格尔玫瑰图版
off999 2024-11-10 10:35 33 浏览 0 评论
△ 效果图:
△ 操作演示:
△ 技术要点:
1 matplotlib的南丁格尔玫瑰图,用极坐标polar制作,并动画显示。
2 pygame新版的播放mp3,但本机的操作系统不能播放mp3,我用pydub做些格式转换。
3 用librosa获取音乐的相关数据和采样。
4 参考代码,并对源代码进行修改,增加,删减,排版和注释,感谢原作者,如有侵权,请联系,定删除。
https://github.com/hahacyd/SimpleMusicVisualizer====下面分步,讲解代码====
△ 第1步:模块导入
import os
import time
import pygame
import librosa
import numpy as np
from pydub import AudioSegment
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation△ 第2步:窗口的初始化设置
print("开始格式转换,请等待,一会马上就会播放音乐,请欣赏音乐和可视化")
plt.rcParams['axes.unicode_minus']=False # 负号显示
# 画布的大小和背景颜色设置
fig = plt.figure(facecolor='black',edgecolor='black',figsize=(12,7))
ax = plt.subplot(projection='polar')
ax.patch.set_facecolor('black') #图形背景颜色设置
# 设置显示界面的位置
mngr = plt.get_current_fig_manager()
mngr.window.wm_geometry("+500+200")△ 第3步:参数设置
# 设置显示的柱状图的个数
bin_nums = 24
# 设置显示的频率范围:(0 ~ 1350 Hz)
frequency_threshold = 1350
# 音乐时长(s)
music_length = 0.0
# 帧时长,即每一帧所需的时长
# 简而言之就是每隔‘sampling_interval’ 秒刷新一次
sampling_interval = 0.05
temp = np.tile(0, bin_nums) #重复数组,角度
music_play_start_time = 0
current_time = 0
music_fft = np.empty(0) #创建空数组
bins = np.empty(0)△ 第4步:核心代码:
# =======polar柱状图,如果是垂直柱状图,就是适当进行修改=======
# 可视化柱子和上头线设置
# 比如选择了'RdBu'色谱,选择分为24段
colors = plt.get_cmap('RdPu',24)
#cmap即colormaps
#获取图谱使用plt.get_cmap(‘xxx’)
# 扇形柱子的宽度
width = 2 * np.pi / bin_nums
# 角度和数据
rad = np.cumsum([width] * bin_nums) # 每个扇形的起始角度
# 扇形柱状图
rects = ax.bar(rad, temp,width=width,color=colors(range(0, bin_nums)),alpha=1,bottom=900)
# 初始化柱状图中的 横线跌落效果
line,= ax.plot(rad, temp, '*', color='white', linewidth=10)
ax.set_theta_zero_location('N') # 设置极坐标的起点(即0度)在正上方向
ax.grid(False) # 不显示极轴
ax.spines['polar'].set_visible(False) # 不显示极坐标最外的圆形
ax.set_yticks([]) # 不显示坐标间隔
ax.set_thetagrids([]) # 不显示极轴坐标
#=======核心代码部分=======△ 第5步:filter类
class ExpFilter:
def __init__(self, val=0.0, alpha_decay=0.5, alpha_rise=0.5):
self.alpha_decay = alpha_decay
self.alpha_rise = alpha_rise
self.value = val
def update(self, value):
if isinstance(self.value, (list, np.ndarray, tuple)):
alpha = value - self.value
alpha[alpha > 0.0] = self.alpha_rise
alpha[alpha <= 0.0] = self.alpha_decay
else:
alpha = self.alpha_rise if value > self.value else self.alpha_decay
self.value = alpha * value + (1.0 - alpha) * self.value
return self.value
# 使用filter,来使得柱形图中的变化平缓一些
# alpha_decay和alpha_rise,其值需在0~1之间,分别表示下降和上升的反应速度
# 越大越灵敏,如果都设为1,将失去滤波的效果
# 这里选择了0.3 和 0.6,即下降时较慢,而上升较快
filter = ExpFilter(np.tile(0,bin_nums),alpha_decay=0.30, alpha_rise=0.60)△ 第6步:函数定义
# 初始化
def init():
global y_max
ax.set_ylim(0, y_max)
return rects
# 更新函数
def update(frame):
current_time = time.time()
# 获知当前歌曲的播放进度,以选择此进度下的fft数据
current_frame = ((current_time - music_play_start_time) //
sampling_interval)
# 播放完了,处理
if current_frame == FRAMES - 1:
exit()
# 这里的music_fft是从getBin()获得的
source = music_fft[int(current_frame)-1] # 注意这里一般可能不需要-1,根据不同mp3而定
index_max = y_max - (y_max // 80) < source
source[index_max] = y_max - (y_max // 80)
# 更新柱状图
bins = filter.update(source)
# 更新柱状图中的横线跌落效果
line_ydata = line.get_ydata()
line_ydata -= int(y_max // 30)
line_index = line_ydata - int(y_max // 100) < bins
line_ydata[line_index] = bins[line_index] + int(y_max // 100)
line.set_ydata(line_ydata)
for rect, h in zip(rects, bins):
rect.set_height(h)
fig.canvas.flush_events() #刷新
fig.canvas.draw() # 重新绘图
# 图像更新后将保持一帧的时间
time.sleep(sampling_interval)
fig.canvas.manager.set_window_title("总共:%d秒;已经播放时间:%d秒"%(round(music_length),
round(current_time- music_play_start_time, 0))) #窗口标题名设置
# 处理音乐中的每一帧数据
def getBin(y,sr,sampling_interval):
time1 = time.time()
# 计算每一帧有多少“采样“,用于计算fft
fft_interval = int(sr * sampling_interval)
length = fft_interval // 2
nums = (sr * bin_nums) // (frequency_threshold * 2)
batch = length // nums
result = np.atleast_2d(np.tile(0, bin_nums))
for i in range(int(music_length // sampling_interval)):
fft = np.fft.fft(y[fft_interval * i: fft_interval * (i + 1)])
freqbin = np.array([np.abs(fft[batch * x: batch * (x + 1)]).sum() // sampling_interval
for x in range(bin_nums)])
result = np.vstack([result, freqbin])
time2 = time.time()
return result
# 播放指定的歌曲
def play():
pygame.init()
pygame.mixer.music.stop()
# 播放音乐
music = pygame.mixer.music.load(n_audio_path) # 转换成ogg的临时文件
pygame.mixer.music.play()△ 第7步:启动主函数
if __name__ == "__main__":
# 设置音乐文件的路径
audio_path = './cwsk.mp3' #本操作系统,新版pygame不支持mp3,需要转换
sound = AudioSegment.from_file(audio_path)
# 转换后放在临时主目录下
file=sound.export("newsong.ogg", format="ogg")
n_audio_path='./newsong.ogg' #临时文件
y, sr = librosa.load(n_audio_path, sr=None)
music_length = len(y) / sr
print("时长: %g s 采样率: %g kHz " % (music_length, sr/1000))
music_fft = getBin(y=y, sr=sr, sampling_interval=sampling_interval)
y_max = music_fft.max() // 3
FRAMES = music_fft.shape[0]
ani = FuncAnimation(fig, update, init_func=init, blit=False, interval=0,
frames=FRAMES + 1, repeat=False)
play()
# 记录音乐开始播放的时间
music_play_start_time = time.time()
plt.tight_layout() # 紧凑布局,缩小外边距
plt.show() #显示
plt.pause(music_length)自己整理,分享出来,希望大家喜欢。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
