Serum公式解析器基礎(chǔ)教程2 - 語(yǔ)法
1、 表達(dá)式允許包含的變量或常量
1.1 x參數(shù)
????????x參數(shù)是一個(gè)重要的時(shí)域參數(shù),指代波形界面中當(dāng)前繪制的值,取值 [-1.0,1.0] ,可以理解為“橫坐標(biāo)”的值。而此時(shí)不同x取值下表達(dá)式的值 f(x) ,則可以理解為“縱坐標(biāo)”的值。得到的波形即為點(diǎn)(x, f(x))在x取值[-1.0, 1.0]時(shí)得到的點(diǎn)所連成的曲線。
????????一般來(lái)說(shuō),如果我們希望直接繪制波形,就會(huì)寫一個(gè)關(guān)于x的表達(dá)式。如上一章中所演示的,我們需要得到一個(gè)方波圖像時(shí),便可以繪制一個(gè)[-1.0, 0)范圍函數(shù)值為-1、(0.0, 1.0]范圍函數(shù)值為1的函數(shù)的圖像,而符號(hào)函數(shù)sgn(x) (Formula Parser中應(yīng)寫作sign())符合這一要求。因此我們輸入sign(x)后按下回車,便可以得到一幀方波。

????????一些細(xì)節(jié):表達(dá)式的值一旦大于1,則該點(diǎn)的取值會(huì)被設(shè)為1;若小于-1,則該點(diǎn)的取值會(huì)被設(shè)為-1;若表達(dá)式在該點(diǎn)處沒(méi)有定義(比如log(x)在[-1.0, 0.0]范圍內(nèi)均無(wú)定義),則該點(diǎn)的取值會(huì)被設(shè)為0。
1.2?w參數(shù)
????????完全等價(jià)于 (x+1)/2 ,取值 [0.0, 1.0] 。

????????我們輸入w,會(huì)發(fā)現(xiàn)得到的圖像與輸入(x+1)/2后得到的圖像完全一致。當(dāng)然,如果把一個(gè)表達(dá)式中所有的x均替換為(2*w-1)話,得到的圖像將與原表達(dá)式完全一致。
1.3?q參數(shù)
????????q參數(shù)是一個(gè)非常重要的一個(gè)頻域參數(shù),指代諧波次數(shù),取值 1, 2, ..., 512 ,即1至512中的自然數(shù),公式中出現(xiàn)q參數(shù)時(shí),表達(dá)式的值將表示上方FFT區(qū)中的振幅欄中各諧波的振幅。
????????我們輸入1/q,便可以得到一個(gè)諧波振幅與諧波次數(shù)成反比的波形。

????????而輸入1/q^0.5,便會(huì)獲得一個(gè)FFT的鋸齒波。

????????值得注意的是,若表達(dá)式在生成任何一個(gè)諧波的振幅時(shí)出現(xiàn)未定義的情況,則該幀波表的所有諧波振幅都會(huì)被清除,圖像也將變成輸入0后獲得的圖像。
1.4?p參數(shù)
????????p參數(shù)與q參數(shù)的取值一樣,也指代諧波次數(shù),取值范圍?1, 2, ..., 512 。與q參數(shù)不同的時(shí),公式中出現(xiàn)p參數(shù)時(shí),表達(dá)式的值將表示上方FFT區(qū)中的相位欄中各諧波的相位。

????????我們輸入p*0.1,會(huì)發(fā)現(xiàn)基頻到9次諧波的相位符合表達(dá)式的預(yù)期效果,以0.1為公差遞增,但10次諧波以后的相位均為0。這說(shuō)明一旦包含p的表達(dá)式值超過(guò)1了,相位就會(huì)被設(shè)為0。同樣的,一旦包含p的表達(dá)式值小于0了,相位也會(huì)被設(shè)為0。與q參數(shù)一樣,若表達(dá)式在生成任何一個(gè)諧波的相位時(shí)出現(xiàn)未定義的情況,則該幀波表的所有諧波振幅也都會(huì)被清除,圖像也將變成輸入0后獲得的圖像。
1.5?z參數(shù)
????????與指代幀的編號(hào)線性相關(guān),取值 [0.0, 1.0] 。表達(dá)式應(yīng)用于第一幀時(shí),z參數(shù)的取值為0.0;應(yīng)用于第256幀時(shí),z參數(shù)的取值為1.0。公式中出現(xiàn)z參數(shù)時(shí),表達(dá)式將被應(yīng)用于所有幀。若表達(dá)式中不含in參數(shù)且波表幀數(shù)不足256幀時(shí),將依據(jù)公式生成256幀。(不足256幀時(shí)與p參數(shù)聯(lián)合使用的效果非常蛋疼,因?yàn)槟悴荒軐?duì)著一個(gè)不存在的幀指定相位)
?? ? ? ? 因此我們輸入z*x,便會(huì)得到一個(gè)振幅隨波表幀數(shù)增加的鋸齒波波表。

1.6?y參數(shù)
????????完全等價(jià)于 z*2-1 ,取值 [-1.0, 1.0] 。公式中出現(xiàn)y參數(shù)時(shí),表達(dá)式也將被應(yīng)用于所有幀。若表達(dá)式中不含in參數(shù)且波表幀數(shù)不足256幀時(shí),也將依據(jù)公式生成256幀。
1.7?in參數(shù)
????????指代當(dāng)前幀的值。若原始波形為 f(x) ,則in參數(shù)在 x=x0?時(shí)的值為 f(x0)?。若表達(dá)式中含有q參數(shù),則q取值為 q0?時(shí),in指代 q0?次諧波的振幅。若表達(dá)式中含有p參數(shù),則p取值為?p0?時(shí),in指代?p0?次諧波的相位。若表達(dá)式中含有z參數(shù),則in參數(shù)指代的均為z參數(shù)所指波表的相關(guān)參數(shù):如若第k幀波形為fk(x),則z取0時(shí),in在?x=x0?時(shí)的取值為 f1(x0)?;z取1時(shí),in在?x=x0?時(shí)的取值為?f256(x0)?。
????????因此如果我們輸入in*0.5,便會(huì)將原始波形振幅縮小一半。

1.8?sel參數(shù)
????????指代用戶選中幀的值。與in參數(shù)不同的時(shí),sel參數(shù)指代的幀的參數(shù)與z參數(shù)的取值無(wú)關(guān),始終指代用戶選中幀的值。
????????所以如果我們需要將一幀的波形克隆到256幀,我們只需選中那一幀,然后輸入z=sel即可。(這里表達(dá)式前綴的“z=”是一種特殊寫法,下文中會(huì)提到。)

1.9?rand參數(shù)
????????隨機(jī)數(shù)。在表達(dá)式中x、p或q取不同值時(shí)會(huì)有不同的隨機(jī)取值,但該取值與z參數(shù)無(wú)關(guān):不論z指代哪張波表,rand都會(huì)在x、p或q參數(shù)取相同值時(shí)取相同的值(這個(gè)特性有時(shí)候非常的蛋疼)。
????????輸入rand后是這個(gè)效果。

????????但如果我們輸入z=rand,我們會(huì)得到256幀一模一樣的隨機(jī)波形。
1.10 常數(shù)
e:自然對(duì)數(shù)的底,值為2.71828182845904523536。(不知為何,Serum手冊(cè)中標(biāo)注的e的值為2.718281828182818281828,數(shù)學(xué)家歐拉先生認(rèn)為這并不是真正的e)
pi:圓周率,值為3.141592653589793238462643。
1.11 表達(dá)式作用范圍的判斷原則
????????原則上,x(及w)、p、q參數(shù)不應(yīng)該出現(xiàn)同一個(gè)表達(dá)式中,試圖在時(shí)域表達(dá)式中使用頻域參數(shù)是沒(méi)有意義的。若表達(dá)式中不含p、q參數(shù),則表達(dá)式默認(rèn)被應(yīng)用于波形界面,in、sel參數(shù)指代的值為波形取值。若含有q參數(shù),表達(dá)式則被應(yīng)用于FFT區(qū)中的振幅欄,in、sel參數(shù)指代的值也將為諧波振幅。若含有q參數(shù),表達(dá)式則被應(yīng)用于FFT區(qū)中的相位欄,in、sel參數(shù)指代的值也將為諧波相位。
2、?表達(dá)式允許包含的函數(shù)
函數(shù)????????參數(shù)數(shù)量??????說(shuō)明
sin?????????????? ? 1???????????正弦函數(shù)?
cos????????????????1?????????? 余弦函數(shù)?
tan?????????????? ? 1???????????正切函數(shù)?
asin?????????????? 1? ? ? ? ?? 反正弦函數(shù)
acos????????????? 1 ????????? 反余弦函數(shù)?
atan?????????????? 1????? ? ?? 反正切函數(shù)
sinh?????????????? 1???????????雙曲正弦函數(shù)?
cosh????????????? 1??? ? ?????雙曲余弦函數(shù)?
tanh?????????? ? ? 1???????????雙曲正切函數(shù)?
asinh?????????? ? 1? ?????????雙曲反正弦函數(shù)?
acosh????????????1???????????雙曲反余弦函數(shù)?
atanh?????????? ??1? ?????? ??雙曲反正切函數(shù)?
log2?????????????? 1???????? ? 以2為底的對(duì)數(shù)函數(shù)
log10?????????? ? 1???????? ? 以10為底的對(duì)數(shù)函數(shù)
log?????????????? ? 1?? ????????以10為底的對(duì)數(shù)函數(shù)
ln?????????????? ? ? 1???????????以e (2.71828...)為底的對(duì)數(shù)函數(shù)
exp?????????????? ?1? ?????????e為底數(shù)的指數(shù)函數(shù)
sqrt?????????????? 1?? ????????平方根函數(shù)
sign?????????????? 1? ?????????符號(hào)函數(shù)(x<0值為-1;x>0值為1 )
rint?????????????? ?1? ?????? ??四舍五入法取整?
abs????????????? ??1?? ????????絕對(duì)值函數(shù)
min??????????????var.? ???????取多個(gè)值的最小值?
max?????????????var. ????? ? 取多個(gè)值的最大值?
sum?????????? ??var. ?????? ?取多個(gè)值的和?
avg??????????????var. ?????? ?取多個(gè)值的平均值
3、?表達(dá)式允許包含的運(yùn)算符
運(yùn)算符? 解釋?? 優(yōu)先級(jí)
&& ? ? ?邏輯與? ? ? 1?
||?? ? ? ? 邏輯或? ? ? 2?
<= ? ? 小于等于? ??4?
>=? ?? 大于等于?? ?4?
!=? ? ? ? 不等于? ??? 4
==?? ? ? ?等于? ? ? ? 4?
>?? ? ? ? ?大于? ? ?? ?4?
<?? ? ? ? ?小于? ? ??? 4?
+? ? ? ? ?? 加? ? ? ? ?? 5?
-? ? ? ? ? ??減? ? ? ? ?? 5?
* ? ? ? ? ? ?乘? ? ? ? ? ?6?
/? ? ? ? ? ? 除? ? ? ? ???6?
% ? ? ? ?取余? ? ? ? ?6?
^? ? ? ? ? ?冪? ? ? ?? ? 7
????????其中優(yōu)先級(jí)越大的運(yùn)算符越優(yōu)先進(jìn)行運(yùn)算。
4、 特殊語(yǔ)法:
4.1 三目運(yùn)算符
????????寫法為 (條件)?(條件為真時(shí)的取值):(條件為假時(shí)的取值) 。如表達(dá)式 (1>0)?1:2 的值為1,因?yàn)?>0這個(gè)條件為真,所以取冒號(hào)之前的值作為表達(dá)式的最終值。以方波為例,如果我們要用三目運(yùn)算符來(lái)繪制一個(gè)1/4方波,我們可以這么做。
????????(1) 明確表達(dá)式的邏輯
????????我們要求波形在[-1.0, 0.5]范圍內(nèi)值為-1,在[0.5, 1.0]范圍內(nèi)值為1,為此我們需要寫一個(gè)分段函數(shù):
????????(2) 寫成三目運(yùn)算符的形式
? ? ????分界的依據(jù)為x與0.5的大小關(guān)系,于是我們可以將條件設(shè)為x<0.5,若成立則取-1,若不成立則取1。寫成表達(dá)式就是: x<0.5?-1:1

4.2 表達(dá)式前綴
????????寫法為z=;q=;p=,置于表達(dá)式的開(kāi)頭。判斷表達(dá)式作用范圍時(shí),前綴中出現(xiàn)的參數(shù)也視為在“表達(dá)式中出現(xiàn)”。若表達(dá)式前綴z=,則視為z在表達(dá)式中出現(xiàn),表達(dá)式將被應(yīng)用于256幀波表;同理,表達(dá)式前綴q=,表達(dá)式的值將表示上方FFT條中的振幅欄中各諧波的振幅;表達(dá)式前綴p=,表達(dá)式的值將表示上方FFT條中的相位欄中各諧波的相位。