Объединение синтезированных тонов в питоне - PullRequest
4 голосов
/ 21 марта 2012

Я использую следующий код, который сгенерирует wav-файл, содержащий тональный сигнал с частотой 440 Гц, длительностью 2 секунды.

from scipy.io.wavfile import write
from numpy import linspace,sin,pi,int16

def note(freq, len, amp=1, rate=44100):
 t = linspace(0,len,len*rate)
 data = sin(2*pi*freq*t)*amp
 return data.astype(int16) # two byte integers

tone = note(440,2,amp=10000)

write('440hzAtone.wav',44100,tone) # writing the sound to a file

Мне было интересно, смогу ли я изменить код, основываясь на методе note, чтобы фактически создать мелодию с python.

Я попытался добавить два разных тона, икак и ожидалось, два тона воспроизводятся одновременно, создавая что-то, похожее на тональный сигнал набора:

tone1 = note(440,2,amp=10000)
tone2 = note(480,2,amp=10000)
tone = tone1+tone2

write('440hzAtone.wav',44100,tone)

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

tone1 = note(440,2,amp=10000)
tone2 = note(480,1,amp=10000)
tone = tone1+tone2

write('440hzAtone.wav',44100,tone)

вызывает:

ValueError: operands could not be broadcast together with shapes (88200) (44100)

Итак, мне было интересно - как можноЯ объединяю разные тоны, чтобы создать мелодию?

Ответы [ 2 ]

4 голосов
/ 21 марта 2012

Вы можете сделать это, используя numpy.concatenate (как уже было опубликовано).Вам также необходимо указать ось конкатенации.Используя очень низкий показатель для иллюстрации:

from scipy.io.wavfile import write
from numpy import linspace,sin,pi,int16,concatenate

def note(freq, len, amp=1, rate=5):
 t = linspace(0,len,len*rate)
 data = sin(2*pi*freq*t)*amp
 return data.astype(int16) # two byte integers

tone1 = note(440,2,amp=10)
tone2 = note(140,2,amp=10)
print tone1
print tone2
print concatenate((tone2,tone1),axis=1)

#output:
[ 0 -9 -3  8  6 -6 -8  3  9  0]
[ 0  6  9  8  3 -3 -8 -9 -6  0]
[ 0  6  9  8  3 -3 -8 -9 -6  0  0 -9 -3  8  6 -6 -8  3  9  0]
0 голосов
/ 21 марта 2012

numpy.linspace создает пустой массив. Чтобы объединить тоны, вы должны объединить соответствующие массивы. Для этого немного Google указывает, что Numpy предоставляет услужливо названную numpy.concatenate функцию .

...