Python播放生日快乐歌

这篇具有很好参考价值的文章主要介绍了Python播放生日快乐歌。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在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)或者直接使用现成的音乐文件来播放音乐。

Python播放生日快乐歌,Python,python,开发语言文章来源地址https://www.toymoban.com/news/detail-841561.html

到了这里,关于Python播放生日快乐歌的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Debian 30 周年,生日快乐!

    导读 近日是 Debian 日,也是由伊恩-默多克(Ian Murdock)创立的 Debian GNU/Linux 通用操作系统和社区支持的 Debian 项目 30 周年纪念日。 不管你信不信,从已故的伊恩-默多克于 1993 年 8 月 16 日宣布成立 Debian 项目,到一个月后的 9 月 15 日首次发布 Debian GNU/Linux 以尝试开发 “通用

    2024年02月10日
    浏览(56)
  • Amazon S3 服务15岁生日快乐!

    2021年3月14日,作为第一个发布的服务,Amazon S3 服务15周岁啦!在中国文化里,15岁是个临界点,是从“舞勺之年”到“舞象之年”的过渡。相信对于 Amazon S3 和其他的云服务15周岁也将是其迎接更加美好未来的全新起点。 亚马逊云科技开发者社区为开发者们提供全球的开发技

    2024年02月02日
    浏览(39)
  • html之实现生日快乐的效果(拿来即用)

    先看效果( 实际上是动画,我截的屏所以是图片 ): 直接上代码: 注意,我用的外联方式导入的css(在第十行),你可以看自己情况直接在一个页面内容上也是可以的。 CSS代码

    2024年02月16日
    浏览(42)
  • 【代码】JS|前端密码,浪漫至死不渝,祝我生日快乐

    今天是特别的日子,我想把这篇存稿发出来。 一次缺席,次次缺席,便不再期待重逢。 也是时候,解开最后一个设计过的谜题。 学加密的同时,我恰好写前端比较多,也有朋友找我测试他们前端页面上的加密方案的安全性。当时我就在想: 前端很适合展示浪漫的心思 。前

    2024年04月26日
    浏览(37)
  • 【熬夜送书 | 第一期】Java生日快乐,不负代码不负君,面向对象面向卿

    随着Java生日的来临,熬夜决定送一期Java名著 Java 是一门跨平台的面向对象编程语言,由 Sun Microsystems 公司于 1995 年推出。Java 语言的设计目标是“Write Once, Run Anywhere”,即“一次编写,到处运行”,它的优势在于跨平台性、安全性、可靠性、高性能和易学易用等方面。 自从

    2024年02月06日
    浏览(35)
  • 【Spring Boot学习】今天是我的生日,舍友催我去吃饭,我还是坚持写完了Spring Boot配置文件,祝自己生日快乐哈

    前言: 大家好,我是 良辰丫 ,上一篇文章中我们已经学习了Spring Boot项目的的创建,今天我们会学习Spring Boot的配置文件,在今天的学习中我们会遇到许多我们不认识的注解,这些注解是Spring MVC中的,我们后续会介绍, 大家先不用管这些注解是什么意思 .那么,为什么不先学习MVC呢?我想

    2024年02月08日
    浏览(42)
  • Python|送给朋友的生日祝福

    生活中除了给男神女神表白,还会遇到朋友过生日,所以小编今天就给大家带来了一个送给朋友的生日祝福程序。 本次程序还是用python编写,第三方库用到了pygame。安装方式在命令行运行以下代码即可。 首先是导入所需模块以及初始化pygame: 其中的pygame.mixer.init()为pygame播放

    2023年04月12日
    浏览(47)
  • HTML5七夕情人节表白网页制作【抖音3D立方体图像库】HTML+CSS+JavaScript html生日快乐祝福网页制作

    这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个TA站在眼前都不敢向前表白。说不出口的话就用短视频告诉

    2024年02月02日
    浏览(51)
  • 华为OD机试 - 生日礼物(Java & JS & Python)

    题目描述 小牛的孩子生日快要到了,他打算给孩子买蛋糕和小礼物,蛋糕和小礼物各买一个,他的预算不超过x元。蛋糕cake和小礼物gift都有多种价位的可供选择。 请返回小牛共有多少种购买方案。 输入描述 第一行表示cake的单价,以逗号分隔 第二行表示gift的单价,以逗号分

    2024年02月14日
    浏览(50)
  • python提取身份证中的生日和性别

    1. 我们的身份证号码是一串18位的数字,其中包含了许多关于持有人身份的信息,比如出生日期和性别。前6位是地区码,接下来的8位是出生日期,然后是顺序码和性别码, 最后一位是校验码。性别由倒数第二位表示,奇数为男,偶数为女。 2.解析身份证号码中的出生日期,

    2024年03月24日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包