Web Audio API - PeriodicWave 和循环 AudioBufferSourceNode 实现波表的区别?

Web Audio API - difference between PeriodicWave and looping AudioBufferSourceNode to achieve a wavetable?

我正在使用两种技术来创建波表合成器声音:

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

如果您正在加载的音频文件的采样率和音频上下文的采样率相同,那么两者之间并没有太大区别。我能想到的主要区别是,如果循环的第一个和最后一个样本差异很大,缓冲区方法会产生故障。除非你这样做,否则周期波不会发生这种情况。

如果您不更改频率,音频缓冲区可能需要更少 CPU 来生成音频。

对于高基频,周期波可能听起来有点不同,因为它被强制为 band-limited。音频缓冲区没有该限制。