Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将numpy数组转换为复调音乐?_Python_Arrays_Numpy_Audio_Scipy - Fatal编程技术网

Python 如何将numpy数组转换为复调音乐?

Python 如何将numpy数组转换为复调音乐?,python,arrays,numpy,audio,scipy,Python,Arrays,Numpy,Audio,Scipy,我想使用阵列播放音乐/声音。输出的音乐/声音需要是复调的 我试过这个: 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

我想使用阵列播放音乐/声音。输出的音乐/声音需要是复调的

我试过这个:

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函数的一个错误。这没关系,因为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
回溯(最近一次呼叫最后一次):
文件“music2.py”,第26行,在
写('song.wav',44100,song)
文件“/usr/lib/python2.7/dist packages/scipy/io/wavfile.py”,第168行,写入

fid.write(struct.pack)(“您得到的错误是由于
write
只需要一个1维或2维数组。您正在向它传递一个3维数组(
dstack
的输出是三维的)

我不确定我是否理解你所说的复调,但如果你只是想让不同的音调相互叠加,那么你所需要做的就是叠加波形:

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

最后,你可能想通过一个一维数组。如果你想写立体声,二维数组是用来的。

你好,艾萨克,谢谢你注意到dstack返回一个3D数组。我需要一个2D数组。复调意味着同时发出不同的声音/频率。我想我不能简单地对“seq*”求和数组,因为我会得到噪声,而不是和弦。事实上,我尝试了你的解决方案,它对单独的音符没有问题,但我得到的是糟糕的声音,而不是C和弦。我只是自己尝试了一下,它似乎工作正常:三个音调按顺序排列,然后全部放在一起。我使用的正是你的代码,但我的“
歌曲=
”行替换是的,它按预期工作,除了当所有声音一起播放时,声音就像噪音。你听到“好听”的声音吗?…让我检查一下所选的频率是否正常。对不起,艾萨克,你是对的!我错误地更改了振幅。你的解决方案是正确的。现在我必须看看如何消除“咔嗒”声在每个音符的末尾发出声音。非常感谢!为了消除“咔哒”声,你应该确保在音符的末尾波形返回到零(以防止扬声器发出铃声)。对于更高频率的声音,你应该在音调的末尾平滑地将振幅减小到零。