關於粒子化合成(轉貼自舊討論區)

126 views
Skip to first unread message

Chien-Wen Cheng

unread,
Jun 19, 2009, 9:16:05 PM6/19/09
to MAX/MSP/Jitter 互動音樂、互動藝術論壇
DualGranular10程式分析來自http://www.hkbu.edu.hk/~lamer/download.htm

在使用和分析該程式以前要對粒子合成聲音的原理有大致的瞭解,查閱相關資料中一些基本概念。

功能簡述:即時粒子合成時間拉伸/壓縮,分為錄製和播放檔兩種應用。可以對聲音微粒的大小(時值)、包絡、順序、顆粒pitch、顆粒播放速度進行控
制。最主要是實現了有條件的隨機變化,產生有趣的隨機現象。分為buffer1和buffer2,錄製的時候,二者內容相同,但播放可以不同步。
Read files方式,二者可以不同內容,也可以不同步,播放時候,二者相混輸出。

面板區域說明,左邊功能鍵,聲音信號輸入開關控制,右上部分,聲音顆粒控制,右下部分,輸出channel控制以及pitch控制視窗、聲音粒子取樣視
窗、音效檔案讀取選擇。

錄製功能:錄製分為一次錄製和連續錄製。二者區別僅在於,連續錄製是以buffer size * buffer 1 speed的時間為週期,保證每
次buffer1的內容都連續更新。錄音被觸發的時候,完成兩個動作:第一,清除buffer1和buffer2;注意到Record In子程式中有
delay 1,這保證再清空buffer之後再開始record。先錄製到buffer1,再根據buffer2的delay情況,延遲一定時間開始
錄製buffer2。延遲作用是由中間Buffer 2 Delay(horizontal slider)與buffer2 speed共同決定的。
如何決定,由controls的子程式banglines and delay來處理。

主要功能塊:
1、 子程式controls分析

1) banglines and delays

左輸入端(In1),將播放速度分為兩種情況:speed1係數與buffer size相乘,小於等於0,則Time Expander情況,輸出
0;大於0,則Time Comression,兩種情況都直接從out 2輸出。Compression Delay,錄製信號發送過來以後35ms
後,經過計算出來的Delay time,再將錄製信號從左輸出埠送出。

右輸入端In2,buffer2 speed輸入與r delaybuffer2相乘。Delaybuffer2由主程序面板上buffer 2
delay滑杆參數決定(P Record In 中的s delaybuff2將滑杆參數*30送進來)。與此同時,最右邊的expr,if
else等仍然在判斷buffer2 speed是否也是compression(speed<=1?),如果是compression,將
delay time送入。右半部分的t b f和t b b f意味著,每次變換buffsize或delaybuff2都要重新計算delay值。
右邊buffer2 speed與左邊的buffer1 speed相比,多了一個相加的部分,即面板調整的buffer 2 delay(這是一個
buffer2相對於buffer1的相對值,對buffer1不產生影響),加上這個時間值,對於buffer2的錄製命令等待時間才正確。
Banglines and delays從左至右,out1和out3都是bang信號輸出,bang信號由面板錄製或播放button給出,本子程
式參與計算僅僅是bang發出的延遲時間。Out2和out4輸出的都是數位,即delay time,Time Expander情況下均輸出0,
Time Compressor情況下輸出Delay time值。

2) controls程式視窗In4,buffer size,為了主程序視窗slider的設置範圍0-200滿足0-20sec錄製範圍,在
In4後乘以100,轉變為0-20000ms。隨後分為三條線,從左至右:s buffsize;給buff1和buff2錄製範圍賦值(兩個長度相
等);與delaybuff2相加以後,送出給out8,顯示可以錄製的時間(為什麼要加上delaybuff2,因為考慮到buff2延遲的作用,總
的錄製時間應該顯示為從buff1開始錄製到buff2停止錄製的時間段)。Controls的Out7顯示的是剩餘錄製時間,中間有一個利用line
來倒計的計算式。附帶最右端(與In4無關)有一個讀取音效檔案的功能,連續兩次打開視窗分別選擇檔寫入buffer1和buffer2,該動作完成之
後100ms,info~ buffer1將buffsize的值送出去。

3) Controls程式視窗的In3,傳送grain的長度。該值由面板中Grain Size經In3進入p grainSizes。子程式
grainSizes的分析:randfacor由主程序面板Rndom Grain Size滑杆給出參數,經過*50+100和abs
(*50-100)確定grainSize的隨機範圍,分別送至upper和lower。每次Grainsize發生變化,都要重新發送lower和
upper,同樣randfactor的值發生變化仍然要重新送出grainsize,兩個delay的作用就在於此,兩個bang發送需要延遲一定時
間,分別由randfactor和grainsize的大小決定。這個模組的功能主要應用在Engines and Outs中的子程式
controls1-16中用到。

4) Controls程式視窗中,在子程式Banglines and delays下方的程式部分有兩個功能:確定buffer1和buffer2
的總播放時間顯示(out5、out6),Expander情況下剩餘播放時間(out1、out2),Compression情況下剩餘播放時間
(out3、out4)及其播放的位置pos。

5) Controls的子程式 pos_mdm:s randpos送出Granularize滑鼠選擇的範圍。Noise~在子程式中充當
random -1~1數位的角色,經過+1~,random範圍是0-2,inlet由面板random grain position滑杆提供,調
整實現聲音顆粒位置的隨機變化因數。調整這個變化因數的還可以根據子程式granularize中的horizontal slider調整。區別在
於,面板上是大範圍調整,granularize中是小範圍調整。
Controls窗口中Send~ pos和send~ pos2分別送出buffer1和buffer2分別對應到pos和pos2的數字流。
Send~ pos對應到子程式grain1-8,提供offset之前buffer1中位置的值;Send~ pos對應到子程式
grain9-16,提供offset之前buffer2中位置的值。Play buffer中grain的位置最後在子程式grain1-16中最終
完成。具體參見Engines and Outs程式分析。

2、 Engines and Outs程式分析
這個子程式是最終實現聲音顆粒音高、時值、位置確定的輸出功能模組。該程式中出現了很多子程式,因為buffer1和buffer2,以及分配到八個通
道,所以實際只包括了四類子程式:
1)p control 1~16,前8個針對buffer1在8個通道中的情況,後面8個針對buffer2在8個通道中的情況。Lower和
upper是從controls程式視窗的p grainsizes中獲取的grain size變化的隨機範圍。expr(random($1\.
$2)/100.)*$f3計算出暫態態的顆粒大小(即duration),送至p random_pitch,與其他兩個參數randpitch和
uantize一起確定顆粒量化。
A、Control的out1是讀取grain position的頻率值。Expr 1000./$f1*$f2將grain確定下來的
duration值T,轉變成讀取頻率f=1/T。這個過程中把每個通道transpose也算進來是因為讀取速度快以後,音高值發生變化(這裏是用讀
取頻率來體現與音高的關係)。
B、Control的out2是每個grain的phase輸出。
C、Control的out3是輸出其子程式p random_pitch的信號。我們看看p random_pitch的內部功能。此程式的三個輸入
端分別是:In1,接收顆粒的時值;In2,接收transposers窗口送來的randomize pitches的隨機係數;In3,接收
transposers窗口送來的Harmonize pitches值。此程式中也是transposers視窗這兩個係數之間關係的確定。對於
random pitches(即random width)的處理,在此值的+-範圍內,每20毫秒輸出一個隨機值加以計算。當Harmonize
pitches非0時,利用harmonize的值將random pitches參與計算的輸出值進行處理expr int($f1/$f2)*
$f2;當harmonize為0時,直接輸出random pitches參與計算的結果。以上兩種情況的結果都與顆粒時值grain
duration相乘,經過control程式視窗的sig`轉變成信號數位輸出。p random_pitch在這裏實際作用是,顆粒要求體現隨機音
高,grain duration就需要這個影響因數考慮到。於是,control的out3才是真正回應了buffer基準音高調整,輸出最終聲音顆
粒的duration(用數位信號輸出)。
2)、p grain1-16的功能簡述:確定最終的顆粒開始觸發位置,顆粒包絡wndw的加入,Grain正序、逆序選取,以及播放buff。程式視
窗的左端是Grain開始觸發的時間位置最終確定,主程序面板控制中的posoffset與原始pos相加。右半部分有三個inlet,In1,收到
control n 子程式輸出的Grain讀取頻率值;In2,收到control n 子程式輸出的相位值;In3,收到control n 子程
式輸出的Grain duration。利用phasor~與r rev共同確定讀取buffer的方向和頻率。Phasor~還控制了Wave~
wndw的播放頻率。該程式中sah~是一個很關鍵的物件,它體現了wndw包絡對聲音顆粒的控制。當這個視窗包絡在0點到高於這個值時,sah~左端
的信號輸出一個採樣(這個採樣的位置由pos+posoffset決定),再到下一次0點到來時,再輸出一個新位置的採樣。由此可以看到phasor控
制wndw的頻率,來決定了每個觸發採樣的時間(duration)。從這個子程式中我們還可以發現,所謂的reverse僅僅針對每個Grain,而
不是buffer。Buffer的Grain開始時間位置由pos+posoffset決定,Grain的播放順序則時phasor和r rev決定
的。二者綜合的結果即是Grain順序或逆序播放的時間位置。
3)8個gain~(對數比例音量滑杆)是依照制定得對數或指數曲線,控制聲音強度。在gain~上所作的調整會在一段時間上進行(預設20ms),所
以將不會在輸出訊號上造成突然的不連續中斷點。將八個通道的buffer1和buffer2的grain綜合到一起。唯一一個Gain輸入,由面板調
整,對每個通道的音量一齊控制。
4)8->4pan和8->2pan用於選擇聲道轉換。主程序面板中功能表選項數位通過s outs傳遞給Engines and Outs通過
gate~ 3來切換聲道。
窗口頂部的Buffer~ wndw harm.aiff給視窗函數賦值。

3、 子程式Transposers分析
功能簡述:每個Grain的頻率變換(音分)。分為三種檔次:半音、1/10半音,1/100半音。具體計算在每個slider下方的p trans
中。16個sliders分別控制16個通道buffer1和buffer2的grain pitches。Harmonize Pitches與
Randomize Pitches配合使用。Harmonize針對buffer音高調整,Randomize pitches始終在
Harmonize確定的音高附近隨機變化。隨機的幅度範圍由Randomize pitches確定。二者之間的關係在Engines and
Outs視窗中的control 1-16子程式randompitch中計算。具體詳見前面相關描述。

4、子程式Granularize分析
該程式提供了一個視覺化的聲音信號圖示視窗,waveform長度為Buffer size。選擇的陰影部分,會記憶在打開視窗的前一次做過的區域選
擇。如果上次選擇的範圍比本次的區域寬,打開視窗會發現整個區域默認選擇了。Waveform~的3、4輸出口記憶選擇的陰影區域開始和結束時間位置。
並將位址傳送給其他子程式處理。

5、 balance,調節buff1和buff2的比例。這個功能主要在Engines and Outs中實現。
6、 feedback,應用在錄製時候。子程式Record in接收從Engines and Outs介面送出的buff1out聲音信號,
feedback係數與之相乘,與即時Audio In相加,作用到buffer1和buffer2 recording中。

因為時間原因,分析一部分歸納到一部分,所以顯得比較雜亂。等有了時間,把流程圖給畫一下就更清晰了。對此有興趣的朋友,可以按照各個子patch,對
照相關介紹,幫助理解。我也是第一次分析這麼複雜的程式,有一些經驗教訓。解鎖以後,線條非常複雜,子程式也繁多,不要放棄,也不要煩躁。先理清線索,
把線條的顏色區分一下。找其中一條簡單的線索,一直跟進分析。在進行到1/4的時候,走不下去,發現主要是一些基本概念不清楚。查閱了粒子合成聲音的一
些文章介紹,包括瞭解其中涉及的相關參數。這樣思路才漸漸打開。程式分析的時候,需要把各個功能塊大致區分開。然後將這個功能塊涉及到的部分都瞭解一
下。一些比較大的patch,比如controls子程式,綜合了幾個功能,不要一次將它分析完,一定按照功能走勢來。等各個功能把握的線條分析清楚
了,這些子patch就各個突破了。還有就是,分析的時候,一定做好筆記,尤其是這種複雜的程式。不要希望所有脈絡都清晰了再來寫,記錄的過程就是理清
思路的過程。否則,分析到一半,又忘記前面分析的東西。總的來說,我覺得最重要的是心態,一定不能浮躁,不要怕困難。其實分析起來都不難,一定要有信
心。分析一個複雜程式,非常鍛煉能力,也給自己寫的時候提供思路和方法。

感謝CWcheng和Shos提供的patch地址。也希望更多的朋友一起來分享你們分析的程式。如果分析中的有地方不對請大家指正!


回頂端


CWCheng
Site Admin


註冊時間: 2006-06-16
文章: 253
來自: University of North Texas
發表於: 04 一月 2007 11:45 am 文章主題:

--------------------------------------------------------------------------------

太佩服了,一年前我試過想自修來理解,但是無法理出頭緒。迄今一直沒有時間仔細研究 granular 的 time stretch。等有空會將您的
文章仔細對照patch 來研究一下。目前大概先瀏覽了一下您的文章,的確包含了許多很重要的 granular synthesis 的概念和技
巧。

想請教一下,我一直覺得這個 patch 似乎無法很連續地做 time stretch,中間會有中斷,應該是 buffer 用完的結果。
granular synthesis 有一個難處在於要怎樣處理 buffer 的問題,使播放出去的聲音可以連續。至目前,我也還沒找到答案。且通
常清除 buffer 時,會產生雜音。

可否也請您分享一下這個 patch 使用上缺憾之處,是不是如我之前測試的結果相同,無法連續做 time stretch,且清除 buffer
的片刻,如果聲音仍在播放,會有 click 雜音。

有沒有甚麼好的想法可以讓這個 patch 可以很恰當的運用在音樂當中,而避免掉上述的缺憾呢?

PS:很期待看到您的圖解。(等有空,會將您的大作貼到精華區)
感謝分享。
_________________
Chien-Wen Cheng's Music:


回頂端


timbre
高級會員


註冊時間: 2006-06-16
文章: 114
來自: 台灣
發表於: 08 一月 2007 11:25 am 文章主題:

--------------------------------------------------------------------------------

這裡有一個跟上面這個 granular 很類似的 abstraction,但是似乎整裡的比較較乾淨,據說兩者的核心都是一樣的。

http://www.cycling74.com/twiki/pub/Share/TimPlace/patch-BarleyProcess.sit

相似的問題出在 buffer 中斷時會有 click。

回頂端


lmj0316

註冊時間: 2006-11-23
文章: 49
來自: 成都
發表於: 10 一月 2007 03:45 pm 文章主題:

--------------------------------------------------------------------------------

今天又看了一下這個patch,確實有click的現象。CWcheng提到,清除 buffer 的片刻,如果聲音仍在播放,會有 click 雜
音。我發現繼續播放的原因是clear只發送給了buffer1,buffer2卻沒有清除掉,仍然是以前的波形,所以聽到的原來的聲音是
buffer2的。Buffer2的內容在rec bang發送之後,逐漸被新的內容逐漸替換掉的,在record in副程式部分可以看得到
buffer2被替換的過程。如果要終止前面的聲音,要在controls程式面板中把clear發送到兩個buffer。Click有時會發生,有時
沒有。我覺得似乎跟buffer的size有關係。如果是因為buffer清掉再次record造成的問題,我想是否可以多設置幾個buffer,不要
重複使用同一個,設計成連續錄製時候,錄製到另外一個buffer中,原來的buffer根據需要再做play或者clear的處理。至於Click產
生的原因, Timbre會員提到另一個cycling網站的粒子合成patch也出現類似情況,我就在想,是不是聲音在play時突然clear或被
切斷所受到的影響,尤其時play一個檔到中間時,按下record,buffer1是被突然clear掉的。迴圈錄製click問題似乎不明顯,我去
掉了前面提到的clear。

還發現有兩個奇怪的現象,我一直沒有找出原因:
1、 open file,偶然發現在waveform中的file檔波形從一個時間點位置逐漸消失,隨著整個buffersize播放完畢,這個時間
點之後的波形逐漸成了一條直線,這個時間點以前的波形還在。
2、 open file,如果在waveform的圖形中用滑鼠選擇一段時間位置,則stop不起作用,如果選擇整段波形,stop會起作用,但是偶
然間仍然聽到殘存的一點零星的聲音。
不知道你們是否也遇到過這樣的問題。這兩個現象的file的時間都比較長,大概450000ms左右。如果選取短時間的file,大概8000ms左
右,就完全沒有上述現象。

另外,程式好像有一個bug,當open file是一個超出buffer size的檔,在waveform~中波形圖範圍是file實際的長度。此
時在主介面上面buffer size的數位框應該變成實際file時間長度,但是這個數字框仍然是以前的值。我打開controls介面找到s
buffsize源頭,應該在導入檔時,就有一個infor~ buffer1將檔長度發送出來。作者的本意也應該時這樣的。結果主介面上
buffersize仍然是以前值,實際buffersize是檔長度,repeat play也因為metro沒有收到file發送的
buffersize,rebang的時間間隔就不準確,在非真實file時間長度週期內迴圈play。還要受影響的是,重複錄製的情況,因為記錄的
buffer是上一次的size,錄製迴圈的時間也不正確。我在infor~輸入處手動加了一個button,這些問題就可以解決。總而言之,就是
infor~ buffer1應該送出的buffer size沒有送出來造成的。這個問題不可小視,否則會讓人非常地困惑。

至於那兩個奇怪地問題,大家看看有沒有什麼原因可以查找。不是每次都出現,但是我碰到過三次以上。

Timbre提到的那個patch有沒有windows版的?

回頂端


timbre
高級會員


註冊時間: 2006-06-16
文章: 114
來自: 台灣
發表於: 10 一月 2007 04:39 pm 文章主題:

--------------------------------------------------------------------------------

我給的那個連結的程式碼,是PC或Mac 都可以使用,
但需要解壓縮。
到網路去尋找 stuffit 程式,就可以解開 sit 為副檔名的檔。

max/msp 4.5 以後的PC版本,都可以開啟任何 mac 產生的程式碼。
有時後 mac 的程式碼會以 mxt 結尾,使得PC無法開啟,
但是只要在PC中,直接把副檔名改成 mxb,即可使用。

裡頭有三個文件,
window 文件加上副檔名 aiff
BarleyProcess~ 加上副檔名 mxb
grain 文件也加上副檔名 mxb

這樣這些文件即可開啟。
如果還不行,再告訴我。

這些 granular synthesis 的程式都來自日本的專家 Nobuyasu Sakonda 同一個人的原始程式改編而成。所以基本上您
分析的程式碼於我提供連結的這個,兩者核心都是一樣的。不過上面這個連結,沒有特別設計 time-stretch,只有設計利用粒子合成來轉調。

PS: Barley Process~ 要把他當成一個物件來使用,也就是你要用 sfplay 等物件,自己做一個簡單的主程式,然後在空白的
object 中打入 BarleyProcess~ 即可實驗。

這個程式使用 loop 訊息,每三秒重新 record 次,也因為如此,重新錄製就產生click 問題。

granular 是一項很複雜的技術,我想我們日後可以慢慢討論這個主題。
現成有一些外掛物件可以用於作曲中,但是都只能做移調、 granular cloud 的效果,無法即時處理 time-stretch。

之前討論區中提到的 Percolate 物件中,應該有一個 munger~ 物件,偷懶的話可以暫時拿來作為 granular 使用,沒有
click,但效果也沒那麼好倒是真的。

Reply all
Reply to author
Forward
0 new messages