2013-07-07 35 views
4

我想,因爲它是這裏所描述來實現立體聲階段:http://www.image-line.com/support/FLHelp/html/plugins/3x%20OSC.htm如何爲Web Audio API中的OscillatorNode設置相位偏移?

「立體聲相位(SP) - 允許您設置不同階段的發電機的左,右聲道抵消偏移結果振盪器從振盪器形狀的不同點開始(例如,從正弦函數的最高值開始,而不是零點)立體聲相位偏移增加了所產生聲音的豐富度和立體聲全景。

我正試圖爲一個OscillatorNode實現這一點。我唯一的想法是使用createPeriodicWave(https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-createPeriodicWave)。然而,從規範中描述創建週期性波形是我的理解之上,我還沒有找到任何通過Google的例子。

解密createPeriodicWave描述的任何幫助都會有幫助,就像其他有關如何實現此效果的想法一樣。

謝謝!

回答

1

一個簡單的方法來僞造這將是獨立的延遲節點添加到左,右聲道,並給他們的用戶控制的延遲值。這將是我的方法,並且與階段設置具有相同的效果。

如果你想使用createPeriodicWave,不幸的是,你可能不得不瞭解它背後的有些困難的數學。

基本上,您首先必須將波形表示爲正弦波「偏差」的總和。所有的週期波都有這種形式的一些表示。然後,一旦找到每個部分的相對大小,就必須分別對左右聲道分別進行相移,方法是將每個部分乘以一個複數。你可以閱讀有關代表的週期波爲正弦波這裏的總和更多細節:http://music.columbia.edu/cmc/musicandcomputers/chapter3/03_03.php

使用createPeriodicWave已經在使用BufferSourceNode一個顯著的優勢:createPeriodicWave波形會自動避免aliasing。如果在緩衝區中「手動」生成波形,則很難避免別名。

2

我不認爲有可能使用OscillatorNode進行相位偏移。

一個辦法做到這一點是使用context.createBuffer併產生正弦波緩衝區(或任何類型的要波)並將其設置爲緩衝區的BufferSourceNode,然後使用offset參數在其start()方法。但是您需要以秒爲單位計算樣本偏移量。

var buffer = context.createBuffer(1,1024,44100); 

var data = buffer.getChannelData(0); 

for(var i=0; i < data.length; i++){ 
    //generate waveform 
} 

var osc = context.createBufferSourceNode(); 
osc.buffer = buffer; 
osc.loop = true; 

osc.connect(context.destination); 
osc.start(time, offset in seconds); 
4

麥克萊倫等人,

這個答案幫助,隨後扭曲我到傅立葉的世界。在a page on the subject和一些維基百科的幫助下,我想我得到了正方形和鋸齒形圖案,但三角形圖案仍然沒有。有人知道嗎?

它的確給了你相移的能力,如this article by Nick Thompson explains(儘管他不同地調用AudioContext方法,但原理是相同的)。

至於方形和鋸齒模式去:

var n = 4096; 
var real = new Float32Array(n); 
var imag = new Float32Array(n); 
var ac = new AudioContext(); 
var osc = ac.createOscillator(); 

/* Pick a wave pattern */ 

/* Sine 
imag[1] = 1; */ 

/* Sawtooth 
for(x=1;x<n;x++) 
    imag[x] = 2.0/(Math.pow(-1, x) * Math.PI * x); */ 

/* Square */ 
for(x=1;x<n;x+=2) 
    imag[x] = 4.0/(Math.PI * x); 

var wave = ac.createPeriodicWave(real, imag); 

osc.setPeriodicWave(wave); 
osc.connect(ac.destination); 
osc.start(); 
osc.stop(2); /* Have it stop after 2 seconds */ 

這將播放激活模式,在這種情況下,方形圖案。三角形公式會是什麼樣子?

0

通過這篇文章Wolfram三角波的外觀可以建立這樣的:

/* Triangle */ 
for(x=1;x<n;x+=2) 
    imag[x] = 8.0/Math.pow(Math.PI, 2) * Math.pow(-1, (x-1)/2)/Math.pow(x, 2) * Math.sin(Math.PI * x); 

也是很有幫助的方式是Wikipedia頁面,實際上顯示了傅里葉結構是如何工作的。

0
function getTriangleWave(imag, n) { 
    for (var i = 1; i < n; i+=2) { 
     imag[i] = (8*Math.sin(i*Math.PI/2))/(Math.pow((Math.PI*i), 2)); 
    } 
    return imag; 
} 
相關問題