2015-05-05 6 views
2

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

Поскольку точки останова перемещаются по оси x, я думал, что частота колебательного сигнала изменится, но есть только эффект фильтрации, и частота, по-видимому, определяется только размером буфера сценария ProcessorNode, который должен быть мощностью из 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

Это все основано на программе синтеза Генди стохастического Яниса Ксенакис.

Спасибо!

+0

кажется из кода 'M' должно быть изменение частоты права? – notthetup

+0

@notthetup 'm' - это наклон в уравнении y = m (x) + b', который используется для линейной интерполяции между каждой точкой. Я работаю над попыткой отделить «scriptNode.bufferSize» от частоты, с которой форма волны записывается в буфер. Я изучал этот пример, создавая генератор scriptProcessorNode с шагом, не зависящим от буфера, но я еще не взломал его. http://sriku.org/blog/2013/01/30/taming-the-scriptprocessornode/#replacing-oscillator-with-scriptprocessornode. Любое руководство будет оценено! –

ответ

1

Я решил проблему, используя переменную index за пределами моей функции scriptNode.onaudioprocess для записи формы сигнала в буфер сценария. Таким образом, частота, с которой форма волны записывается в буфер, не привязана к размеру буфера.

Вот окончательный код:

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(); 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^