LFO教學(上):無聲patch之禪

此篇文章是資深玩家Gregory Taylor在Cycling ’74上的連載,共分上中下三集,深入講解patch中用作內部控制的LFO上。
所謂LFO,就是Low Frequency Oscillator的簡稱,泛指頻率在20Hz之下的震盪器。通常這類震盪器並不是用來直接發聲的(人耳能聽到的頻率範圍約在20~20000Hz),而是當做控制內部線路的訊號使用,如ADSR封包,或其他調變的控制訊號。
正文開始
作者:Gregory Taylor 譯者:Rio
身為一個Max程式設計者,我花了很多時間設計patch。有人會覺得這些patch有點奇怪,它們並非那種夜以繼日所製作出的龐大樂器,也不是所謂“程式即是作品”的展示。我喜歡的,是那些不發出噪音,不播放影片也不產生OpenGL場景的patch。我喜歡的,是那種Generative的,自我生成的patch──從Max是對數值,訊息,及列表的處理運用之最基本想法開始。我熱愛創造自我生成及組織其變化程度的方法,並探索這些自我生成結構與聲音,影像或其他輸出結合時的可能性。
此處下載本篇文章的patch,Max 5專用。
正如同在Max中有很多種方法處理同個問題,“在Max 5新功能中最酷的之一是…” 這句話,也可以有多種方法作結。
在Max 5中最能引起我興趣的,是能用“音樂性”的方式來表述時間。以前,你只能用每多少毫秒送出一個bang訊息,現在你有多種有趣的新表述方式,包含:ISO 8601的 hh:mm:ss.ms 公開標準,取樣數,MIDI 的“ticks”和音符名等。這裡有支援物件一覽表(包括舊版Max及新版的新物件如timepoint, when, 及combine)。許多玩家對如何用transport物件,來安排或驅動時間事件很感興趣,而我自己更在乎的是如何用類似音符的時間數值來同步控制不同的Max程序,創造出能夠簡易同步化的控制結構。
這也許是我對於傳統類比合成器中的LFO,其深奧而有趣的控制電壓(control voltage),有著深刻的偏愛。我說的是像這些類比合成器模組──將數個LFO組合,做出有趣的效果(有人能便宜賣我AKS Synthi嗎? 為了SFX: crickets?沒有?現在你知道為什麼我要自己生patch了…)Max的好處,在於可以任意搭建出這些泛用合成器模組,依你自己的喜好來使用。事實上,我常做出類似這些模組的patch,花上幾個禮拜用不同方式串起來,看能弄出些甚麼結果。
這個教程是這類模組之一,是個同步的LFO四重奏,其個別輸出可以用來控制多種資訊(驅動波形生成,以不同的同步率所取樣之LFO輸出,以及供特殊用途控制的漂亮疊加波形)。
註:此教程檔案中,不僅有將講解的整個大patch,也有建立此patch時不同階段的樣貌──你除了跟著課程一步步操作外,也請隨意將它們拆散重組,建立出你自己的有趣patch。
謙卑的初次嘗試
我通常用這樣的patch來建立LFO:
註:右上角說明此處是以聲音訊號驅動,所以必須啟動DAC。
也許你以為要用到cycle~物件,而不是這裡的phasor~物件。當然,你可以這麼用,但我傾向使用phasor~物件──它將依給定頻率,輸出0.到1.0間的浮點漸增訊號值。
cos~物件會用phasor~物件的輸出,產生出漂亮的弦波波形,輸出範圍是標準的-1.0 到1.0。使用phasor~的好處在於,只要加上兩個物件,改變phasor~輸出範圍,就能簡單地產生出鋸齒波LFO。(你可以想想該怎樣用phasor~產生三角波。對,我知道,你能在phasor~之下加個triangle~物件就好,但我鼓勵你用數學方法做出來。如果覺得這太簡單,那麼該怎樣做出方波呢?)
現在我們有了兩種波形,那麼其中有那些資訊可用呢?由於波形輸出的是聲音訊號(signal),是在訊號取樣率上,必須對這輸出訊號取樣成訊息(message)才能供Max使用。我個人喜歡用snapshot~物件,它的引數是對波形輸出做取樣的時間間隔(單位是毫秒)。也許我會把這數值輸出做線性對映,轉換到堪用的範圍內,這點容我待會再說。我也希望能在波形重新開始一週期時,送出一個bang訊息。上面的例子說明怎樣用簡單的兩個物件── >=~物件後接edge~物件便能偵測訊號於0到非0之間變化的時刻。在悟道之途上,Max初學者得多默想這對物件。
使用phasor~製作LFO有另外一個好處,這在下一個範例中的左半邊說明。

在Max 4中,你可以用rate~物件設定相對的頻率值,來將不同的LFO同步化。這功能相當管用,但在Max 5中有更好的作法。
rate~物件以phasor~物件作為輸入,輸出訊號則是在時間軸上的倍數頻率訊號,此倍數值由rate~的引數指定,或由其右輸入接點給定。在Max 4中,這是讓兩LFO同步的唯一方法。現在雖然有其他方法,但之後你會看見rate~物件依舊管用。
如前述,Max 5中有新的時間記述方式──有些用音樂性的方式,或者老式的毫秒,也可以用ISO 8601的 hh:mm:ss.ms 時間,或是取樣數。在本課程中我們將用音符時值方式記述。此處我們所關心的,是在Max中用類似音符時值的數值來給定時間,以令多個程序同步處理。我將使用音符時值──全音符,半音符,等等──來設定LFO。以下是範例:
此patch有你熟悉的phasor~,但後面所接引數並不是頻率,而是用1n 與 2n來表示全音符與半音符(完整的音符時值表示可見此頁)。後面還有個屬性@lock,設為1,也就是啟動的意思。
每個phasor~物件都有個umenu物件連接,裡頭有可用的音符時值代號,從選單中選擇不同時值,便能即時改變phasor~頻率且保持同步。
那麼phasor~是鎖定(lock)在甚麼東西上呢?
播放控制的忘我狂喜
[譯按: 原文A Transport of Joy原指因欣喜而忘我恍惚,但音樂軟體術語transport專指播放控制面板,要表現其多重意義也只能暫且如此翻譯]
在Max中,有個transport物件專供處理metrical timing的時間控制。此transport物件不單只是計算時間,同時也將此時間資訊“廣播”到其他正在“收聽”的物件上。phasor~物件上 若使用了音符時值,這物件就會“收聽”此時間資訊。
當你把transport物件加入patch中(甚至有多個transport物件同時控制不同頻率的max物件組),Max 5會加入全局時間控制Global Transport──也就是Max開啟時的初始時間資訊源。你可以用Max 選單中的Extra內叫出GlobalTransport。
這Global Transport上頭有個on/off開關(在Activate右邊的閃爍的LED)並顯示小節/拍子/tick unit 的時間資訊,讓你知道自啟動後已過了多少時間。
註:由於此教程對時間上的處理要求較為嚴格,所以你該啟動Overdrive。如未開啟,如果音符密度高,或電腦在執行其他工作時,播放時會有點頓頓的。
觀察phasor~物件以音樂時間同步化,要這麼做:
- 按下ezdac~物件
- 按下Global Transport中的activate
Global Transport開啟後,你會看見一對同步波形 ,同時你也可用umenu物件即時改變其頻率。
有了製作同步LFO波形的好方法,就讓我們先回到早先的LFO範例,再多添上幾個功能。當然,由於鎖定的phasor~物件已可輸出漂亮的同步波形,加上cos~物件後,自然也能輸出漂亮的正弦波。雖說現在要讓波形同步已不需要rate~物件,它還使很有用。假設現在我們要的同步波形是大於一個附點全音符(代號1nd,也是我們能給定的最大音符時值)的頻率的話,該怎麼辦呢?簡單,用老朋友rate~延展鎖定住的phasor~物件的週期即可。
現在我們也能將波形相位倒轉。這很簡單,只要把訊號值乘上-1即可。下面的範例將所有功能結合,並加上控制輸出訊號的開關。

光是看著這些同步的LFO,實在很難抗拒這股將他們疊加起來,生出可愛新波形的衝動。這也很簡單──將要疊加的波形個數之倒數(兩個就是0.5,三個就是0.33,以此類推),乘上每個訊號,再加起來即可。
最後我還有一點該補充的,是想用獨立於LFO波形本身頻率的頻率,來採樣LFO,但此採樣頻率必須與Global Transport中的全局頻率同步。在此範例中,我用snapshot~物件取樣波形訊號,並用scale物件將-1.0 ~ 1.0的數值對映到MIDI頻率範圍上。這個資訊流將被送到int物件,當int物件左輸入接點收到bang訊息時,會送出現在的訊號數值。此bang訊息的來源,則用同樣得力於新的時間控制機制之metro物件。我已用了音符時值設定metro物件送出bang訊息的速率,而不是用傳統的毫秒,所以現在的metro速率也是從Global Transport的速率得來。

全部組合在一起
以上所有小部分都在LFOur.maxpat這個大patch裡用上了。正如其名,它有四個獨立的LFO。雖然這patch挺大的,但用到的都是之前介紹過的技巧。
你可以打開patch,看看裡頭是怎樣運作。

藉由Max 5的Presentation Mode功能,很容易就可以建立使用者介面。這裡有份教學 ,Andrew Benson也寫了份很棒的教材 。在Max 5上,用Presentation Layer來設計介面原型花了我好多時間。當你開啟LFOur時,這個presentation layer就是經深思後才決定的。因為它已經設定成開啟時進入presentation mode,所以要打開patch,你應該這麼做:
- 按下Lock 圖示,解除patch的鎖定
- 按下Presentation Mode圖示,讓LFOur回到patching mode
註:當你按下Presentation Mode圖示時,所有的UI物件會慢慢滑到原始patch的位置。如果你對這功能感到好奇,按下View選單中的Patcher Inspector,在Setting之下有個Box Animate Time設定,鍵入一個大點的數字,切換模式時就能看到這效果。
在你重組這大patch的同時,讓我再對其中不太明顯的地方多解釋幾句:
LFOur的Presentation mode中,每個使用者介面物件都有解說文字,說明這些物件表示甚麼或該怎麼用。這些說明文字記載在物件檢視器Inspector中的Hint中。
我覺得,如果有一些波形與頻率的預設值也會很有用,所以加入了pattr物件家族管理預設值。雖說pattr物件家族有點難懂,但在這兒使用其實非常簡單,只要四個步驟:
- 開啟每個欲控制的UI物件之檢視器,在其中的Scripting Name設定下給定獨一的名字。
- 加入pattrstorage物件,並給定一個名稱(此處叫LFO)
- 加入autopattr物件(它將自動把帶有名稱的物件登錄在pattr機制下)
- 為了簡便存取預設值,我加入了preset物件。開啟它的檢視器,將pattrstorage物件的名字(LFO)寫入pattrstorage 設定欄內。做好之後,preset物件就能直接存取整個patch中的預設值了。
使用LFOur
雖然看著它運作甚是有趣,但這個patch並不會發出任何噪音。LFOur的用途,在於Max的關鍵觀念:"資訊空間是全局的"。一旦你有個send物件叫做suitcase,在整個Max中的任何一個其他patch中,叫做suitcase的receive物件都能即時收到來自send的訊息。所以,我只要開啟LFOur,任何同時開啟的max patch都可以用利用這些資料。此外,我也在LFOur裡加入了幾個receive物件,讓你也能從你的patch中控制LFOur。
以下是LFOur運作時,外界可用的資訊:
- 四個輸出(nvA 到 nvD),分別是LFO A, B, C, D的音符時值。這些訊息與你在每個LFO面版上看到的是一樣的。(比方下圖中,送到r nvA物件的訊息會是1n)

- 稱為wavelist的輸出則會連續輸出目前經對映到0-127之間的整數值,如顯示窗所見。

- LFOur有一個獨一的send~物件,將四者的疊加值輸出到 audiowave 此名稱上。這輸出與示波器上所見相同。

- 四個輸出值(sampA – sampD)則是最近經採樣的波形輸出值(範圍是 0 -127),取樣率則是由音符時值指定。這些數值顯示在最右邊。

- 另外還有四個輸出(bangA – bangD),每個都會在波形重新開始時送出bang訊息。這會在第三個輸出中顯示。

另外,LFOur也有數個receive物件,你可以從其他Max patch中控制LFOur。
- 將bang訊息送入L4sync這位置,可以讓四個LFO同步,同時重設為0。這相當於第三個輸出中的sync按鈕。
- 將0 或 1送入L4start可以開啟或關閉LFOur中的聲音開關。
- 將0 或 1送入L4samp_on可以開啟或關閉對LFO波形的取樣,關閉時,你可以用最右邊的顯示窗,將滑桿設定到相同數值,
- 將0-23的數值送入L4samp可以改變音符時值長度,控制數值的回報頻率。(你可以把umenu拷貝到自己的patch中,接上send物件,來試試看從外頭控制)由於LFO波形取樣的頻率並沒有與回報時間同步,設定不同的音符時值以取樣將得到不同的數值組合。比方說,在高速的取樣率下(如64n),輸出大概會跟第三個波形顯示同步。
下次,我們將用LFOur製造些噪音。

討論區
“有人會覺得這些patch有點奇怪,它們並非那種夜以繼日所製作出的龐大樂器,也不是所謂“程式即是作品”的展示。我喜歡的,是那些不發出噪音,不播放影片也不產生OpenGL場景的patch。”
[竖拇指]
什么都不是,那是什么呢?
"是想用獨立於LFO波形本身頻率的頻率,來採樣LFO"
這句有點不懂,是指 "LFO波形本身頻率的周期"?"
[...] 最後,我加入pattr家族物件。這與上次LFOur教材中,是同樣的四個步驟。 [...]
[...] 現在我們有了自我生成的patch,也有聆聽這patch的方法。接著我想要做些改進與延伸,來給定大的音樂結構。換句話說,我們要建立指令,來命令此patch如何自我生成音樂。我相信世上有很多人希望她生成重複類似的結果,但我自己希望她有更大的自由度。此篇教學將會加入一些此方向的改變。 [...]
Rio:
似乎翻譯文章有必要在正文的標題後加註「作者:… 譯者:….」等字樣,因為我發現有不少人誤認為這篇文章是你寫的…
done.