pygame 音乐粒子特效

代码

python 复制代码
import pygame
import numpy as np
import pymunk
from pymunk import Vec2d
import random
import librosa
import pydub

# 初始化pygame
pygame.init()

# 创建屏幕
screen = pygame.display.set_mode((1920*2-10, 1080*2-10))
clock = pygame.time.Clock()

# 加载音乐文件
audio_file = '周杰伦-周大侠.flac'
audio = pydub.AudioSegment.from_file(audio_file)
audio = audio.set_channels(1)  # 确保音乐是单声道的
audio.export('temp.wav', format='wav')  # 转换为wav格式,因为pygame不支持mp3

# 播放音乐
pygame.mixer.init()
pygame.mixer.music.load('temp.wav')
pygame.mixer.music.play(-1)  # -1表示无限循环播放

# 转换为波形数组
y, sr = librosa.load('temp.wav')

# 提取节奏
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
beat_times = librosa.frames_to_time(beat_frames, sr=sr)

# 创建pymunk空间
space = pymunk.Space()
space.gravity = (0, 0)  # 设置重力

# 添加边界
border_thickness = 10
border_offset = border_thickness / 2

# 创建边界的四个顶点
bodies = [pymunk.Body(body_type=pymunk.Body.STATIC) for _ in range(4)]
segments = [
    pymunk.Segment(bodies[0], (border_offset, border_offset), (screen.get_width() - border_offset, border_offset), border_thickness),
    pymunk.Segment(bodies[1], (screen.get_width() - border_offset, border_offset), (screen.get_width() - border_offset, screen.get_height() - border_offset), border_thickness),
    pymunk.Segment(bodies[2], (screen.get_width() - border_offset, screen.get_height() - border_offset), (border_offset, screen.get_height() - border_offset), border_thickness),
    pymunk.Segment(bodies[3], (border_offset, screen.get_height() - border_offset), (border_offset, border_offset), border_thickness)
]

# 为边界形状添加到空间中
for body, segment in zip(bodies, segments):
    space.add(body, segment)  # 同时添加刚体和形状到空间中
    segment.elasticity = 1.0
    segment.friction = 0.0


# 粒子类
class Particle:
    def __init__(self, space, position):
        self.body = pymunk.Body(1, float('inf'))
        self.body.position = position
        self.shape = pymunk.Circle(self.body, 10)
        self.shape.elasticity = 1.0
        self.shape.friction = 0.0
        space.add(self.body, self.shape)
        self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

    def draw(self, screen):
        pos = int(self.body.position.x), int(self.body.position.y)
        pygame.draw.circle(screen, self.color, pos, int(self.shape.radius))

# 创建粒子
particles = [Particle(space, (random.randint(100, 700), random.randint(100, 500))) for _ in range(1000)]

# 主循环
running = True
frame = 0
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((0, 0, 0))

    # 更新pymunk空间
    space.step(1/60.0)

    # 根据音乐节奏更新粒子速度
    if frame < len(beat_times) and pygame.time.get_ticks() / 1000 > beat_times[frame]:
        for particle in particles:
            impulse = Vec2d(random.uniform(-50, 50), random.uniform(-50, 50))
            particle.body.apply_impulse_at_local_point(impulse)
        frame += 1

    # 绘制粒子
    for particle in particles:
        particle.draw(screen)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

解释

这段代码是一个使用Pygame和Pymunk库创建的音乐可视化效果。它加载一个音乐文件,提取音乐的节奏,并根据节奏在屏幕上创建和更新粒子的位置。以下是代码的详细解释:

  1. 导入所需的库:pygame用于图形和声音,numpy用于数学运算,pymunk用于物理模拟,random用于生成随机数,librosa和pydub用于处理音乐文件。
  2. 初始化Pygame并创建一个屏幕。
  3. 加载音乐文件,将其转换为单声道,并导出为WAV格式,因为Pygame不支持MP3格式。
  4. 使用pygame.mixer播放音乐。
  5. 使用librosa将音乐文件转换为波形数组,并提取音乐的节奏。
  6. 创建一个Pymunk空间,设置重力为0,并添加边界。
  7. 定义一个Particle类,用于创建和绘制粒子。
  8. 创建一个粒子列表,每个粒子都有一个随机位置。
  9. 主循环:处理事件,更新Pymunk空间,根据音乐节奏更新粒子速度,绘制粒子,并更新屏幕。
  10. 退出Pygame。
    这个代码的主要特点是使用音乐的节奏来控制粒子的运动,创造出一种动态的音乐可视化效果。
相关推荐
在世修行14 分钟前
干货:业务标识 vs 自动判据
python
zwd200517 分钟前
Manim move_to 和 shift 用法详解:相对位移、绝对落点与 aligned_edge(0.21.0 实测)
python·动画·可视化·shift·manim·数学动画·move_to
“AI国潮设计-小江”40 分钟前
《Python+SDXL实战:用ControlNet精准控制“英歌舞戚风蛋糕”质感,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
jayhgq1 小时前
新一代Python包与项目管理工具——UV
开发语言·python·uv
for_ever_love__1 小时前
文件与异常——open、json、with 与 try-except 的工程写法
python·异常处理·文件操作·大模型开发
XLYcmy1 小时前
PDF 论文处理器 — 技术报告文档
数据库·python·网络安全·pdf·embedding·dify·rag
weixin_440401691 小时前
质朴的可视化绘图+pyecharts
开发语言·python·信息可视化·pyecharts
计算机毕业编程指导师1 小时前
【Python毕设选题推荐】基于Spark的国内主要农作物产量趋势分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·python·数据分析·spark·毕业设计·课程设计·农作物产量
计算机毕业编程指导师1 小时前
【Python毕设选题推荐】基于Spark的宫颈癌变光谱特征数据分析可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·spark·毕业设计·宫颈癌变
ss2731 小时前
AI全栈实战 | 3.3-01 Python OOP:__init__ 真的是构造函数吗,元类怎么让 Django Model 变魔法
开发语言·python·django