2017-01-19 1 views
4

Я использую два метода, чтобы создать табличный синтезатор звука: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

ответ

2

Если частота дискретизации звукового файла вы загружаете и частота выборки аудиоконтекста одинакова, тогда между ними нет большой разницы. Основное различие, о котором я могу думать, заключается в том, что буферный подход может вызвать сбои, если первый и последний выборки цикла сильно различаются. Это не произойдет с периодической волной, если вы не сделаете так.

Если вы не меняете частоту, для звукового буфера может потребоваться несколько меньше процессора.

Для высоких фундаментальных частот периодическая волна, вероятно, будет звучать немного иначе, потому что она вынуждена быть ограниченной по диапазону. Звуковой буфер не имеет этого ограничения.

+0

Спасибо! Загруженный аудиофайл будет иметь такую ​​же частоту дискретизации, как и аудиоконтекст. Также последний образец буфера будет равен первому образцу по соглашению в аудиофайлах. Я прочитаю, что вы подразумеваете под периодической волной, которая вынуждена быть ограниченной по диапазону, есть ли у вас больше информации или ссылок, которые описывают это более подробно? – looshi

+2

См., Например, https://en.wikipedia.org/wiki/Bandlimiting. В принципе, если у вас есть PeriodicWave, скажем, квадратная волна, гармоники математически уходят в бесконечность. Но WebAudio ограничивает максимальную гармонику менее чем половиной частоты дискретизации, поэтому ограничивает полосу пропускания сигнала. Вы можете слышать, что это создает прямоугольный осциллятор. Затем увеличьте частоту генератора. В конце концов, выход звучит как синусоидальная волна вместо квадратной волны. Это ограничение диапазона - высшие гармоники удаляются. –

Смежные вопросы