我的程序想要同时播放音频,但是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"),
}