Звуковой синтезатор в реальном времени с различных входов в Python - PullRequest
3 голосов
/ 11 февраля 2012

Я пытаюсь создать своего рода педаль [¹], чтобы искажать различные входные звуки.

Когда я начинаю с земли, я пытаюсь генерировать в Python непрерывныйзвука и для изменения частоты этого звука, когда я перемещаю полосу прокрутки (или аналогичный виджет).

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

Я получил хороший результат с моим arduino благодаря простой функции tone () [²].Вероятно, время задержки настолько мало, что звук кажется непрерывным.Можно ли сделать подобное на моем компьютере с библиотеками python в Linux?

Спасибо, кто мне поможет!:)

[¹] http://en.wikipedia.org/wiki/Effects_pedal

[²] http://arduino.cc/en/Reference/Tone

Ответы [ 2 ]

3 голосов
/ 11 февраля 2012

Здравствуйте, я использовал эту формулу в прошлом году для создания педали

M = 2*D/(1-D);
x = (1+M)*(x)./(1+k*abs(x));

X = входной сигнал

D = проверка искажения некоторых значений, таких как 0,1, 0,5, 0,9 и т. Д., И просмотр результатов.

Это может быть использовано в режиме реального времени inputline + python + pyaudio, звук выглядит как один Overdrive ...

Обновление:

Запись в реальном времени примитивного искажения педали в Python

#ederwander
import pyaudio 
import numpy as np 
import wave 

chunk = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 1 
RATE = 8800 
K=0 
DISTORTION = 0.61

p = pyaudio.PyAudio() 

stream = p.open(format = FORMAT, 
                channels = CHANNELS, 
                rate = RATE, 
                input = True, 
                output = True, 
                frames_per_buffer = chunk) 


print "Eng Eder de Souza - ederwander" 
print "Primitive Pedal" 


while(True): 

    data = stream.read(chunk) 
    data = np.fromstring(data, dtype=np.int16)  
    M = 2*DISTORTION/(1-DISTORTION);
    data = (1+M)*(data)/(1+K*abs(data));
    data = np.array(data, dtype='int16') 
    signal = wave.struct.pack("%dh"%(len(data)), *list(data))
    stream.write(signal) 

stream.stop_stream() 
stream.close() 
p.terminate() 

Измените переменную DISTORTION, чтобы увидеть разные результаты:

Я немного изменил свой источник, чтобы воспроизвести записанные сэмплы, Я сделал несколько тестов, я получил этот звук: http://www.freesound.org/people/eriatarka/sounds/15753/ а затем применил формулу, описанную здесь, вы можете прослушать измененный файл здесь: http://www.freesound.org/people/ederwander/sounds/146277/

1 голос
/ 11 февраля 2012

PyAudio предоставляет привязки Python для portaudio.Вы можете выполнять обработку аудио в режиме реального времени, хотя Python не является высокопроизводительным языком для чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...