Сложенные ноты Pyaudio / Numpy просто расширяют первую ноту - PullRequest
2 голосов
/ 13 октября 2019

Я пытаюсь создать свои собственные заметки, используя pyaudio, но я сталкиваюсь с тем, что, безусловно, является ошибкой новичка. Я могу генерировать чистые синусоидальные и воспроизводить их последовательно, но если я попытаюсь объединить их, я не получу три ноты подряд, я получу оригинальную ноту, сыгранную в три раза дольше.

import numpy as np
import pyaudio

def play_note(note):
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paFloat32,
                      channels=1,
                      rate=44100,
                      output=True)
    stream.write(np.asarray(note, dtype=np.float32))
    stream.stop_stream()
    stream.close()
    p.terminate()

sampling_rate = 44100
seconds = 1
x = np.arange(sampling_rate * seconds)

freqs = [440,660,880]

notes = []

for freq in freqs:
    note = 100*np.sin(2 * np.pi * freq * x /sampling_rate)
    notes.append(note)

# This is the behavior I want
for note in notes:
    play_note(note)

# I would expect this to behave similarly, but without the gaps. It doesn't.
note = np.concatenate(notes)
play_note(note)

1 Ответ

0 голосов
/ 13 октября 2019

Я получаю тот же результат с pyaudio 0.2.11 (работает на Mac OS 10.12.6). Я смог исправить это, добавив аргумент frames_per_buffer=1 к p.open() и num_frames=len(note) к stream.write():

def play_note(note):
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paFloat32,
                      channels=1,
                      rate=44100,
                      output=True,
                      frames_per_buffer=1)
    stream.write(np.asarray(note, dtype=np.float32), num_frames=len(note))
    stream.stop_stream()
    stream.close()
    p.terminate()

Я не исследовал дальше, чтобы ответить почему оригинальная версия не работает или почему это изменение исправляет это. Возможно, гуру-пиаудио даст более подробный ответ.

...