【发布时间】:2019-03-06 08:32:31
【问题描述】:
这段代码似乎运行正常,但实际上并没有做任何它应该做的事情,除了打开 pygame 窗口。我正在寻找按下“z”键时播放的声音。
谁能看出这段代码有问题?
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之外什么都不做,对吧?您希望这段代码在什么时候真正做任何事情? -
我现在觉得自己很蠢,完全没有注意到这一点。我已经编辑了原始帖子,现在它甚至无法打开 pygame 窗口,我这里还有什么遗漏吗?
-
您确实需要掌握 Python 的基于缩进的作用域 - 从
if Type == 'Sine':到以下的所有内容都在while循环之外。 -
我的实际代码不是这种情况,它就是这样粘贴到这里的,据我所知,所有缩进都是正确的,原帖已被再次编辑以显示这一点。
-
每个循环你应该只通过
event in pygame.event.get()一次,否则你可能会在寻找另一个事件时丢弃一个事件。
标签: python audio numpy pygame trigonometry