Активно меняет частоту синусоиды в Python - PullRequest
0 голосов
/ 28 мая 2020
• 1000 Я давно хотел, чтобы Raspberry Pi генерировал тоны локально. Я могу воспроизводить тоны колокольчиков, выполнив следующие действия:
import numpy as np

p = pyaudio.PyAudio()

volume = 1     # range [0.0, 1.0]
fs = 44100       # sampling rate, Hz, must be integer
samples = ''

# generate samples, note conversion to float32 array

duration = 5.0   
f = 500.0        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()


duration = 1.0   
f = 440.0        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 349.23       
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 392.00        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 261.63        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 0.5 
f = 1.0        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 261.63        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 392.00       
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 440.0        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 1.0   
f = 349.23       
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
duration = 0.5  
f = 1        
samples = samples + (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()


# for paFloat32 sample values must be in range [-1.0, 1.0]
stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=fs,
                output=True)


# play. May repeat with different volume values (if done interactively) 
stream.write(samples)

stream.stop_stream()
stream.close()

p.terminate()

, однако я не могу создавать тоны, которые повышаются или опускаются по высоте с течением времени, такие как тоны «Wail». Что мне нужно сделать с моим кодом, чтобы разрешить такое создание?

...