Dan*_*yer 5 python audio signal-processing portaudio pyaudio
当它运行时,音调之间会发出咔嗒声。我不太介意点击声——它有令人愉快的节奏。那是说...
我已经看到这个线程,但还没有弄清楚如何将其应用于我的问题: How to remove pops from concatenated sound data in PyAudio
有任何想法吗?谢谢你的时间!
import numpy
import pyaudio
import math
import random
def sine(frequency, length, rate):
length = int(length * rate)
factor = float(frequency) * (math.pi * 2) / rate
waveform = numpy.sin(numpy.arange(length) * factor)
return waveform
def play_tone(stream, frequency, length, rate=44100):
chunks = []
chunks.append(sine(frequency, length, rate))
chunk = numpy.concatenate(chunks) * .25
stream.write(chunk.astype(numpy.float32).tostring())
def bassline():
frequency = 300
for i in range(1000000):
play_tone(stream, frequency, .15)
change = random.choice([-75, -75, -10, 10, 2, 3, 100, -125])
print (frequency)
if frequency < 0:
frequency = random.choice([100, 200, 250, 300])
else:
frequency = frequency + change
if __name__ == '__main__':
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=1, rate=44100, output=4)
bassline()
Run Code Online (Sandbox Code Playgroud)
/编辑
我已经绘制了音调,看起来不连续性存在于每个音调的开始和结束阶段之间的关系中。
有什么想法可以解决这个问题吗?
最后,我通过在几百毫秒的时间内淡入和淡出每个音调来解决这个问题。这也是控制点击声音的好方法。越接近fade,0咔哒声越大。
import math
import numpy
import pyaudio
def sine(frequency, length, rate):
length = int(length * rate)
factor = (float(frequency) * (math.pi * 2) / rate)
return numpy.sin(numpy.arange(length) * factor)
def play_tone(stream, frequency, length, rate=44100):
chunks = [sine(frequency, length, rate)]
chunk = numpy.concatenate(chunks) * 0.25
fade = 200.
fade_in = numpy.arange(0., 1., 1/fade)
fade_out = numpy.arange(1., 0., -1/fade)
chunk[:fade] = numpy.multiply(chunk[:fade], fade_in)
chunk[-fade:] = numpy.multiply(chunk[-fade:], fade_out)
stream.write(chunk.astype(numpy.float32).tostring())
def test():
test_freqs = [50, 100, 200, 400, 800, 1200, 2000, 3200]
for i in range(2):
for freq in test_freqs:
play_tone(stream, freq, 1)
if __name__ == '__main__':
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=1, rate=44100, output=1)
test()
Run Code Online (Sandbox Code Playgroud)