2010-08-02 80 views
2

是否有通用的代碼可用於使用數學課程生成正方形,三角形,鋸齒或任何其他自定義波形?ActionScript - 從Math.sin()創建正方形,三角形,鋸齒波?

下面是處理SampleDataEvent並播放中等c(440 Hz)正弦波的基本函數。我想通過結合正方形,三角形和其他波來改變音調。

var position:int = 0; 

var sound:Sound = new Sound(); 
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler); 
sound.play(); 

function sampleDataHandler(event:SampleDataEvent):void 
    { 
    for(var i:int = 0; i < 2048; i++) 
     { 
     var phase:Number = position/44100 * Math.PI * 2; 
     position ++; 

     var sample:Number = Math.sin(phase * 440); 
     event.data.writeFloat(sample); // left 
     event.data.writeFloat(sample); // right 
     } 
    } 
+0

你只需要用'sin'嗎?你可以寫你自己的功能嗎? – kennytm 2010-08-02 11:16:46

+0

我沒有要求使用Math.sin(),但我只是假設使用Math.sin()(或.cos())將如何創建自定義波形完成?或者至少很容易完成。 – TheDarkIn1978 2010-08-02 11:27:53

回答

3

維基百科給出了squaretrianglesawtooth波簡單的公式。這裏可能是最簡單的(它們都有句號1):

 
square(t) = sgn(sin(2πt)) 
sawtooth(t) = t - floor(t + 1/2) 
triangle(t) = abs(sawtooth(t)) 
+0

嗨BlurRaja。按照你的例子,我有點困難。我害怕我的數學技能不是很好。如何將這些新的波形合併到以下基本聲音樣本中:var sample:Number = Math.sin(phase * 440); 我已更新我的問題以顯示此功能。 – TheDarkIn1978 2010-08-04 12:19:35

+0

特別是,我不知道什麼2πt意味着什麼或應該如何取代AS3。 – TheDarkIn1978 2010-08-06 16:41:00

+0

@ TDI1978:2πt表示pi(3.141592 ...)乘以t(這是你的變量,如sin(t))的兩倍。 [sgn](http://en.wikipedia.org/wiki/Sign_function)是符號(-1表示負數,0表示零,+1表示正數),[floor](http://en.wikipedia.org/wiki/Floor_and_ceiling_functions)表示捨去,[abs](http://en.wikipedia.org/wiki/Absolute_value)是絕對值(如果值爲負值,則刪除負號) – 2010-08-06 21:45:50