Yourouchour 2023-08-09 12:31 采纳率: 0%
浏览 7

pygame mixer Sound无法同时播放太多声音

我的程序想要同时播放音频,但是pygame.mixer.Sound无法同时播放太多声音。我经常按着按着就没声音了。当然,这也有可能是别的问题,如何解决呢?

这是__init__.py

mport keyboard
import threading
import time

import values

is_played_chord = False
chord_keys = {'a'}

def play_chord(bpm_time):
    global is_played_chord
    while True:
        notes = values.chordkeys.get(frozenset(chord_keys), ())
        is_played_chord = True
        for note in notes:
            values.LEFT_NOTES[note].play()
        time.sleep(bpm_time)
        for note in notes:
            values.LEFT_NOTES[note].stop()

def ask_bpm():
    try:
        return int(input("Enter your BPM: "))
    except ValueError:
        print("Please enter a number")
        return ask_bpm()
    
def on_press(key):
    global is_played_chord
    global chord_keys
    if key.name in values.RIGHT_HAND_KEYS:
        #这儿的判断是正确执行的,没有遗漏
        note = values.RIGHT_NOTES[key.name]
        #这里的stop是被迫添加的,有一点用,但不多
        note.stop()
        note.play()
    elif key.name in values.LEFT_HAND_KEYS:
        if is_played_chord:
            chord_keys = set()
            is_played_chord = False
        chord_keys.add(key.name)
    else:
        print("Unknown key {0} pressed".format(key.name))

def on_release(key):
    if key.name in values.RIGHT_HAND_KEYS:
        values.RIGHT_NOTES[key.name].stop()

def main():
    bpm_time = 60 / ask_bpm()
    keyboard.on_press(on_press)
    keyboard.on_release(on_release)
    threading.Thread(target=play_chord, args=(bpm_time,)).start()
    keyboard.wait()

if __name__ == '__main__':
    main()

这是value.py

from typing import Dict, FrozenSet, Tuple
from pygame import mixer

mixer.init()
LEFT_HAND_KEYS = {'a','s','d','f','z','x','v','q','w','e','r','1','2','3'}
RIGHT_HAND_KEYS = {'g','h','j','k','l','t','y','u','i','o','p','b','n',',','.','5','6','7','9','0'}
LEFT_NOTES = {key: mixer.Sound(f"piano/left/{key}.wav") for key in (
   'c0','d0','e0','f0','g0','a0','b0',
   'C','D','E','F','G','A','B',
   '#c0','#d0','#f0','#g0','#a0',
   '#C','#D','#F','#G','#A',
   )
}
RIGHT_NOTES = {key: mixer.Sound(f"piano/right/{key}.wav") for key in RIGHT_HAND_KEYS}

chordkeys:Dict[FrozenSet[str],Tuple[str]] = {
   frozenset({'a',}) : ("C","G","c0","e0"),
   frozenset({'s',}) : ("D","A","d0","#f0"),
   frozenset({'d',}) : ("E","B","e0","#g0"),
   frozenset({'f',}) : ("F","C","f0","a0"),
   frozenset({'q',}) : ("G","B","d0","g0"),
   frozenset({'w',}) : ("A","c0","e0","a0"),
   frozenset({'e',}) : ("B","#d0","#f0","b0"),
   frozenset({'r',}) : ("C","G","c0","e0"),
}
  • 写回答

3条回答 默认 最新

  • 大师兄6668 Python领域新星创作者 2023-08-09 13:44
    关注

    以下回答参考GPT,请查看是否可以解决你的问题:
    您遇到的问题可能是由于pygame.mixer.Sound无法同时播放太多声音导致的。这是因为在pygame.mixer.Sound中,每个声音都需要独立的声道,如果同时播放太多声音,声道可能不足,导致一些声音被静音或丢失。

    为了解决这个问题,可以考虑使用pygame.mixer.music模块来实现同时播放多个声音。相比于pygame.mixer.Soundpygame.mixer.music能够更好地处理同时播放多个声音的情况。

    以下是对您提供的代码进行修改的示例:

    import keyboard
    import threading
    import time
    import pygame.mixer
    
    import values
    
    is_played_chord = False
    chord_keys = {'a'}
    
    def play_chord(bpm_time):
        global is_played_chord
        while True:
            notes = values.chordkeys.get(frozenset(chord_keys), ())
            is_played_chord = True
            for note in notes:
                pygame.mixer.music.load(values.LEFT_NOTES[note])
                pygame.mixer.music.play()
            time.sleep(bpm_time)
            pygame.mixer.music.stop()
    
    def ask_bpm():
        try:
            return int(input("Enter your BPM: "))
        except ValueError:
            print("Please enter a number")
            return ask_bpm()
    
    def on_press(key):
        global is_played_chord
        global chord_keys
        if key.name in values.RIGHT_HAND_KEYS:
            note = values.RIGHT_NOTES[key.name]
            note.stop()
            note.play()
        elif key.name in values.LEFT_HAND_KEYS:
            if is_played_chord:
                chord_keys = set()
                is_played_chord = False
            chord_keys.add(key.name)
        else:
            print("Unknown key {0} pressed".format(key.name))
    
    def on_release(key):
        if key.name in values.RIGHT_HAND_KEYS:
            values.RIGHT_NOTES[key.name].stop()
    
    def main():
        bpm_time = 60 / ask_bpm()
        keyboard.on_press(on_press)
        keyboard.on_release(on_release)
        threading.Thread(target=play_chord, args=(bpm_time,)).start()
        keyboard.wait()
    
    if __name__ == '__main__':
        pygame.mixer.init()
        main()
    

    在修改后的代码中,我添加了pygame.mixer.init()来初始化音频模块,并且使用了pygame.mixer.music来同时播放多个声音。注意,在使用pygame.mixer.music时,需要确保音频文件的路径是正确的。

    请注意,由于我无法运行完整的代码并测试它,在实际运行中可能会遇到其他问题。如果您仍然遇到困难,请提供更多的细节和错误信息,以便我能够更好地帮助您解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月9日

悬赏问题

  • ¥15 r语言练习题,三个问题都有疑惑
  • ¥15 绝对路径都行,为什么相对路径不行
  • ¥20 ARM64架构下SSCMS部署问题
  • ¥20 请教如何让移动端的热区自适应
  • ¥30 为什么深度学习网络训练会出现训练集和测试集准确率和损失都不变的情况
  • ¥66 如何adb的情况下找打手机隐藏的文件
  • ¥15 (标签-3D|关键词-色模型)
  • ¥15 发现在MSVS2022中”#pragma once“不起作用
  • ¥15 实时声纹降噪算法进行无关说话人语音抑制
  • ¥100 adb针对解决手机锁屏问题(相关搜索:手机锁屏)