我希望能夠重現下面代碼背後的想法,但是聽起來並不可怕。理想情況下,我想要一個使用學校孩子可以理解的代碼的解決方案(可以導入play_note函數,這樣他們就不必擔心它是如何工作的)。一個回答here建議連續音符之間的點擊是由於聲音的不完整週期,但我不知道如何解決改變持續時間。順利地「Audialize」在Python中與Turtle和PyAudio一起遞歸
任何人都可以幫忙嗎?它可以使一些調整工作,或者是某種方式有缺陷嗎?
import turtle
import pyaudio
import numpy as np
def play_note(freq, dur):
p = pyaudio.PyAudio()
volume = 0.5 # range [0.0, 1.0]
fs = 44100 # sampling rate, Hz, must be integer
duration = dur # in seconds, may be float
f = freq # sine frequency, Hz, may be float
# generate samples, note conversion to float32 array
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)
# 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(volume*samples)
stream.stop_stream()
stream.close()
p.terminate()
def tree(branchLen,t):
if branchLen > 5:
freq = branchLen * 2 + 400
dur = branchLen/100.0
print freq, dur
play_note(freq, dur)
t.forward(branchLen)
t.right(20)
tree(branchLen-15,t)
t.left(40)
tree(branchLen-15,t)
t.right(20)
t.backward(branchLen)
def main():
t = turtle.Turtle()
t.speed(0)
myWin = turtle.Screen()
t.left(90)
t.up()
t.backward(100)
t.down()
t.color("green")
tree(75,t)
myWin.exitonclick()
main()
當幅度突然變化時,音頻會發生點擊,如果您在一個週期中間切斷了正弦波,則會發生這種情況。解決辦法是添加一個信封,在你的情況下,這意味着淡出最後一個樣本,例如10-20ms的樣本。 – Linuxios
謝謝@Linuxios。任何機會,你可以讓我知道如何修改我的代碼來實現? – Robin
我發佈了一個答案,應該是一個合理的出發點,讓我知道是否有任何內容可以擴展或解釋更多。 – Linuxios