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。音频缓冲区没有该限制。
我正在使用两种技术来创建波表合成器声音:
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。音频缓冲区没有该限制。