Ошибка при воспроизведении синусоиды через pygame.sndarray
В настоящее время я пытаюсь написать небольшое приложение для управления звуками. Основная цель состоит в том, чтобы я подключил контроллер PS3 к Raspberry Pi и мог воспроизводить и изменять звуки с помощью аналоговых джойстиков. Это просто предварительный просмотр, почему я хочу сделать следующее.
Я написал следующий код, чтобы создать синусоидальную волну и записать ее в массив.
import math, numpy
import pygame
pygame.init()
#>>> (6, 0)
SAMPLERATE = 44100
def tone(freq=1000,volume=16000,length=1):
num_steps = length*SAMPLERATE
s = []
for n in range(num_steps):
value = int(math.sin(n * freq * (6.28318/SAMPLERATE) * length)*volume)
s.append( [value,value] )
x_arr = numpy.array(s)
return x_arr
pygame.sndarray.make_sound(tone())
Если я теперь хочу запустить его, я получаю следующие ошибки:
Traceback (most recent call last):
File "", line 19, in <module>
File "/usr/lib/python3.4/site-packages/pygame/sndarray.py", line 131, in make_sound
return numpysnd.make_sound (array)
File "/usr/lib/python3.4/site-packages/pygame/_numpysndarray.py", line 75, in make_sound
return mixer.Sound (array=array)
ValueError: Unsupported integer size 8
Но я не очень понимаю, где ошибка.
1 ответ
Решение
pygame.sndarray.make_sound
кажется, поддерживает только определенные целочисленные типы, такие как int8
:
import numpy
import pygame
pygame.init()
#>>> (6, 0)
wave = numpy.array([[1,1], [2,2], [3,3]], dtype="int64") # default
pygame.sndarray.make_sound(wave)
#>>> Traceback (most recent call last):
#>>> File "", line 8, in <module>
#>>> File "/usr/lib/python3.4/site-packages/pygame/sndarray.py", line 131, in make_sound
#>>> return numpysnd.make_sound (array)
#>>> File "/usr/lib/python3.4/site-packages/pygame/_numpysndarray.py", line 75, in make_sound
#>>> return mixer.Sound (array=array)
#>>> ValueError: Unsupported integer size 8
против
wave = numpy.array([[1,1], [2,2], [3,3]], dtype="int8") # default
pygame.sndarray.make_sound(wave)
#>>> <Sound object at 0x7f6adfd395d0>
Обратите внимание, что максимальное целое число int8
может хранить жалкое 127.