4

配列を使用して音楽/サウンドを再生したい。出力音楽/サウンドはポリフォニックである必要があります。

私はこれを試しました:

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、E、G の音符を次々と聞き、次に無音、そして C のコードを聞きたいと思います (C、E、G 音符が同時に再生されます)。

私が得るのは、代わりに書き込み機能によるエラーです。write 関数は (私が知る限り、ポリフォニックな 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. ポリフォニーをサポートする write 関数に代わるものを知っていますか?
  2. 私は自分のコードの完全な代替案に対してオープンです。重要なポイントは、numpy 配列からポリフォニック サウンドを生成 (または再生) することです。私はこのようなことをしようとしています: http://img44.imageshack.us/img44/6182/music.swf、しかしもっと簡単です。GUI ではありません。インタラクティブではなく、1 と 0 の配列の同じアイデアが行に割り当てられ、特定のサウンド/ノートとそれらのノートが再生される時間の列コードでした。
4

1 に答える 1

2

取得しているエラーはwrite、1 次元または 2 次元の配列のみが必要なためです。3次元配列を渡しています(の出力dstackは3Dです)。

ポリフォニックとは何を意味するのかよくわかりませんが、単に異なるトーンを互いに重ね合わせたいという意味であれば、波形を重ね合わせるだけで済みます。

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

最終的には、おそらく 1 次元配列を渡したいと思うでしょう。2 次元配列は、ステレオ サウンドを書きたい場合に適しています。

于 2012-07-20T00:10:01.373 に答える