標籤:

Reaktor —— 如何正確地寫一個Sawtooth

Reaktor —— 如何正確地寫一個Sawtooth

來自專欄我們只聊Reaktor

在Reaktor Core Level里寫個Sawtooth一點都不難,看過說明書的都會這樣寫,包括我自己一開始也是如此:

彷彿這就是個定律,不管你懂還不懂,只要這樣做,壓根就錯不了。

確實上面能幫你生成一個好的Sawtooth波形,不過我們需要來假設一下,看看它是否有誤差?!

首先我們可以假設F(注意圖上的F輸入指的是Frequency頻率)等於1,採樣速率等於44100Hz/s,這個意思就是SR.C(採樣率時鐘)每秒會滴答44100下,那麼當SR.C滴答一半,也就是22050下,上面的數值剛好累加到1,可是1還沒有大於1,所以只有當SR.C滴答超過一半的時候,才會觸發減2的計算,比如22051下,那麼 (22050*2)div44100 ,即1.0000453514739229024943310657596,就大於1了,這樣這個數就要減去2,結果等於-0.99995464852607709750566893424036,顯然這個數並不是-1,當然如果你把這個數值複製黏貼到Reaktor里用Numeric模塊查看,你將會得到-1的結果。

好吧,上面-1的結果不是要告訴它就是等於-1,倘若你用Compare/Equal模塊去判斷這個數是否等於-1,它們是永遠都不會相等的,這個問題是你被Numeric模塊騙了,它在顯示上會砍掉精度顯示,並四捨五入到某個數值。

OK,既然上面減2的計算結果不是等於-1,那麼它就不算是真正意義上的Sawtooth,或者說它不是一個標準的Sawtooth,當然你依然可以把它當做一個Sawtooth來使用,因為它符合Sawtooth的特性,那麼我們該用什麼樣的方法來實現一個標準的Sawtooth呢?其實思路很簡單,分兩個步驟:

  1. 產生一個0到1的上升波形(Ramp);
  2. 把0到1的波形換算成-1到1。

首先,第一個步驟要實現不會很難,但是你肯定不能再用上面那種Sawtooth的方法了,不用要問為什麼!(這裡省略你自己思考的時間)

既然不能用上面的Sawtooth方法,我們就要來思考怎麼確保一個波形永遠到0到1這個範圍,注意一定要包含等於0和等於1的部分。

好吧,想不出來沒關係,接下來我用幾張圖來展示我的思路。

首先這張,大家可以看出跟上面的Sawtooth方法有很大的區別,比較不再是大於1,而是大於採樣率數值,F輸入的數值直接拿來累加;好吧,那麼我們來假設下,假設F等於1的時候,當數值累加等於44100的時候(這裡採樣速率依然44100Hz/s),它並沒有大於採樣率數值,所以再除以採樣率數值後就等於1,而當數值累加大於44100,比如44101,這個數值就大於採樣率數值了,顯然它要觸發上面Latch的計算(Latch就相當於Value模塊),結果等於0,那麼0再除以採樣率數值依然還是等於0,好的,完美結果。

不過千萬別高興太早了,因為上面我們只是假設一個情況,而且還是F等於1的這種特殊情況,如果F等於2或者3或者大於1的任意數值呢?假設F等於1000,那麼可想而知,採樣率時鐘滴答了44下,數值就已經累加到了44000了,如果多滴答了一下,那麼數值累加就等於45000,顯然這個數值已經超過44100了,所以45下雖然回到了0,但44下卻是頂點計算,也就是說44000要除以採樣率數值,即 44000div44100 ,這個我想它再怎麼計算都不會等於1吧,所以顯然F等於1000就會出現誤差,當然不單單是F等於1000的情況會出現這種誤差,還有其他像F等於3等於7等等,這就不一一列舉了,反正只要有一種情況產生誤差,結果就不是我們想要的,那麼怎麼辦呢?其實我們可以好好思考F等於1000的情況,儘管 44000div44100 不等於1,但如果是 44000div44000 呢,它不就等於1了,所以我們只需要修改個地方,把除數換成44000不就可以了,也就是把除數採樣率數值換掉,當然這個除數並不是每次都等於44000,因為我們還要通過F來計算這個除數到底是多少。

到這裡,我們算是把第一步實現了,緊接著第二步想必就不難了吧,直接給結果:

注意很多初學者會好奇為什麼F輸入旁邊可以添加個數值呢?!原因在於我們這個Sawtooth是用Macro來搭建(注意區分Primary Level的Macro),目的是要給F一個初始默認的設定,當然也可以不這樣做。

最後給出F有小數部分的數值情況:

雖然這個看起來無疑是對的,可實際上,它做了量化,砍掉了某些小數的成分,於是,我修改了,得到這樣的結果:

注意上面我用到了Clip Max,好吧,讓我們來分析下它是否正確,首先F等於1的時候,超過了44101就等於0,也就是說它累計的最大數值是44100,剛好被採樣率數值整除,所以Clip Max目前沒起到任何作用;假設F等於1000的時候,超過45100就等於0,可以立馬知道它累計的最大數值是45000,而 45000div44100 顯然是大於1的,因此Clip Max會把這個超過1的數值結果變成1,加上比45000再小一個F的44000除以44100比1小,所以這種情況也沒有問題,當然你可以去挑幾個特殊的奇數來分析看看,比如11等等;除了整數以外,我們也需要分析小數的部分,比如當F等於1000.3的時候,那麼超過45100.3就等於0,顯然它累計的最大數值是45013.5, 45013.5div44100 結果是大於1的,所以依然會被Clip到1,然後我們再看下比45013.5小的44013.2,這個數除以採樣率數值,不用想了吧,肯定比1小。


推薦閱讀:

《入中論》講記 聲音七
四面八方,一種聲音呼嘯而至,掃清障礙的時刻到了。(周運)克里斯汀每周星座運勢10.5-10.11
訓犬方法,犬依口令、手勢發出叫聲,聞令即叫、聲音洪亮,不亂叫
【表者說】響鬧錶 聆聽另一種聲音
聆聽那曾經花開的聲音

TAG:聲音 | 設計 |