|
|
|
|
(此網頁教學檔案、圖片僅適合使用 Internet Explorer 瀏覽) 前言 舉凡二十世紀以來之當代偉大的新音樂作曲家們,如Stockhausen、George Crumb、Edgard Varese、Iannis Xenakis、John Cage、Lucio Berio、Piere Boulez等人的音樂作品中,都包含了電子音樂作品。國外電子音樂儼然已成為藝術音樂的主流之一,絲毫不讓傳統的器樂音樂。然而國內學術界對於電子音樂的認識與教育卻是非常有限,真正以研習電子音樂技術與創作為主的歸國學人,亦寥寥可數,或該研究者雖研究電子音樂技術與創作卻無足夠的器樂音樂創作之背景,而落於通俗音樂之流。此外早期有過電子音樂創作相關經驗的國內作曲家,在於當時科技環境的軟硬體設備不足及不便的因素之下,鮮少有繼續從事該領域之研究者。電腦技術與軟硬體科技的汰舊換新,國外的電子音樂之藝術創作之潮流與藝術性的提高,已非國內音樂創作者所能想像。 早期的電腦音樂的主要創作方式,有透過MIDI的數據傳輸、作曲者以電腦程式將MIDI數據的按照創作意圖的重新組合來完成準則作曲的創作,也有透過將現實世界的聲音透過錄音技術、聲音剪接、數位音訊處理等方式,來完成電腦音樂的作品。隨著電腦軟硬體科技的進步,開始有人使用電腦程式即時處理聲音訊息的功能,將電腦音樂與現場器樂演奏相結合,藉由電腦程式在器樂演奏的同時,即時分析演奏的音高、音量、音色、節奏等各種參數,立即根據電腦程式中作曲者自己預設的各種準則,做出即時的回饋與配合,將重新合成的新音色、新的音場安排與重新組織的音樂事件,配合現場樂器演奏者的演奏,交織成更寬廣的音樂藝術之可能性與時代意義,即所謂「互動式音樂」的基本概念。此類軟體在早期包括Csound及Pd等,然而由於這些軟體的使用,不僅需要有基本的聲音分析與合成的必備知識,更仰賴高度的電腦程式撰寫之能力,使得許多作曲家望之卻步,僅少數具有科技背景的創作者,有能力以此為創作的媒材。近年來電腦音樂程式的編寫介面,開始推向物件導向的介面,許多即時處理聲音的複雜技術也因為軟體介面的改革,而不用從基礎的程式碼學起,由Miller Puckette等人自1988年在巴黎IRCAM所開始研發的Max/MSP系統即為此中翹楚,這相系統隨著近幾年來由原本MIDI操控為主的功能(Max 部分),進步到聲音訊息的即時處理之功能(MSP部分),而拉近了作曲家與電腦音樂科技的距離,互動音樂的潮流也逐漸風行,更發展到結合即時影像的處理(Jitter插件),電腦的角色在音樂作品中的角色與功能,已由聲音的編輯、樂器音色的模擬,進一步成為一個即興演奏者的角色。儘管Max/MSP所帶動的互動音樂技術,已蔚為國外藝術音樂的電腦音樂作曲家們學習的熱門課程,但由於技術的新穎,雖然已經廣為國外新一代作曲家所使用,可供參考的資料仍然相當有限,加上程式撰寫本身即是作曲家創作技巧與理念的一部份,故程式碼的部分鮮少透過書籍文字外傳,若非私相授受的課程,亦難以一窺其堂奧。以該軟體介面為中心的電腦音樂英文的專書僅有Todd Winkler所著Composing Interactive Music: Techniques and Ideas Using Max,其他兩本則是著重以此媒材為主的創作理念探討、各種相關概念之文字定義與說明,包括:Roger Dean的 Hyperimprovisation: Computer-Interactive Sound Improvisation 以及 Robert Rowe 的Interactive Music Systems,也僅僅偏重基本概念的探討 而鮮少有技術性的指導。故特此提供互動音樂相關資訊及Max/MSP相關學習資料,以期國內的藝術音樂工作者能得以藉此瞭解新的音樂科技與創作媒材。 除「互動式音樂」之外,國外其他結合科技之音樂創作媒材也提供了現代作曲家們不同的藝術表達方式,如音樂與影像的結合、音樂與影像間透過電腦程式所產生的即時互動、甚且音樂、影像、文字三者的結合新媒材,這些與影音結合的藝術創作方式,不再侷限於由影像工作者所主導,而是改由作曲家以音樂為主導的方式,透過影像、文字等彰顯音樂的各種姿態與意涵。然而以上所述各種新的音樂創作方式,除了仰賴作曲家本身的藝術心靈,也需要作曲家本身對於科技的熟悉,在資訊交流便捷的今天,一個作曲家深具傳統器樂創作的能力及音樂相關的科技之知能,已非不可能的事,反而逐漸成為新時代對於現代音樂創作者的基本能力之要求。是故這方面研究與創作工作的進行,對於國內的音樂界確有迫切的需要而不容忽視,然而值得注意的是,也唯有已有傳統器樂音樂創作者投入這項包括科技與藝術的研究工作,方能將科技的新媒材與傳統作曲結合,並真正賦予其藝術的深度。 PS 1: 有任何相關問題,歡迎寫信給我。Email: c_o_m_p_o_s_e_r_@_c_o_m_e_m_u_s_i_c_._c_o_m,礙於垃圾信件的攻擊,我把我的Email郵件地址的每個字元間都加上了 "_"符號,您必須刪除"_"符號才得以得到正確的Email地址。 此外,這個信箱只接受中文為標題的信件,其餘信件將視為垃圾信件直接刪除。不便之處敬請包涵。您也可以直接在本網頁的留言版,留下您的Email資料,我會盡快與您聯絡。 PS 2: 本版Max/MSP及Jitter等電腦音樂相關教學內容 、整理、與翻譯,版權所有,若要轉貼,煩請您來信通知我,並請您在轉貼處註明本站網址與作者。謝謝配合。 另外,若網頁上之圖例顯示有問題時,請改用IE瀏覽器。 鄭建文 2004/10/7 於北德州大學
· 互動音樂時的混音接線:以下是在大型學術會議時,互動音樂的作曲者所需準備的相關器材與設置。聲音的三個輸出線,最後都要接到由主辦單位所準備的大型混音台上。以下圖解乃作曲家在舞台上所應該有的較標準的器材設置與接線,以確保能夠即時調整音量比例。(Snake 由主辦單位原本的音響設置所提供,接往大型混音台) (1) 麥克風連接至小型混音器時,使用 pre-fader 模式,使得該 channel 的 fader 只控制 direct out 的乾的樂器演奏音量,而不影響透過 aux 送到電腦中的音量。 (2) 電腦透過聲音介面輸出的加入效果器的聲音,以 post-fader 的方式送至小型混音器。使得演奏時,可以直接控制加入效果器後輸出至大型混音器的音量。 (3) 以上的設定的優點:可以在現場演出時,即時調整送至大型混音器之加上效果器的演奏音量、也即時可以透過調整乾的樂器音量 (不影響輸入至電腦的音量),使得兩者得到平衡。
· 理想的軟體鍵盤介面製作: 當你使用max/msp製作軟體合成器時,有時後你身邊並沒有硬體鍵盤來測試聲音與觸鍵的關係,所以你會需要一個適合的軟體鍵盤介面。Max/msp 內建的軟體鍵盤的介面儘管可以依照滑鼠點擊的位置決定音高與音量,然而當滑鼠移開時,這個音卻仍會持續按住。因此有必要自己設計一套更好用的軟體鍵盤介面,一方面便於測試自己的軟體音源,一方面製作pluggo 軟體合成器時,也可以提供給使用者一個更好的介面。
我們可以利用 mousestate 來偵測滑鼠的點擊與否,當滑鼠移開時,mousestate 的左方輸出口會送出 0的訊息,那麼可利用這個訊息來觸發 flush 訊息指令,使得琴鍵恢復原狀。在此mousestate 需要有一個bang 的訊息來觸發 mousestate 送出滑鼠的相關活動,因此需要使用 metro 物件以每十分之一秒的速度回報滑鼠的活動訊息。
再加上最左方 notein 物件來接受硬體鍵盤的MIDI音量與音高的資料,那麼這個介面就同時可以使用滑鼠輸入及硬體MIDI鍵盤輸入了。
· MIDI 音高收集器製作: 以下程式是為協助一個國科會計畫而設計的簡單的MIDI音高收集器,可以將多軌的MIDI檔案的音高資料分別擷取出來,化成MIDI音高數字(例如:60 是中央C)。
(1) 當使用read 訊息指令讀進MIDI檔的同時,則會清除先前所capture 所存取的MIDI音高資料。 (2) MIDI 音高資料由 detonate 物件分析出來之後,便依照其軌道之不同,分別送往 capture物件中記錄下來。由於MIDI音高資料是序列化的輸出,而非同時性輸出(即使和絃也是如此,儘管人耳聽不一定分辨得出來),故可以使用detonate 的軌道數值直接指定要把送出的音高送往哪一個capture 物件,以便於分別收集各軌的音高數值。 (3) 用滑鼠雙擊 capture 物件,即可打開儲存MIDI 音高資料的text 文件,可以另外存成txt檔,以利資料的收集。 (4) 利用switch 物件可以指定哪一軌的資料會被輸出到 noteout 物件,以供播放聆聽。在此可以聽到聲音將不會保持原來音樂的節奏,以便於更快的得到音高資料。其中,音量輸出值預設為60,使用 pack 物件配合送進來的音高,一併輸出給 noteout 播放。
一般製作互動音樂,有兩種方式,一種是全自動的方式,一種是使用MIDI踏板來切換每個階段的參數更動。 以下是我的博士論文互動音樂作品《雪咒》(給二胡、長笛、大提琴、鋼琴及Max/MSP的程式架構圖解: ![]()
· Linedrive 和 scale 物件的比較: 這兩個物件有一個類似的地方,就是按照使用者設定之輸出數值的範圍,可以把進來的數值,以指數關係,對應到輸出的數值,主要用在調整聲音強度時,可讓輸出的數值更符合人的聽覺上的對聲音強度的關係(對數的關係)。 但linedrive 和 scale 在內部參數的設定上有很大的不同。
Linedrive 的內部參數(argument): (1) 輸入值 (x) 的最大值(有理數) (2) 輸出值 (y) 的最大值 (小數) (3) 指數設定值 (a)(用來決定曲線的形狀,若指數設定值為1時,則輸出與輸入的圖形為線性圖形) (4) 時間值(ms)(專門用來給 line~ 物件使用的時間設定值,這個數值在 scale 物件中是沒有的。) Linedrive 接受於第一個內部參數正值與負值範圍內的輸入值,使其落於第二個內部參數輸出值正值與負值之間。彼此以形成指數關係。
y=ax (a > 0) Scale 的內部參數 (argument): (1) 輸入值 (x)之最小值 (2) 輸入值之最大值 (3) 輸出值 (y)之最小值 (4) 輸出值之最大值 (5) 指數設定值 (a)(用來決定曲線的形狀,若指數設定值為1時,則輸出與輸入的圖形為線性圖形)
第五個內部參數是可有可無的,如果指定了第五個內部參數,則其必須大於1,才能形成指數關係,否則輸出、輸入值仍成線性關係。
y=ax (a > 0) l 利用pluggo 的功能製作autopan 之VST plug-in: (1) “pp” 物件表示所要做的VST 插件之第一項可變的參數。使用迴路的原因是為了使每次更動數字方框內的數字時,能夠直接將訊息送回給pluggo的 “pp”物件,以方便程式寫作。實際上pluggo 所製作的VST插件,並不會出現數字方框,在此的數字方框除了用來顯示實際上pluggo所接受的參數之外,也用來控制調整pluggo內的參數。Pluggo本身對 “pp”物件有阻斷迴路的設計,所以並不會因為表面上看到的迴路而發生程式的運作錯誤。 (2) pp 物件中,第一個arguement為欲顯示在VST面版的參數名稱,第二個arguement為此VST參數的最小值;第三個arguement為此VST參數的最大值。 (3) 右下角 plugconfig主要在儲存VST內的預設值,調整pp物件的數值,然後點擊連接plugconfig的圓形按鍵,即可除存此時pp的預設值。而recall訊息指令則用以呼叫出預設值。這些預設值在plugconfig的程式碼中(點擊plugconfig即可看到),被稱做program 1, program 2, program 3…以此類推。 (4) 以下是plugconfig程式碼的重要訊息解釋:
#C useviews 1 1 1 1; #C numprograms 64; (最多容許64個預設值) #C preempt 1; #C sigvschange 1; #C sigvsdefault 32; #C autosize; #C defaultview Interface 0 0 0; #C dragscroll 1; #C noinfo; #C uniqueid 128 22 42; #C initialpgm 1; (開啟VST plugin時起始值使用program 1 的預設值)
以下圖為例,plugconfig已經儲存四個預設值(4個program),則plugconfig的程式碼顯示如下: #C useviews 1 1 1 1; #C numprograms 4; #C preempt 1; #C sigvschange 1; #C sigvsdefault 32; #C autosize; #C defaultview Interface 0 0 0; #C dragscroll 1; #C noinfo; #C setprogram 1 "Moderate" 0 0.466667 0.; (引號中的字為第一個預設值的名字) #C setprogram 2 "Extreme Slow" 0 0.006667 0.; (引號中的字為第二個預設值的名字) #C setprogram 3 "Extreme Fast" 0 1. 0.; (名字之後則為plugconfig儲存的預設數字) #C setprogram 4 "Slow" 0 0.2 0.; #C uniqueid 128 131 209; #C initialpgm 1;
(5) 此程式所設計的效果器,其原理在利用弦波震盪器來控制左右聲道音量的大小,但震盪器的振幅數字變動會有正負,所以利用abs~絕對值物件將弦波的數值取絕對值,利用 “!-~ 1”使左聲道的音量控制值和右聲道的音量控制值相加為1,兩聲道的音量相互消長而造成聲音左右來回流竄的效果 (autopan)。
(5) 上述製作完成後,利用max/msp裡頭build collective / application / plug-in的功能選項,建立plug-in即可。在windows系統底下,此VST plug-in會形成副檔名為dll檔,利用VST plug-in 相容的軟體,例如cubase, nuendo, adobe audition 等開啟,即可使用,使用介面如下圖所示,其中pp物件之get info 中所加入的文字,即為該參數的說明文字,在此為 “Set the autopan speed.”
l Amplitude Modulation: 和ring modulation 相同的地方是載波的的振幅隨著調變波而變化,此外,每個正弦波的載波和調變波,也會產生一組sideband。不同於ring modulation 之處,在於AM合成技術中,調變波是單極(unipolar)的,亦即整個波形是在0之上,且AM產生的sideband 與載波分離的距離,隨調變波週期的倒數(調變波的頻率)而變化。例如1kHz的正弦波作為載波,被400Hz的正弦波以AM方式調變,則產生的sideband以載波頻率(1kHz)為中心,分別為600 Hz及1400 Hz,再加上原本的載波1kz的輸出。兩個sideband的振幅隨著調變波的強度的比例而增加,但是總是不超過載波頻率的一半。
對於較複雜的AM合成樂器,常加上調變波的強度控制器及整體的音量控制器。以另一個波封作為作為調變波的音量控制器時,則這個波封便作為是modulation index,並配合positive scalar的設置,可以用來將雙極的調變波改變成單極的調變波,使最終用來作為調變波的波封被調整為介於0和1之間,然後再將這個被更改過的調變波加之於每個聲音事件的時延(durations)中。換句話說,positive scalar 是用來保證調變波最終輸出介於0和1之間。假設有數個單極調變波同時使用,則每個單極調變波的強度總量不可超過1。
l ring modulation: 理論上來說,ring modulation 是 amplitude modulation 的一種形式,在數位的系統中,ring modulation 即是將兩個雙極(bipolar)的聲音訊號相乘。載波(carrier)和調變波(modulator)在正負1之間擺盪,便是一種bipolar的聲音訊號。經由ring modulation 的結果會輸出兩個頻率,亦即是載波和調變波的頻率相加和相減兩個頻率。
當調變波低於20Hz時,ring modulation 所產生的是tremolo的效果,當調變波增至可以聽得到的頻率帶,則產生新的合成音色。每一個載波的成分當被調變波以ring modulation的方式調變之後,各自會產生一對sideband(載波和調變波的頻率相加和相減兩個頻率。),奇特的是出來的結果,載波的頻率卻消失了。此外,如果載波和調變波的頻率彼此是整數倍的關係,則調變之後產生的sideband將會是載波的泛音,反之則結果是非泛音。其sidebands的輸出可由以下公式說明之: cos (C) × cos (M) = 0.5 × [cos (C-M) + cos (C+M)]
cos (C): 載波 cos (M): 調變波
Ring modulation 輸出的sideband,其相位也是兩個輸入波相位的相加與相減的值。當載波和調變波都是複雜的波形時,則輸出的頻譜將會包含許許多多頻率之間相加相減的新頻率。利用特殊的技術,可以將輸出的兩個頻率分開,這種方法被稱為single-sideband modulation 或frequency shifting。在Max/MSP之中, 這種功能可以藉由freqshift~的物件來達成。
l zl 物件: 1. 執行各種list功能,並以一些特定關鍵字之內部參數設定之。也可使用mode 訊息來改變功能。zl 物件的入口、出口及預期的功能皆依照zl的mode而有不同。後面接上group, iter, join, len, reg, rev, rot, sect,slice, 或union,設定了zl的當前模式。對於一些mode的運用而言,從左方入口收到的list可能被用作argument來指定既有mode的功能。不夠長以致於無法被送出的項目會被加到儲存的list之長度中。一旦儲存的list長度夠長時,則會由左方出口被送出。 2. zl slice:依照argument或右方入口的數字n指定,由左方出口送出左方入口得到的list中的前面n個數字,剩餘的list數字則由右方出口送出。送出的順序先為右方出口送出剩餘list,接著左方入口送出前n個數字的list。 3. zl ecils是用來將一個list分成兩個。功能類似zl slice,但輸出list的左右通道不同。zl eclis可接受argument來設定list中成分的大小(這個值也可以被指定為此mode中,一個右方入口的輸入值)。 左方入口接受的一個list將依照右方的數字,被分成兩個list,第一個list包含了從list尾端倒數過來(右方向左方倒數回來)的數字項目,並被送出右方出口。其他剩下來的list成員,則被由左方出口送出。(List是先由右方出口送出右方的list,再送左方出口送出左方list,與slice功能相同,唯argument所指定的意義不同,zl slice指定前n個數字的list,zl eclis指定後n個數字的list。) 4. zl group是接受額外的number argument用以指定list中成員的大小。左方入口接受的list或數字將被儲存,直到所儲存的list的長度與argument所指定的數目相同時,則被由左方出口送出。其餘的符號及成員將仍被儲存。 5. zl sub: 從左方進來的list中,找到右方進來的數字,並輸出其所出現的次數(右下方)及其在list中的位置(左下方)
6. zl sort: 排列list的數目大小 7. zl revr: 逆行list的數目之順序 8. zl slice 3: 只選出list中,左邊數來的前三個數字。(zl右方輸入口加上數字變數方塊,可以改變slice的大小值。
l Feedback 技巧在 jitter 中的運用: Video 的「迴授」概念跟 Audio 相似,是把出去的訊號,在依照設定的比例大小,加入原來的影像訊號,形成一個迴路。故在 jitter 中,只要在出口出接上名稱相同的 jit.matrix 以便將輸出的陣列,得以利用 「 jit.op@op + 」 的功能,再度將舊的video訊號與新的video訊號相結合。「 jit.op@op *」則用來設定「迴授」值的大小。以下則是將原本開花過程的簡短影片,利用feedback的技巧,配合 jit.rota 旋轉 matrix 的功能,而顯現的豐富多變的影象織度。在此我使用了兩個不同的 metro 設定值,其中設定以一秒為間隔的,是用來控制 clear 訊息,以便於不讓 feedback 的效果消失得太快。
l fffb~ 1. 帶通濾波器物件,輸入的訊號將分別被送往每一個濾波器,並各自由不同的出口送出,功能類似 reson~,但是 fffb~ 更有效率,然而無法接受audio rate的訊號(例如 line~,來改變內部參數。) 2. 內部參數: (1) 濾波器的總數量 (必須的參數) (2) 最低的濾波器頻率 (3) 相續的濾波器之間頻率的比例 (4) Q值 (5) 若有加上H為參數,將使這些帶通濾波器以泛音關係排列。 3. 可接受訊息指令,調整內部參數值。例如下圖中,右上方以 multislider 配合 prepend 加上的前置參數名稱,來控制 fffb~ 物件的內部參數值。
l fft~ 物件的使用說明: 1. 左方第一個入口接受將要被分析的訊號之實部。右方入口則接受該訊號的虛部。如果訊號指連接至左方的入口與出口,則fft~進行real FFT (fast Fourier transform)的分析。一般狀況的連接方式,fft~進行complex FFT的分析。 2. 內部參數可以選擇性填入或不填入。第一個參數確定FFT內樣本的點數, 且該數字必須為二的平方,預設值為512。第二個內部參數設定兩個相連的FFT之間的樣本數,預設值也為512。第三個內部參數設定開始進行FFT的間距之偏移量,這個值必須是0或者是signal vector size的倍數。Fft~物件自己會修正不恰當的內部參數,但是假設你在填入參數之後,又去更動Max/MSP的signal vector size的設定,而導致fft~物件內的偏移量設定無法是 signal vector size的倍數時,fft~將不會運作。 3. 左方第一個出口輸出Fourier transform的實部,中間的出口輸出虛部,右邊的出口輸出一種同步訊號,亦即由在FFT輸出的期間內,同時輸出由0漸進至「FFT樣本數減一」的數,可以用來作為輸入index~物件值,以便於在頻率範疇進行運算時所用。
l matrix~的用法:用來作為訊號的開關與混音之用。 1. 左上方網狀物件為matrixctrl,可用來連接matrix~,作為下達音訊通道的開關的媒介。例如2 1 1的訊息指令中,2表示讓訊號由第「3」個channel進入,1表示並從第「2」個audio output 送出音訊(此處0指第1個通道,1則指第二個 通道,以此類推),最右邊的1則表示「開啟通道」。這種連接matrixctrl的訊息,也可以全部串連成一個長串的list,每三個數字代表一個訊息指令。 2. 但依賴matrixctrl無法指定通道開啟時fade in, fade out的所需時間,且也無法指定音量,故可以將訊息指令的方塊直接接到matrix~物件中。例如1 1 1 1000表示開啟matrix~左方數來第 二個入口,讓cycle~220通過,並由第二個signal output輸出,輸出的音量為值1,達到音量1的所需時間為1000毫秒。 3. matrix~本身內部參數,左方數來第一個參數表示有幾個入口,第二個參數表示有幾個signal output(若為二,則有兩個signal output,外加一個inlets outlets gains)。若加入第三個參數或第四個參數,則使得matrix~本身由binary mode (只能切換開關的模式)變成non-binary mode (可以設定音量大小,也可以設定fade-in、fade-out所需的時間。)
l 關於jitter插件在Max/MSP的使用,也日漸普及,成為互動藝術中不可缺少的一項工具,其功能可以藉由將外部攝影機所收得的影像、各種感應器(包括速度、壓力、熱度等等)、麥克風即時收錄的聲音透過Max/MSP的頻譜分析(包括音高、音量、音色等諸多參數),藉由數位化的過程,化成數字參數,互相控制。最基本的幾個物件說明如下:
1. jit.matrix: 是以陣列方式來儲存代表像素的數值,其基本的內部參數 (argument) 包括這「陣列名稱」、「每一個cell有多少層plane」、「儲存陣列的格式型態」(可以是char ( 8 bits)、long ( 32 bit有理數)、或 float32 (32 bit 浮點數)、以及陣列的「長」、「寬」。setcell指令來設定某一個陣列中某一位址之數值,getcell則命令jit.matrix由右下方出口送出某一個位址的數值,配合通過「route cell」、「unpack」物件,則可擷取其位址與數值。 2. jit.qt.grab: 用來從外部攝影機或硬體影像擷取裝置中擷取影像 3. jit.qt.movie:用來播放影像 4. jit.pwindow:在max/msp的patch中直接顯示影像 5. jit.window:另開一個視窗來顯示影像。 6. jit.spill:用來將陣列中的某一部份,以list的方式擷取出來(最多不可超過256個數值)。 7. jit.pack:用來將不同的陣列結合起來,成為多重plane的的新陣列。反之則可用jit.unpack。
下圖則用jit.cellblock這個物件,來顯示陣列中的數值。圖例左上方,以uzi物件由最右邊出口送出index number,送至「setcell」指令,指定jit.matrix的陣列中的「位址」與該位址的「數值」是多少。陣列中,最右上方為(0, 0),最又下方則為(7, 5),類似我們在數學中的第四項限座標加上絕對值。故第五列第五行的座標為(4, 4)。jit.unpack則可以用來將以test1為名的陣列,分離成四個plane,分別代表alpha、紅、綠、藍四個channel的數值,第五個則為所有數值的綜合體。圖例中並以jit.pwindow來呈現這些不同的plane對應到顏色上的結果。
右上方則說明兩個jit.matrix陣列之間的訊息傳遞,可開啟usesrcdim(所使用的來源陣列)、usedstdim(所使用的目標陣列)的功能,通過指定來源陣列的 (0, 0)至(3, 3)的區域之數值,傳送到目標陣列的(1, 1)至 (4, 4)的區域。其他空白區域,依使用者是開啟jit.matrix的interp、adapt的功能之不同,而會有不同的數值填補方式。
圖例下方則是將test1陣列由char的形式轉換成32bit浮點數(float32)的形式,故原來的整數會變成介於正負1.0之間的數值。關於jit.matrix的相異數值儲存形式之轉換,尚有jit.coerce物件可用,用來在保持相同bit的情況下,將一種數值儲存形式強制轉換成另一種。
大型陣列的數值可以透過儲存成 .jxf 的格式,而可以不需再重新計算一遍。也可透過輸出成jpeg, gif等圖檔格式。
Lores~: 1. 低通濾波器的一種,可以用來加入resonance的控制,常被使用於類比合成器中,以Q值(頻率對頻率帶 bandwidth 的比值)來調整resonance。 2. 左邊入口輸入訊號。中間入口設定「截止頻率」(cut off frequency,其輸出訊號會比passband 低3dB,超過cut off frequency的頻率則會開始被壓低強度)。右邊則是設定resonance 值。 3. 在 lores~ 中的 Q 值內定為 resonance 係數,以1.0為上限,超過1.0則會產生聲音的扭曲。 4. 較高的resonance值會造成泛音在濾波的過程中被更加強調。 5. 下例中及結合了濾波器截止頻率的控制與音量之波封的控制,來改變聲音在時間中的變化。
l Poly:用來將音符訊息分配到不同的發音體去發聲。 1. 輸入口由左而右為依次為「音高」、「力度」 2. 若有argument,則由左而右依次為「發音數」(預設值為16)、「voice stealing開關」。(若第二個argument為1時,則允許voice stealing。若第二個argument 為0時,則不允許voice stealing。) 3. 輸出口由左而右依次為「指定的發音體之編號」、「音高」、「音量」 l Poly~: polyphony/DSP manger for patches 1. poly~為另一種管理subpatch(原文稱為instance)的方法,input及output分為signal與message兩種,但poly~所在的主程式而言,signal和message共用同一個編號的輸出或輸入。故副程式的input若有 “in~ 1”、”in~ 2”、“in 1”、 “ in 2”,則實際上出現在主程式的input只會有兩個 input 1、input 2,但signal 和 message共用通道。至於主程式的輸出則與副程式的輸出數目相同,signal 和 message的通道不共用。 2. “open + 數字”連接至poly~左方入口 之message,可用來開啟不同編號的patch。若open未加數字,則會開啟目前所指向(target)的patch。 3. “target 變數”,連接至poly~左方入口,表示poly~所接受的訊息將要傳至那一個編號的instance (subpatch、發音體)中。”Target 0” 表示全部的instance(發音體)都開啟並接受訊息, “target -1”表示全部的instance之發音體都關閉。(target可連接在在poly之後,接受來自poly的發音體分配命令,透過target訊息將之送入poly~) 4. “mute 編號變數”之訊息指令,若得變數為1,則將該編號的instance靜音。若得變數為0,則停止靜音。 5. “mutemap 編號”用來通過指定通道回報當前各個instance的mute的狀況,例如mutemap 2表示要由ouput 2(for message)來回報每個instance的靜音狀況。若共有三個instance,且第一個instance與第三個instance皆被靜音,則會從output 2送出 “1 0 1”的訊息,1表示靜音。 6. “busymap 編號”用法類似mutemap,只是是用來通過指定通道回報當前發音數是否已滿 (busy) 的情形。 7. “voice 數字”:改變現在可被使用的發生數量。 8. thispoly~:此物件僅能使用在poly~物件的subpatch中,用來回報poly~的subpatch本身的編號,並控制發音數的分配。當其左方入口接受1的訊息時、非0的訊號、或由於instance正再運作發聲時,觸發mute off (0) 的訊息時,送至thispoly~時,將使得該subpatch被標示為busy。其左方出口則顯示目前所在的subpatch編號。 9. “note 編號”的訊息指令,將通過poly~左方入口被送到第一個未被標示為busy的subpatch (thispoly~被標示busy的條件如前項說明。) 10. “steal 編號”啟動voice stealing的功能。
l 下例即是使用poly~以及之前單音合成器的原理互相結合所產生的複音合成器:(請參同時考單音合成器之製作範例)
其中poly~的副程式之內容如下:
MSP中關於FFT的要點整理:(請參照MSP tutorial 26) 1. 一般常用的聲音處理包含:從振幅上改變樣本(如 waveshaping, distortion)、從時間的層面改變樣本(如 filters, delay)、從頻率層面處理樣本(Fast Fourier Transform)。 2. fft~將一個樣本群(frame)的所有頻率一一轉變成一對對可以用來代表 amplitude及 phase的實數及虛數。這些樣本群中的頻率叫做 bins或 frequency bins。 3. FFT size:一個 Frame 中的所包含的樣本數。又稱為 FFT point size,其數值必須是2的平方。 4. FFT分析中,頻率解析度越精細,則時間解析越粗略。反之亦然。較小的FFT size造成較精細的時間解析度、較粗略的頻率解析度。 5. Windowing Function: 相連的 frame 若經由 overlap 與 cross-fade的處理,則可以彌補FFT再合成的過程中,IFFT (Inverse FFT) frame 兩兩相連之處可能產生的雜音。 6. STFT(Short Term Fourier Transformation): 使用overlap、windowing的方式處理FFT及IFFT於分析與合成的技術中,被稱為STFT。 7. Sample Rate/ FFT size = FFT fundamental frequency 8. pfft~的用法:將時間範疇的訊號轉化成一連串的frame,且frame與frame之間採用overlap的方式於時間的流展中串連,由fftin~送出之後,再由fftout再合成為原來的frame。 (1) 使用一個包含 fftin~及 fftout~的 subpatch之名稱為其第一個argument。第二個argument則FFT size中所包含的樣本數。第三個 argument則為 overlap factor (必須是2的平方)。 (2) fftin~, fftout~第一個 argument代表輸入口的數目,第二個argument代表window type(預設值為hanning,亦即cosine狀的window;其他window的形狀還有Hamming, Blackman, Triangle, Square)。 (3) signal vector size在pfft~的subpatch中,等於FFT size的一半。又稱為 spectral frame size,亦即 FFT分析中可以分析出的頻率帶的數量(number of frequency bins). (4) fftin~及fftout~所執行的過程是一種 real FFT,使用一種數學上的技巧,將時間範疇的真實輸入重新組合成 complex FFT 的實部和虛部,而這種分析技巧的 FFT size 只有原來真實FFT size的一半,其分析結果再經重新組合,成為一個複合頻譜,用來代表原來訊號中實部的一半(從 0Hz 到取樣頻率的一半)。 (5) 頻率範疇的相乘被稱為 convolution,其為 cross synthesis (morphing)過程中的基本的訊號處理步驟。 (6) fftin~的第三個輸出口送出對應於當前 frequency bin index(這些 index的數值資料則由第一及第二個出口送出)一連串樣本。第三個輸出口送出的數據又稱為sync signal。我們可以將這些數值轉化成頻率,來代表每一個bin的中心頻率,其算法是將 sync signal (FFT index) 與 FFT的機音頻率 (fundamental 或 base frequency) 相乘。(sample rate / FFT frame size = fundamental of FFT, sync signal * fundamental of FFT = center frequency of current bin) (7) fftinfo~若置於pfft~的subpatch中,則其輸出口由左而右依次為 FFT frame size、 FFT half-frame size(又稱為 spectral frame size或signal vector size)、FFT hop size (經windowing處理的frame中,重疊的部分之樣本數)。 (8) pfft~可使用 in 及 out 物件來增加輸出入口,類似 poly~的用法,但不可使用帶有 “~” 的額外輸出入口。
總結以上各點,max/msp 撰寫時,常用的重要FFT公式有: FFT之基頻 = 取樣頻率 / FFT frame size FFT 解析度 = number of frequency bins = 1/2 FFT size = spectral frame size Hop size = FFT size / 重疊係數(overlap factor) 當前的 frequency bin 之中心頻率 = FFT bin index * FFT 基頻
l 簡易單音合成器製作(單一發音數): 以下合成器製作,主要包含MIDI控制、發音體、波封控制、濾波器四部分、聲音柔化。 1. MIDI控制:透過 notein 接受 midi 訊息,並透過 ddg.mono 物件,可以用來設定midi輸入訊息的優先權,此例中,使用其預設值,永遠讓最近一次輸入的MIDI訊息享有優先權,亦即最近一次的輸入MIDI訊息將覆蓋前一次的MIDI訊息。(因為此例只容單一發音數。)透過 mtof 物件將MIDI訊息轉成頻率數字,以操控發音體的頻率。(下載 ddg.mono 物件請至http://www.cycling74.com/share/ddg,將之置於msp的 external 檔案夾即可)。 2. 發音體:可以採用cycle~或 phasor~ 等震盪器,在此因為 phasor~ 所產生的鉅齒波具有更多的泛音,更適於配合濾波器的作用,故選之。 3. 波封控制:為了避免聲音突然達到某一音量時所造成的雜音,在此例中,共採取三種措施。其中之一是使用 line~ 來來柔化之。當輸入的MIDI力度(除以128以配合聲音訊號之數值大小範圍)大於 0 時透過左方紫紅色區域做力度爬升的柔化。當輸入的MIDI力度為0時,則由右方綠色部分,控制聲音消逝所需要的 release time。Delay 1用來等待 pak 物件送出給 line~ 的 list 之後,才送出bang來驅動 line~ 的作用。 4. 濾波器:運用biquad~率波器配合filtergraph~物件,由 unmenu先寫送出各類濾波器名稱(在此必須由 unmenu左方出口送出 text 的 訊息,才能使 filtergraph~ 辨認之,這些文字訊息包括 display (各種參數設定的結果)、lowpass (典型低通濾波器)、highpass(典型高通濾波器)、bandpass(典型帶狀濾波器)、bandstop(將帶狀濾波器上下翻轉而成,亦即一種可控制的槽狀濾波器)、peaknotch(槽狀濾波器的一種,但可以由使用者自行調整peak峰值)、另外還有 lowshelf、 highshelf、resonance 等濾波器,請直接參考 filtergraph~ 的圖形變化。透過biquad~濾波器將聲音做頻譜的各種改變。 5. 聲音柔化:將 line~ 送出的訊號,透過 rampsmooth~物件柔化之,其中的數字參數為ramp up、ramp down所需要的樣本數。另外在音量推子之後,又加上 clip~ 物件設定其最大、最小值必需介於+1和-1之間,在此直接設定介於 +0.99至- 0.99之間。
l Makenote:用來製造 MIDI note-on、note-off訊息(輸出MIDI音高、力度訊息),此外,透過argument的設定,可指定每個 note 的力度、duration。 l Linedrive: 1. 用來將整數依照指定的方程式(y = b e-a log c ex log c)改成對數。用來配合line~的運作。x 為輸入值,y為輸出值。 2. argument由左而右為:最大輸入值、最大輸出值、exponent mult.、起始延遲時間。其中exponent決定x、y 關係圖形的弧度大小,必須大於1,其中一個適當的值為1.06。 3. delay time可以由左上方入口處做調整。 4. 輸出為一個 list ( x, delay time) 5. 用來連接line~,使 line由現值走到 x 需要 “delay time”時間(毫秒)
例如:建構一個簡單的單一發音數、velocity sensitive 的 synthesizer,並以linedrive 及 line~調整 envelop,由notein輸出的velocity力度大小,透過linedrive的運算,來決定音量在時間中的變化。 ![]() l Poly:用來將音符訊息分配到不同的發音體去發聲。 1. 輸入口由左而右為依次為「音高」、「力度」 2. 若有argument,則由左而右依次為「發音數」(預設值為16)、「voice stealing開關」。(若第二個argument為1時,則允許voice stealing。若第二個argument 為0時,則不允許voice stealing。) 3. 輸出口由左而右依次為「指定的發音體之編號」、「音高」、「音量」 l IO Vector Size 與 Signal Vector Size: 1. I/O vector size (the number of samples that are transferred to and from the audio interface at one time): 每一次透過聲音介面,被送入或輸出的樣本數。每次從外部提取多少個sample來處理,其大小就是I/O vector size (a package of samples)。 2. signal vector size (the number of samples for MSP objects to deal with once)(how many audio samples MSP calculates at a time): 每一次MSP所處理的聲音樣本數。每次從I/O vector被放入MSP處理器中的數量。(例如,當I/O vector size 為256時,且取樣率為44.1kHz,則MSP一次可以計算約5.8(256 / 44100)個千分之一秒的聲音資料。) 3. I/O vector size 越小,CPU的負荷越大(因為電腦處理過程中interrupt越多,可能中途轉向處理或儲存其他正在運行的程式,因而影響CPU處理聲音的能力),可能因為MSP來不及處理送入的訊息,造成deck slip 或 click。 4. I/O vector size 越大,則有可能使電腦處理聲音的速度慢於聲音輸出的速度,造成輸出的聲音開始有click。或有可能造成輸入的聲音的delay。 5. signal vector size的調整並不會影響聲音的延遲(latency),而僅是對整體的表現有影響,越大的signal vector size表現越佳。但有些聲音的處理過程,比較適合使用較小的signal vector size,例如tapin~, tapout所產生的最小延遲等於當前取樣率下的signal vector中所包含的樣本數,例如signal vector size 是64,取樣率44.1kHz,則tapin~、tapeout~的最小延遲則是1.45個千分之一秒(64/44100)。signal vector size 會小於或等於I/O vector size。如果I/O vector size不是某數的2次方,則最大的signal vector size要等於可以用來均分I/O vector size的最大的2的n次方(power of 2)。 6. vector size 的設定可在 option/DSP status 中修改。 l Max Scheduler in Overdrive及 Scheduler in Audio Interrupt的設定: 1. Max Scheduler in Overdrive: 預設為關閉此功能。當overdrive被開啟時,Max event scheduler便以interrupt的模式運作。這種event scheduler處理的事情包括觸發metro物件的bang、或送出最近接收到的MIDI訊息等,當overdrive的功能未啟動時,電腦則以最末的優先順序處理之,很容易受到任何其他動作,如開啟下拉式選單等的動作而被中斷。Overdrive的啟動,一般而言可以改善時間的精確性。 2. Scheduler in Audio Interrupt: 開啟該項功能,可以使Max/MSP在使用時,可以將max的clock與msp的control rate的同步更為精確,改善由控制器或外部MIDI輸入所觸發的audio事件的時間的精確性。 3. DSP的內容,可以用message來做設定,sr表示sample rate;sigvs表示signal vector size 例如:
5. overdrive的開關,除了直接在menu中更改之外,也可以利用message來做設定,在semi-column message中寫入dsp takeover 1,便可在loadbang或按下message box時,直接更改msp中overdrive的設定,dsp takeover 1開啟overdrive,dsp takeover 0 關閉overdrive。
* iovs: i/o vector size l 關於FFT理論:法國數學家Joseph Fourier證明任何週期性的波形都可以用與其相關的泛音之正弦波之(sinusoids)的總和來表示,其中每一個正弦波都有自己的振幅與相位。以數位方式來表示一個波形,我們可以使用DFT (discrete Fourier transform)的方式來計算每一個正弦波的成分。DFT將時間範疇(time-domain)的聲音表示轉化為頻率範疇(frequency-domain)的頻譜分析。 這種理論是將聲音波形在時間上切成小塊來分析,每一小塊樣本(time slice),理想中等於該波形的一個週期。要使用這種理論來分析真實世界不規則的波形,所採用的方法是針對時間上連續的小塊樣本做DFT分析。 當每一小塊的時間(time slice)所包含的數位樣本是2的 n次方時,我們可以使用更快的DFT分析法則,被稱為FFT(fast Fourier transform)。 在Max/MSP裡頭可以fft~來作訊號分析,預設每個小塊的時間樣本(time slice)包含了512個聲音樣本(在MSP中,這個值可以透過在DSP設定中改變I/O vector size來做改變),fft~的入口處接受聲音訊號之後,送出每一個頻率帶的相對振幅,這個一連串數據(list)的長度恰好等於每一個time slice中所接受到的樣本之數目。但fft~所送出的分析結果,已經是前一個已過的時間區塊裡頭的數據。 Fft~可以有3個內部參數(argument),第一個為frame size (或稱FFT size、window size),為每個FFT所包含的樣本數。(以樣本數為單位;window function 是指為了讓digital Fourier transform便於分析真實世界的聲音,而將這些聲音轉變成有限的長度,這些聲音必須透過windowed的過程,藉由乘上一個window的數值,來限制這些聲音的長度。在電腦音樂中,window則可以說是一個為了頻譜分析量身打造的波封模型。)、第二個參數為兩個相連的FFT之間的樣本數、第三個為相位(FFT開始運作的初始偏移量offset)。 FFT只有在恰巧可以完整分析到一個波形的週期時,才能運作完美,故為了減少這種分析時的誤差效應,我們可以藉由於分析時,使用重疊的時間樣本區塊(time slice),並且透過乘上另一個波封模型,例如三角波等,來柔化每個區塊的結束點,並過濾掉因為不連續的波形樣本所產生的錯誤的頻率。在MSP實際運用中,這種波封模型可以藉由使用cycle~來讀取buffer~的波封模型(此模型與FFT重複運作時的比率相同,例如每一個time slice套上一個波封模型),將之與原始聲音相乘後,再送入fft~作分析。而藉由同時運行兩個fft~,在物件的第三個argument中設定成不同的相位偏移量(需為MSP的signal vector size的倍數),可以造成前述重疊的時間樣本。(更多內容請參考MSP tutorial 25) Max/MSP 4.5 pc 版本,終於加入了qlist的物件,這個物件在即時互動音樂演奏中,幾乎是不可少的,但之前只有MAC版本,且必須自行到特定網站下載,最新版的Max/MSP則增加了此功能,且附帶了詳細的介紹。但原文的說明對於初學者仍然非常難以理解,故我將之做了簡單的整理。請配合qlist的help檔案中的qlist control之subpatch來測試與學習(http://www.cycling74.com)。 l Qlist的使用方法: 1. Qlist的內文格式(以滑鼠雙擊呼叫之)有三種:(1)只包含數字 (2)以符號做開頭,後面接上參數(3)以數字作開頭,後面接上符號及參數。 2. Qlist在傳送訊息時,內文中只含數字的,會由qlist左方出口送出;以符號開始的,則直接將後面的參數送至受信者;以數字開始,後面有符號及參數的,則被視為分開的兩個事件,第一部份(數字)被由左方出口送出;第二部分(符號+參數)則被直接送至指定的受信者。 3. 當qlist收到如next的指令時,會送出所有以符號開始的內容至指定的受信者,但在遇到以數字開始的一行訊息時,則會送出開始訊息之後立即停止運作。Next訊息指令,用來命令qlist送出下一行的內容,其會送出所有以符號開始的各行,一直到其送出一行以數字開始的內容為止(符號部分將忽略)。若Next訊息指令後面接上非0的參數,則qlist會忽略所有以符號開始的的行,而只送出下一個以數字開始的數值。(故next 0 意義與next 相同,開始的數字與後面的符號、參數都會被送出。Next 1則只有開始數字被送出,符號與參數則被忽略,亦即qlist實際上並不發送訊號至受信者。) 4. 送bang的訊息給qlist會使其一次送出所有qlist的全部內容。此時,若遇到以數字開頭的一行,則被當作送出的事件與事件之間的間隔時間。 5. qlist文件中,每個事件(行)必須以分號相隔。 6. rewind:返回到qlist文件的最前端。 7. forward 2: 一次送出下兩個qlist中儲存的訊息至目的地。但以符號開始的行,則被forward命令忽略。 8. 利用bang可觸發qlist的自動控制的功能,stop則停止自動控制功能。其語法如下:[時間] [目的地名稱] [數值]加上分號。[時間]表示事件與事件之間的時間距離。啟動自動控制的功能時,可以使用 tempo 1.(原速度)、tempo 0.5(半速)、tempo 2.(兩倍速度)等來操控事件被依序送出去的速度。 9. 正常情況,qlist運作完後由最右方出口送出bang。但若是啟動了自動控制功能,則是在任務完成後,由中間出口送出bang。
qlist control範例說明:qlist也可配合下面的patch使其依照所受到的數字訊息執行儲存在該qlist文本中對應的命令,此時qlist的語法:[延遲的時間或間隔] [編號] [目的地名稱] [參數]。(若接收到的數字為0時,則觸發rewind的動作。此外,該編號送入qlist時,只能前進,不能後退,也不能重複發送同一個編號後面的指令。)
1. 點選patch中間0, 則配合下一次qlist受到訊號時,產生next 0,觸發qlist送出下一個命令行。點選patch中間的1時,則配合下一次qlist受到訊號時,產生next 1,根據next的使用法則,此時qlist內文的符號及其後參數都被忽略,所以不會送任何訊息給受信者。 2. 點選patch右上方事件編號0時,觸發”rewind, next”,qlist會送出其內文至 0 1開始的數字而立即停止。Patch左方split物件因為上方的運算符號並沒有收到左方的訊息,無法產生運作,故split在此無作用(del被stop指令停止運作,無法產生bang觸發split上方的運算符號運作)。 3. 點選patch右上方事件編號1時,Patch左方運算符號先送出0 (來自上端運算符號的1-1),使得split物件由左方出口瞬間送出0的訊息,觸發trigger的運作,造成next 0,讓qlist得以移動至下一行的開頭之數字部分(0 2)。此時split上方的運算符號受到del所發送的bang,送出-1(1- 2=-1),經由split左方出口送出,但不觸發任何後續事件。 4. 點選patch右上方事件編號2時,patch左方運算符號先送出0(2-2=0),使得split由左方出口瞬間送出0,觸發triiger的運做,造成next 0,使得qlist得以移動至下一行的開頭數字部分(2000),通過unpack,送到del的右方入口,作為delay time,因此兩秒後,del發送bang的訊息,使運算符號物件送出0(2-2=0),透過split左方出口觸發trigger送出next 0,讓qlist移動至下一行的開頭數字部分(0 3)。 5. 若在前一個程序中,2000尚未變換成0時(亦即delay time時間尚未到時),就直接點選patch右上方事件編號3時,patch左方運算符號先送出1(3-2=1),使得split由左方出口瞬間送出0,觸發trigger的運作,造成next 0,使qlist移動至0 4,同時也使得第二層的split物件送出0,清除正在進行的2秒延遲。 6. qlist內文中的0 11,只是為了避免觸發事件編號10時所造成loop,故以0 11來中止程式運作。 下圖是經過修改過的patch,直接可以MIDI器材或鍵盤操控qlist
l 關於message box之運用: 1. 在message box當中,使用set 右邊可接上$用來接受入口處的變數。 2. Set 右方的變數也可以是一個數列,數與數之間不可加逗號。 3. 若要把$及小數點等當作符號來使用時,這些符號的前面需加上“\ ”。 4. append 的作用在於在已輸出訊息之右邊補上其他資料,prepend則是在以輸出訊息之左邊補上資料。 5. 空白的message box本身可以用來顯示接收的資料,但必須在其上方接受set, append, prepend等message box 所下的指令,或是上端接上prepend set物件。
l coll 物件可用來指定一個數字串的排列方式。左上方入口用來接受index指令或是設定數列(其中數列的第一個數字代表index),也可以直接滑鼠雙擊coll物件來編寫內部所儲存的數列 (必須在get info中勾選save coll with patches才有辦法在關閉patcher之後,仍保留text檔中的數字資料)。儲存好數列之後,只要輸入index 數字,就可以讓coll由左下方輸入對應於index的數列。
1. Offset: hslider的起始值。 2. Multiplier: 每次增加一個slider range所增加的實際樹值。 3. Slider Range: 每增加1,表示增加一個multiplier的數值。但slider range為1,表示維持與offset相同的數值,不做任何增減。Slider range為2時,才做一次增加。 4. 根據以上所示,hslider的輸出的實際數值範圍最小值等於offset的值;最大值等於offset + (slider range – 1)*multiplier。 5. 使用message box 輸入size $1之變數,可用來改變slider range。 l vexpr物件與expr物件功能類似,為一不同的地方在於vexpr每個輸入口都可以接受list作為變數, 並做運算,但expr則不能接受list為變數。 l pack 與pak之不同在於pack需要左方入口處接受到訊號才會將所有入口接受到的訊息結合成list傳出。但pak則每一個入口只要受到不同訊息,都會送出list。 l bline 與line的不同之處在於bline可以做連續的ramp之設定,跟line~類似,但必須由事件的發生(而非時間的經過)來啟動之。 l 關於bitwise-and (&), bitwise-or (|) 兩物件的使用方法:bitwise-and&、&&、||、| 物件提供邏輯運算的功能。其中,bitwise-and (&), bitwise-or (|)是透過將兩個數字轉為二進位數字, 然後將兩個數字同位置的位元比較。 例如: bitwise-and (&)
12 = 23 + 22 + 0 + 0 轉為二進位數字是 1 1 0 0 6 = 0 + 22 + 21 + 0 轉為二進位數字是 0 1 1 0 根據true false的表:
故兩者比較的結果(上下都必須是1,也就是都是true,該位數才會得到1,其餘情況都輸出都是0) 所以比較12 (1 1 0 0)與6 (0 1 1 0)的結果,得到0 1 0 0, 轉換成十進位為 0 + 22+0+0。
根據以上方法可以推論以下結果: bitwise-or (|),
只有兩者都是false的情況才會得到0,故Max/MSP中的結果:
比較12 (1 1 0 0)與6 (0 1 1 0)的結果,得到1 1 1 0 為十進位的14。
在實際運用上,可在物件兩方入口處,結合另外兩個邏輯判斷的物件,例如:
左方入口數字必須大於1,且右方入口數字比需等於3時,才能讓 bitwise and物件送出1的訊息。否則輸出為0。
l 關於logical-and (&&)與logical-or (||)的運用方法,可見下表: Logical-and
兩者都必須是true,輸出才會是true (1) 例如:
左右兩邊輸入的數都為非0時,則是true。若有任何一邊為0,則輸出0。 實際運用時例如:(在此結果與&作用相同)
Logical-or
|
last update: 05.06.2007