0
Этот код, похоже, работает нормально, но на самом деле не do ничего, кроме открытия окна pygame. Я ищу звук, который будет воспроизводиться при нажатии клавиши «z».Звуковой код Pygame не работает
У кого-нибудь есть проблемы с этим кодом?
import pygame
from pygame.locals import *
import math
import numpy
size = (1200, 720)
screen = pygame.display.set_mode(size, pygame.HWSURFACE | pygame.DOUBLEBUF)
pygame.display.set_caption('Nibbles!')
SAMPLE_RATE = 22050 ## This many array entries == 1 second of sound.
def SineWave(freq=1000,volume=16000,length=1):
num_steps = length*SAMPLE_RATE
s = []
for n in range(num_steps):
value = int(math.sin(n * freq * (6.28318/SAMPLE_RATE) * length)*volume)
s.append([value,value])
x_arr = array(s)
return x_arr
def SquareWave(freq=1000,volume=100000,length=1):
length_of_plateau = SAMPLE_RATE/(2*freq)
s = []
counter = 0
state = 1
for n in range(length*SAMPLE_RATE):
if state == 1:
value = volume
else:
value = -volume
s.append([value,value])
counter += 1
if counter == length_of_plateau:
counter = 0
if state == 1:
state = -1
else:
state = 1
x_arr = array(s)
return x_arr
def MakeSound(arr):
return pygame.sndarray.make_sound(arr)
def PlaySquareWave(freq=1000):
MakeSound(SquareWave(freq)).play()
def PlaySineWave(freq=1000):
MakeSound(SineWave(freq)).play()
def StopSineWave(freq=1000):
MakeSound(SineWave(freq)).fadeout(350)
def StopSquareWave(freq=1000):
MakeSound(SquareWave(freq)).fadeout(350)
_running = True
while _running:
SineWaveType = 'Sine'
SquareWaveType = 'Square'
d = {SineWaveType:SquareWaveType, SquareWaveType:SineWaveType}
Type = SineWaveType
for event in pygame.event.get():
if event.type == pygame.QUIT:
_running = False
if Type == 'Sine':
if event.type == KEYDOWN:
#lower notes DOWN
if event.key == K_ESCAPE:
_running = False
if event.key == K_ENTER:
Type = d[Type] #Toggle
elif event.key == K_z:
PlaySineWave(130.81)
if event.type == KEYUP:
#lower notes UP
if event.key == K_z:
StopSineWave(130.81).fadeout(350) #fade sound by .35 seconds
elif Type == 'Square':
if event.type == KEYDOWN:
#lower notes DOWN
if event.key == K_z:
PlaySquareWave(130.81)
if event.type == KEYUP:
#lower notes UP
if event.key == K_z:
StopSquareWave(130.81).fadeout(350) #fade sound by .35 seconds
pygame.quit()
Вы понимаете, что ваш цикл '_running' абсолютно ничего не значит, но ждать' QUIT', правильно? В какой момент вы ожидаете, что этот код действительно сделает что-нибудь? – jonrsharpe
Теперь я чувствую себя глупо, этого не замечал. Я отредактировал оригинальный пост, теперь он даже не откроет окно pygame, я все еще что-то пропущу? – ZenLogic
Вам действительно нужно разобраться с областью определения на основе Python - все от 'if Type == 'Sine':' on down is ** вне ** цикла while. – jonrsharpe