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

时间:2017-01-19 17:33:24

标签: javascript fft web-audio

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

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

1 个答案:

答案 0 :(得分:2)

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

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

对于高基频,周期波可能听起来有点不同,因为它被强制限制带宽。音频缓冲区没有这种限制。