2012-07-19 3 views
2

음악/사운드를 재생하려면 배열을 사용하고 싶습니다. 출력 음악/사운드는 대위법 일 필요가 있습니다.numpy 배열을 다성 음악으로 변환하는 방법

시도해보십시오.

from scipy.io.wavfile import write 
import numpy as np 

duration=0.24 
amp=1E4 
rate=44100 

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

tone0 = note(0, duration, amp, rate) #silence 
tone1 = note(261.63, duration, amp, rate) # C4 
tone2 = note(329.63, duration, amp, rate) # E4 
tone3 = note(392.00, duration, amp, rate) # G4 


seq1 = np.concatenate((tone1,tone0,tone0,tone0, tone1),axis=1) 
seq2 = np.concatenate((tone0,tone2,tone0,tone0, tone2),axis=1) 
seq3 = np.concatenate((tone0,tone0,tone3,tone0, tone3),axis=1) 

song = np.dstack((seq1,seq2,seq3)) 

write('song.wav', 44100, song) 

나는 song.wav 파일을 재생하고 침묵하고 C 화음 다음 다른 후 주석에게 C, E 및 G를 듣고 싶습니다 (C, E, G 노트는 동시에 재생).

필자가 얻은 것은 쓰기 기능에 의한 오류입니다. 그리고 쓰기 기능 (내가 아는 한 다행 인 wav 파일을 만들 수 없기 때문에)은 괜찮습니다. 이 경우 오류가

Traceback (most recent call last): 
    File "music2.py", line 26, in <module> 
    write('song.wav', 44100, song) 
    File "/usr/lib/python2.7/dist-packages/scipy/io/wavfile.py", line 168, in write 
    fid.write(struct.pack('<ihHIIHH', 16, 1, noc, rate, sbytes, ba, bits)) 
struct.error: 'I' format requires 0 <= number <= 4294967295 

1) 폴리포니를 지원하는 쓰기 기능의 대안을 알고 계십니까? 2) 본인의 코드의 완전한 대안을 공개합니다. 중요한 점은 수위가 낮은 배열에서 다성 음악을 생성 (또는 재생)하는 것입니다. 나는이 http://img44.imageshack.us/img44/6182/music.swf과 같은 것을하려고 노력하고있다. 그러나 훨씬 더 단순하고, GUI가 아니고, 대화식이 아니라, 1과 0 배열의 똑같은 생각은 행에 할당 된 행과 특정 음/노트와 열의 코드이다. 재생됩니다.

답변

1

오류는 write (1 차원 또는 2 차원 배열 만 원함) 때문에 발생합니다. 3 차원 배열을 전달하고 있습니다 (dstack의 출력은 3D입니다).

song = seq1 + seq2 + seq3 # Assumes seqs are of same length 
:

나는 당신이 화음을 의미하는 것을 얻을 수 있지만, 당신은 단순히 당신이 파형을 중첩되어 다음 당신이해야 할 모든 각-다른 겹쳐 서로 다른 톤을 갖고 싶어한다는 것을 의미 있는지 확실하지 않습니다

결국 결국 1 차원 배열을 전달하려고합니다. 2-D 어레이는 스테레오 사운드를 쓰고 싶을 때 사용할 수 있습니다.

+0

안녕하세요, Isaac, dstack에서 3D 배열을 반환한다는 점에 유의 해 주셔서 감사합니다. 2D 배열이 필요합니다. 폴리 포닉은 다른 소리/주파수가 동시에 들리는 것을 의미합니다. 나는 단순한 합계 "seq *"배열을 줄 수 없다고 생각합니다. 왜냐하면 화음 대신에 잡음을 얻을 것이기 때문입니다. 사실 나는 당신의 솔루션을 시험해 보았는데, 분리 노트에 대해서는 괜찮 았지만 C 코드 대신 끔찍한 소리가납니다. – aloctavodia

+0

나는 그저 나 자신을 시험해 보았고 다음과 같이 3 가지 톤을 순차적으로 사용했다. 나는 당신의 코드를 정확하게 사용하고 있지만, 내 ''song =''선은 당신을 대신합니다. – Isaac

+0

예, 모든 사운드가 함께 소리를 재생할 때를 제외하고 예상대로 작동합니다. "좋은"것을 듣고 있습니까? ... 선택한 주파수가 괜찮은지 확인해 봅시다. – aloctavodia

관련 문제