Ошибка при воспроизведении синусоиды через 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.

Другие вопросы по тегам