Python播放生日快乐歌

avatar
作者
猴君
阅读量:4

在Python中播放音乐可以通过Pygame库来实现,Pygame是一个非常流行的用于游戏开发的Python模块,同时也支持音频播放。以下是如何使用pygame播放音乐的基本步骤:

import pygame import time  # 初始化pygame的混音器模块 pygame.mixer.init()  # 定义音符的频率(C4 为中央C,即钢琴上的中间键) C4 = 261.63 D4 = 293.66 E4 = 329.63 F4 = 349.23 G4 = 392.00 A4 = 440.00 B4 = 493.88 C5 = 523.25   # 定义播放音符的函数 def play_note(frequency, duration):     # 生成一个指定频率和持续时间的正弦波样本     sample_rate = 44100  # 采样率     samples = int(duration * sample_rate)  # 总样本数     note_data = [sin(2 * pi * frequency * i / sample_rate) for i in range(samples)]      # 创建一个1维的numpy数组(因为pygame.sndarray.make_sound()需要2维数组,但在这里我们直接使用音频设备)     # 注意:上面的代码有一个错误,因为没有导入numpy和math库,也没有定义sin和pi     import numpy as np     import math     sin = math.sin     pi = math.pi     note_array = np.array(note_data, dtype=np.float32)      # 由于pygame.sndarray.make_sound()现在可能不被推荐使用,并且它期望一个2维数组     # 我们改为使用pygame.mixer.Sound()对象,但首先我们需要将numpy数组转换为pygame可以接受的格式     # 然而,pygame.mixer.Sound()不直接接受从numpy数组创建的声音,所以我们需要先保存为.wav文件再加载     # 为了避免这个问题,我们可以使用一个临时的内存文件对象,但这里为了简化,我们将直接播放一个简单的方波     # 注意:这不是一个理想的解决方案,因为它没有使用正弦波,但它是为了演示如何在不使用外部文件的情况下播放声音      # 创建一个方波声音对象(这不是一个正弦波,所以听起来会有所不同)     sound_buffer = pygame.sndarray.array(np.int16(note_array * 32767))  # 将浮点数转换为16位整数     sound = pygame.sndarray.make_sound(sound_buffer)     sound.play()   # 由于上面的方法不是最佳实践,并且pygame.sndarray.make_sound()的使用可能有问题 # 下面我们使用一个更简单但不太准确的方法来播放音符,直接使用pygame.mixer.Sound()和字符串缓冲区 def play_note_simple(frequency, duration):     # 设置声音的参数     size = int(duration * 44100)  # 采样数     buf = bytearray(2 * size)  # 创建一个空的字节缓冲区(每个样本2字节)     volume = 32767  # 最大音量(16位整数的最大值)      for i in range(size):         # 生成一个简单的方波(这不是一个正弦波,但它更容易生成)         if i % int(44100 / frequency) < int(44100 / (frequency * 2)):  # 生成占空比50%的方波             sample = volume         else:             sample = -volume              # 将样本写入缓冲区(小端字节序)         buf[2 * i] = sample & 0xff  # 低位字节         buf[2 * i + 1] = (sample >> 8) & 0xff  # 高位字节      # 创建一个pygame声音对象并播放它     sound = pygame.mixer.Sound(buffer(buf))  # 注意:在Python 3中,应该使用memoryview(buf)而不是buffer(buf)     sound.play()   # 但由于buffer()在Python 3中不再存在,我们使用memoryview()和正确的数据类型来修复这个问题: def play_note_fixed(frequency, duration):     size = int(duration * 44100)  # 采样数     buf = bytearray()      for i in range(size):         # 生成方波样本(注意:这不是正弦波,听起来会有所不同)         sample = 32767 if i % int(44100 / frequency) < int(44100 / (frequency * 2)) else -32767         buf.extend([sample & 0xff, (sample >> 8) & 0xff])  # 将样本转换为小端字节序的16位整数并添加到缓冲区中      sound = pygame.mixer.Sound(memoryview(buf).cast('h'))  # 使用memoryview和cast来创建一个声音对象('h'表示有符号的短整数)     sound.play()   # 播放“生日快乐”歌的旋律 def play_happy_birthday():     notes = [         (C4, 0.5), (C4, 0.5), (D4, 0.5), (C4, 0.5),         (F4, 0.5), (E4, 1.0),         (C4, 0.5), (C4, 0.5), (D4, 0.5), (C4, 0.5),         (G4, 0.5), (F4, 0.5),         (C5, 0.5), (A4, 0.5), (C5, 0.5), (A4, 0.5),         (F4, 0.5), (E4, 0.5), (D4, 0.5),         (G4, 0.5), (F4, 0.5),     ]      for note in notes:         frequency, duration = note         play_note_fixed(frequency, duration)  # 使用修复后的函数来播放音符         time.sleep(duration)  # 在播放下一个音符之前等待一段时间(这里假设play_note_fixed是异步的,但实际上它不是,所以可能会有延迟)   # 主程序入口点 if __name__ == '__main__':     play_happy_birthday()  # 播放生日快乐歌!     # 请注意,由于pygame的声音播放可能是异步的,程序可能会在歌曲播放完之前退出。你可能需要添加一些代码来等待歌曲播放完毕。     # 另外,上面的代码示例并不是一个理想的音乐播放器实现方式,因为它使用了方波而不是正弦波,并且没有正确地处理样本率和音量等问题。     # 如果你想要一个更高质量的音乐播放器实现方式,你可能需要使用更专业的音频处理库(如PyAudio)或者直接使用现成的音乐文件来播放音乐。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!