Я использую два метода, чтобы создать табличный синтезатор звука:Web Audio API - разница между PeriodicWave и looping AudioBufferSourceNode для достижения 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, 0,1, 0,4, 0,6, ...) для более сложных волн.
var wave = ac.createPeriodicWave(real, imag);
OscillatorNode.setPeriodicWave(wave);
Каковы плюсыn минусы использования одного метода над другим? Получают ли эти методики очень разные звуковые результаты?
У меня есть демо здесь, который играет оба подхода: http://davedave.us/wavetable-synth/
Мой код в стадии разработки, но это здесь: https://github.com/looshi/wavetable-synth
Спасибо! Загруженный аудиофайл будет иметь такую же частоту дискретизации, как и аудиоконтекст. Также последний образец буфера будет равен первому образцу по соглашению в аудиофайлах. Я прочитаю, что вы подразумеваете под периодической волной, которая вынуждена быть ограниченной по диапазону, есть ли у вас больше информации или ссылок, которые описывают это более подробно? – looshi
См., Например, https://en.wikipedia.org/wiki/Bandlimiting. В принципе, если у вас есть PeriodicWave, скажем, квадратная волна, гармоники математически уходят в бесконечность. Но WebAudio ограничивает максимальную гармонику менее чем половиной частоты дискретизации, поэтому ограничивает полосу пропускания сигнала. Вы можете слышать, что это создает прямоугольный осциллятор. Затем увеличьте частоту генератора. В конце концов, выход звучит как синусоидальная волна вместо квадратной волны. Это ограничение диапазона - высшие гармоники удаляются. –