为什么Pysound添加波形选择逻辑后输出空WAV文件?
问题原因与修复方案
核心错误点
- StringVar未调用get()方法取值
你代码中直接对selectedWave1、selectedWave2这两个Tkinter StringVar对象做字符串比较,没有调用.get()方法获取它们存储的实际值,导致所有波形判断分支永远不会触发,data和data2始终是初始赋值的空字符串,写入文件后自然就是0秒的空音频。 - 变量名引用错误
voice1部分你定义的包络变量是env1,但所有振荡器调用时传的amplitude参数是env,这个变量不存在,就算if分支能触发也会直接抛出NameError。 - 可选优化点:
attack_decay包络你仅传了attack参数,没有传decay参数,后续要做完整AD包络记得补全参数即可。
修复后的save函数代码
def save(): data = "" data2 = "" #create buffers params = buffer.BufferParams() buffer.create_buffer(params, value=0.0) #voice 1 env1=envelopes.attack_decay(params, attack=params.t2s(int(A1.get())/10)) # 调用get()获取StringVar存储的实际波形值 selected_wave1 = selectedWave1.get() if selected_wave1=="Sine": # 传入正确的包络变量名env1 data = oscillators.sine_wave(params,frequency=400,amplitude=env1) elif selected_wave1=="Saw": data = oscillators.saw_wave(params,frequency=400,amplitude=env1) elif selected_wave1=="Square": data = oscillators.square_wave(params,frequency=400,amplitude=env1) elif selected_wave1=="Noise": data = oscillators.noise(params,frequency=400,amplitude=env1) #voice 2 env2=envelopes.attack_decay(params, attack=params.t2s(int(A2.get())/10)) selected_wave2 = selectedWave2.get() if selected_wave2=="Sine": data2=oscillators.sine_wave(params,frequency=400,amplitude=env2) elif selected_wave2=="Saw": data2=oscillators.saw_wave(params,frequency=400,amplitude=env2) elif selected_wave2=="Square": data2=oscillators.square_wave(params,frequency=400,amplitude=env2) elif selected_wave2=="Noise": data2=oscillators.noise(params,frequency=400,amplitude=env2) #save files soundfile.save(params, 'voice2.wav', data) soundfile.save(params,'voice1.wav',data2)
你看到的tostring()弃用警告不影响功能,是pysound库内部实现使用了过时方法,和本次空文件问题无关。
内容的提问来源于stack exchange,提问作者PhantomZ
相关产品推荐
相关产品推荐

