我使用两种技术创建波表合成器声音:
1 - 循环包含单个波形周期的AudioBufferSourceNode
// Load a single cycle short wave file, then :
audioContext.decodeAudioData(audioData, function(buffer) {
source.buffer = buffer;
source.loop = true;
},
2 - 创建PeriodicWave并为其提供傅里叶系数 (使用网络上找到的系数,即(0,1)表示正弦波,(0,.1,.4,.6,...)表示更复杂的波。
var wave = ac.createPeriodicWave(real, imag);
OscillatorNode.setPeriodicWave(wave);
使用一种技术优于另一种技术有什么优缺点?这些技术会产生非常不同的听觉效果吗?
我在这里有一个演示,它可以播放两种方法: http://davedave.us/wavetable-synth/
我的代码正在进行中,但它在这里: https://github.com/looshi/wavetable-synth
答案 0 :(得分:2)
如果您加载的音频文件的采样率和音频上下文的采样率相同,那么两者之间并没有太大差异。我能想到的主要区别是,如果循环的第一个和最后一个样本显着不同,缓冲方法会产生毛刺。除非你这样做,否则周期波不会发生这种情况。
如果不更改频率,音频缓冲区可能需要更少的CPU来产生音频。
对于高基频,周期波可能听起来有点不同,因为它被强制限制带宽。音频缓冲区没有这种限制。