使用iPython.display.Audio生成一系列音频音调

时间:2015-12-13 18:17:40

标签: python audio ipython pyaudio

我想在iPython中生成连续的音频音调。我见过pyo,但我只能在terminal中使用它......如果可能,我更愿意在iPython中测试一下作文。

我最近发现iPython.display.Audio并认为它可能是为动画生成色调的有用方法。

# Generate a sound

from IPython.display import Audio 
import numpy as np

def waveform(freq,sec=1,sample_rate=44100):
    t = np.linspace(0,sec,sample_rate*sec)
    return(np.sin(np.pi*freq*t))

scale =   [440, 493.88, 523.25, 587.33, 659.25, 698.46, 783.99, 880.00]
sample_rate = 44100

Audio(waveform(440,sec=2),rate=sample_rate,autoplay=True)

所以这样可行,它会产生一个小音箱GUI,可以播放我的音调。 。 。但是当我尝试时,我无法生成多个音调:

for note in scale:
    Audio(waveform(note,sec=2),rate=sample_rate,autoplay=True)

我真的想让iPython.display.Audio工作,但如果它实时播放音调(而不仅仅是写入文件),我愿意使用其他模块。我听说过pyaudiopygame,但我不确定是否可以动态生成声音。

1 个答案:

答案 0 :(得分:2)

[编辑]我意识到我误解了你的问题。我原来的答案是关于组合音调,你可能仍然觉得有用,所以我把它留在下面。您需要附加音频矢量来制作一个长音,如下所示:

sequence = np.array([])
for note in scale:
    sequence = np.append(sequence, waveform(note, sec))
Audio(sequence,rate=sample_rate,autoplay=True)

如果您想一次播放多个音色,请继续阅读。

音频波遵循叠加原理,因此多个波的组合是所有部分的线性和。这非常酷,因为它意味着您可以通过字面总结来组合多个声音,因为您已经将它们以漂亮的矢量形式存在。

sec = 2
chord = waveform(0, sec) # silence
for note in scale:
    chord += waveform(note, sec)
Audio(chord,rate=sample_rate,autoplay=True)

这里有一个非常好的page on superposition of waves,因为它与音频有关。