scriptProcessorNode частота генератора
Я работаю над стохастическим осциллятором веб-аудио, и у меня возникли проблемы с scriptProcessorNode. Мой алгоритм использует случайное блуждание для определения динамических точек останова в форме сигнала, а затем интерполирует между ними.
Когда точки останова перемещаются по оси x, я думал, что частота колебательного сигнала будет меняться, но эффект фильтрации будет существовать, а частота, по-видимому, определяется размером буфера scriptProcessorNode, который должен быть степенью 2 между 256 и 16384.
Как вы меняете частоту генератора scriptProcessorNode?
Вот мой сводный код:
scriptNode.onaudioprocess = function(audioProcessingEvent) {
walk(); //use random walk to generate new x/y position for each breakpoint
var outputBuffer = audioProcessingEvent.outputBuffer;
var lastPoint = 0;
var index = 0;
// linearly interpolate between the new breakpoint positions
for(var i = 0; i < breakpoint.length-1; i++) {
var y = breakpoint[lastPoint].y;
for(var channel = 0; channel <= 0;channel++) {
var outputData = outputBuffer.getChannelData(channel);
if(i != 0){
if(y >= breakpoint[i].y) {
while(y >= breakpoint[i].y) {
y = (breakpoint[i].m*index)+breakpoint[i].b;// y = m(x)+b
outputData[index] = y;
index++;
}
} else if(y <= breakpoint[i].y) {
while(y <= breakpoint[i].y) {
y = (breakpoint[i].m*index)+breakpoint[i].b;
outputData[index] = y;
index++;
}
}
}
}
lastPoint = i;
}
}
А вот ссылка на рабочий пример: http://andrewbernste.in/bernie/gendy011.html
Все это основано на программе стохастического синтеза Яндиса Ксенакиса.
Спасибо!
1 ответ
Я решил проблему с помощью index
переменная вне моего scriptNode.onaudioprocess
функция для записи сигнала в буфер scriptNode. Таким образом, частота, с которой сигнал записывается в буфер, не привязана к размеру буфера.
Вот окончательный код:
var index = 0;
var freq = 0.8;
scriptNode.onaudioprocess = function(audioProcessingEvent){
var outputBuffer = audioProcessingEvent.outputBuffer;
var outputData = outputBuffer.getChannelData(0);
for(var j = 0; j < outputData.length;j++){
// linearly interpolate between the new breakpoint positions
// get the interp point by comparing index to the x distance
var lerp = (index - breakpoint[point].x) / (breakpoint[point+1].x - breakpoint[point].x)
y = nx.interp(lerp,breakpoint[point].y,breakpoint[point+1].y);
if(point < breakpoint.length && index >= breakpoint[point+1].x) {
point++;
}
outputData[j] = y;
index+=freq;
if(index >= breakpoint[breakpoint.length-1].x){
index = 0;
point = 0;
walk();
}
}
}