2015-07-13 38 views
2

我使用Pygame在窗口中渲染一個Sprite,我想播放一個正弦聲音,其頻率取決於該Sprite的y位置。我不希望信號階段出現不連續性。達到此目的的最佳方式是什麼?如何連續改變正弦聲音的頻率?

+0

你嘗試過這麼遠嗎?一個明顯的解決方案是使用樣條函數或類似的東西來轉換頻率。 – llogiq

+0

@llogic如果我只是改變頻率,我該如何確保相位不會出現不連續? –

+0

在過零時改變頻率。 – jaket

回答

1

我想出了這個解決方案。 更改freqnewfreq,然後改變這樣的階段:newphase = 2*np.pi*t*(freq-newfreq)+phase

import pyaudio 
import numpy as np 
from time import time 

CHANNELS = 2 
RATE = 44100 

TT = time() 
freq = 100 
newfreq = 100 
phase = 0 
def callback(in_data, frame_count, time_info, status): 
    global TT,phase,freq,newfreq 
    if newfreq != freq: 
     phase = 2*np.pi*TT*(freq-newfreq)+phase 
     freq=newfreq 
    left = (np.sin(phase+2*np.pi*freq*(TT+np.arange(frame_count)/float(RATE)))) 
    data = np.zeros((left.shape[0]*2,),np.float32) 
    data[::2] = left 
    data[1::2] = left 
    TT+=frame_count/float(RATE) 
    return (data, pyaudio.paContinue) 

p = pyaudio.PyAudio() 

stream = p.open(format=pyaudio.paFloat32, 
       channels=CHANNELS, 
       rate=RATE, 
       output=True, 
       stream_callback=callback) 

stream.start_stream() 
start = time() 
try: 
    while 1: 
     now = time()  
     if now-start>1/24.: 
      newfreq=200+np.sin(2*np.pi*1/20.*now)*100 #update the frequency This will depend on y on the future 
      print newfreq 
     start=now 
finally: 
    stream.stop_stream() 
    stream.close() 
    p.terminate()