顯示具有 6. 樂譜追隨技術 標籤的文章。 顯示所有文章
顯示具有 6. 樂譜追隨技術 標籤的文章。 顯示所有文章

2013年7月4日 星期四

Score Follower 再測試 (九) - 曲線


  • Curve 的功能是用來使數值在一系列的節點之間,以既定的取樣頻率作漸變。其基本語法如下:
<群組延遲時間> curve <選擇性的名稱> action := <接受器物件名稱> $var grain:= <粒子長度>
{
      $var
      {
            { <初始值> }
            <時間> { <數值> }
             ...
            <時間> { <數值> }
       }
}

  • 承上,在 curve 的主體中,我們為 $var 定義了節點,而數值漸變的目標則置於大括號中。進階的使用者也可以同時使用數個變數,並各自有自己的節點與數值,進行「平行漸變」。其語法如下:
<群組延遲時間> curve action:=<接收器物件名稱> $var1 $var2 ... $varN grain:=<粒子長度>
{
    $var1, $var2, ..., $varN
      {
            { ... }
            { ... }
             ...
            { ... }
       }
}


例如:


BPM 60
NOTE C4 4
curve  action:=multislider $y1 $y2 $y3 $y4 grain:=0.05s ; 粒子長度有 0.05 秒,並有四個變數。
{
$y1,$y2,$y3,$y4
{
{0 1 0.2 0.7} ; 有四個節點,各自漸變。
1.0 {0.5 0 1 0.5}
0.5 {1. 0 0.5 0.}
0.5 {0. 1. 0.3 1.}
1.0 {0. 0.5 0.1 0.6}
0.5 {0.8 1 0. 0.8}
0.5 {1. 0. 1. 0.}
}
}

NOTE C4 4

2013年7月3日 星期三

Score Follower 再測試(八)- loop

  • loop 的使用方法類似 group,唯一不同之處在於 group 區塊內的動作只會被演奏一次,但 loop 區塊內的動作則會一直循環被演出,直到該 loop 被 KILL 指令停住為止。
  • loop 中的動作需要額外的參數 loop period, 用來指定 loop 的時間。其基本語法如下:
<群組延遲時間> Loop <群組名稱>
{
  <延遲時間> <動作訊息> @name <訊息名稱>
    ...
  <延遲時間> <動作訊息> @name <訊息名稱>
}
  • 承上,群組的延遲時間、訊息的延遲時間都是選擇性的。loop 也可以接受@local、@tempo, @tight 之屬性設定。但 @tempo 與 @tight 兩者不能同時使用。
  • 數個 loop 或 group 可以一起執行,彼此各自獨立,如此可以用簡易的語法建構複雜的複節奏。
  • loop  內的動作訊息名稱,主要是用來停止該 loop 動作之用。停止該動作的指令之語法如下:
KILL <延遲時間> OF < loop 群組名稱>


  • 任何的 group 或 loop 之內可以再包含其他的 group 或 loop,層次的數目不受限制,子層級的 group 或 loop 具有「繼承」父層級的特性,但 group 或 loop 的名稱無法繼承、執行的壽命長度也無法繼承,但速度是被繼承的。此種巢狀的結構已屬複雜,若音樂的結構並無階層式、複節奏、同時性的結構,則無須特意使用之。

2013年7月2日 星期二

Score Follower 再測試(七)- 群組

關於 antescofo~ 之電子樂譜紀錄方式之 Group 用法如下:
  • group 是用來執行一系列群組化的動作。語法為: group <群組名稱>{<訊息>....<訊息>} 
  • group 中的每一個訊息可有自己的延遲時間。當前面的事件起點到達時,該事件所夾帶的 group 便會立即啟動,使其內部的訊息在依照延遲時間之設定依序執行。
  • 同一個音樂事件可以同時觸發數個同時性的 group 時,  每一個 group 內的訊息各自按照各自設定的延長時間來進行,group 本身亦可在其前面加上整個 group 的延遲時間或速度標示,使得每一個 group 之間按照累計的延遲時間進行之外,每一個 group 自身可各自按照不同速度來進行。(例如:2.0 group  group1 @tempo 100 ; 表示名為 group1的 group 延遲兩拍才進行,且 group 內部的動作都是以 tempo =100 的設定下,來計算每個設有延遲的訊息該延遲多長。)
  • 在預設情況下,group 內部訊息動作的延遲時間之運作,會依照 tempo 屬性所設定的速度來決定,但 group 也可以使用 @tight 的屬性,讓 group 依循當前 antescofo~ 所偵測到的樂器演奏的速度來決定 group 內部的延遲時間如何計算。
  • group 的 @tight 與 @tempo 屬性,兩者不相容,僅能擇一使用。@tempo 模式下,所設定的動作較不易與演奏者的同步,但卻可確保所設定的動作順暢執行。@tight 模式下,所設定的動作較能夠與演奏者同步,但卻可能造成這些動作的出現不夠順暢。
  • 在 group 內部的訊息沒有設定任何的延遲時間時,則 @tight 便完全沒有作用,因為 @tight 只影響 group 內部動作的延遲時間,並不會影響 group 之外的動作之延遲時間。
  • @local 屬性的設置,可以讓一個被樂譜追隨器忽略的事件所夾帶的動作,一併被略去。預設情況下,若一個事件被樂譜追隨器所忽略,其所夾帶的動作指令仍會被執行。(@local 屬性只能加在事件上,不可以加在動作上。)
  • KILL <延遲時間> <群組名稱> 可以讓 KILL 在通過時,停止某個 group 所正在進行中的動作。 

2013年6月29日 星期六

Score Follower 再測試 (六)- 動作

antescofo~ 的「動作」使用方法:
  • 動作指令是接在樂譜中的音樂事件之後,隨著該音樂事件出現時,同時觸發動作。但也可以在動作指令之前加上時間數值,可以依照相對速度的方式(有幾拍)來指定該動作的延遲出現之時間,也可以使用絕對的速度(例如:30ms 或 1s)來指定該動作要延遲多久才被觸發。
  • 一個事件之後,也可以接數個動作,中間以逗號分隔。若數個動作的觸發時間點需不同,則可以在動作指令前加上絕對時間值,設定一個動作與前一個動作之間的實際時間間隔具力。也可以使用相對時間值,記載該動作在音樂事件發生之後,與該音樂事件距離有幾拍。
  • 一個事件之後的動作,一旦在事件開始之後,便無法被延後。若數個動作指令下在同一個事件上,則這些動作必須按照順序出現,而不可能有後面的動作比前面的動作早出現的情形發生,除非這些動作是依附在不同的事件之後,才有可能使先寫的動作比後寫的動作晚觸發。。
  • 一般而言,動作的長度不應超過其所依附事件之長度。

2013年6月28日 星期五

Score Follower 再測試 (五)- 資料輸出、輸入

輸出:

Antescofo~ 樂譜追隨物件預設有四個,由左至右分別說明如下
  1. 出口一:在樂譜追隨的過程中,主要的輸出口會送出最近一個事件的編號。此外,其也同時會送出 cue 及 calibration 的訊息(可使用 route 將此訊息解出)。
  2. 出口二:送出最後偵測到的或演奏的速度,以 BPM 表示。
  3. 出口三:送出電子樂譜中最近一個 label,以 symbol 訊息開始。(可用 route 將此訊息解出)
  4. 出口四 (由 notenum 指定):最近偵測到的MIDI音高數值。

其餘額外的輸出口,可由 <@屬性> 的方式去指定是否出現,各種屬性說明如下: 
  • 出口五(由 beatnum 叫出):最近一個事件所在的時間位置。
  • 出口六(由 anteIOI 叫出):送出當前事件相對於當前速度之 inter-onset-interval 之預期的長度。
  • 出口七(由 certainty 叫出):以 0~1 之間的數表示目前最後一個偵測到的事件之肯定度。
  • 出口八(由 scoretempo 叫出):送出樂譜中所原先定義的速度 BPM
  • 出口九(由 endbang 叫出):當樂譜走完時送出 bang
  • 出口十(由 velocity 叫出):送出 MIDI 力度數值,其數值是來自偵測每個音頭的強度而得。
  • 出口十一(由 TDist 叫出):回報目前至下一個動作之前,還剩下幾個事件未通過。
  • 出口十二:為最右方的出口,當一個樂譜被成功讀取時,則送出 bang。 
輸入:
antescofo~ 的輸入除了可以是聲音訊號,藉以分析其音高之外,也可以是 MIDI 或頻率數值。預設值為使用聲音訊號作為輸入,若要改變能接受的輸入資料,則需使用 @inlet <屬性> 。'kl' 為預設的聲音訊號輸入, 'hz' 為頻率輸入,'MIDI' 則為 MIDI 的音高、力度之輸入。

2013年6月27日 星期四

Score Follower 再測試 (四)- 關於複音之紀錄 & 相關設定

Antescofo~ 關於複音之紀錄
  • 電子樂譜紀錄複音時,是將所有聲部合併為和弦或單音。
  • 較複雜的音型可以只記起音或起始和弦,其餘複雜的部分可使用 TRILL 表示之。
Antescofo~ 基本設定:
  1. signal-to-noise ratio 必須盡可能的高,需盡可能在無 echo 及 reverb 的環境中,聲音需沒有 distortion (扭曲)。==> 其通則是使用近距離的麥克風,並盡可能將前置擴大器調到合理的大聲,卻不至於破掉。
  2. 使用 calibrate 1 的訊息,使 antescofo~ 送出開頭為 calibration 的兩個數值(參考 tutorial 08)。就第一個數值而言,若接收樂器聲音時,此數值需在 0.75 以上。沒接收樂器聲音時,此數值應小於 0.5。若不能在正確的數值範圍內,則需從收音源頭去調整。
  3. calibration 的第二個輸出的數值是用來調整音準之用,樂器需演奏 A4,若音高準確時,此數值會接近 0.5,若否,則 antescofo~ 必須在調整設定或樂器本身必須調音。
  4. 訊息 pedal 1 可以用來使 antescofo~ 集中在對新出現的音之偵測,而減少被拉長的音之影響,預設的 pedaltime 為 500,使系統將最近 500 ms 的音訊資料移除殘響的影響。但此種模式下,會耗費較多 CPU 資源。
  5. tune 引數需與樂器 A4 的音高頻率一致,預設的 tune 引數為 440,但使用者也可以自行更動,來配合樂器本身的調音。

2013年6月26日 星期三

Score Follower 再測試 (三) - 樂譜描述之關鍵語法

Antescofo~ 之電子樂譜關鍵語法:
  • BPM <速度> 或 BPM <速度> @modulate 使用方法:BPM 表示速度的改變,若加上 @modulate  之屬性設定,則系統會根據新的、舊的速度數值,計算出 tempo modulation 之下的速度,例如原本的速度。例如原本速度設定為每分鐘 60 個四分音符 (BPM 60),新的速度設定為 BPM 120 @modulate,則新的速度會採用偵測到的原本速度之兩倍速度進行。若原本偵測到的速度為 56,則實際的新速度會是 56*2。此種功能適合使用在當速度需求是非絕對之時,或有 tempo modulation 需求時。
  • VARIANCE <數值>  使用方法:VARIANCE 用來設定聲音偵測模組的精確度,其最大範圍為 0-1,預設精確度為 0.3,讓略為走音的音高可以被視為原本的音高。
  • TEMPO ON, TEMPO OFF 用法:TEMPO ON 開啟速度偵測功能,TEMPO OFF 關閉速度偵測功能,常用於延長記號上。  

2013年6月25日 星期二

Score Follower 再測試 (二)- 樂譜描述之關鍵語法

IRCAM 的樂譜追隨技術物件 antescofo~ 之文字樂譜範例如下:


註解:

BPM 60  ==> 速度
NOTE a4 1 ==> a4 音高,長度為一拍
NOTE g4 0.5 @hook ==> g4 必須被電腦聽到,樂譜追隨才會繼續下去
NOTE f4 0.5
NOTE e4 2

  • 每個事件必須寫在一行,並按照時間順序排列各行。
  • 大寫字母為樂譜的描述詞,其必須置於一行的開頭。樂譜描述詞之後,則接上引數。
  • 指令可以有不同的屬性,但其前必須接上 @ 之符號,藉此選擇性地指定某些細節特性,其用法類似 max 的物件,但差別在於 antescofo~  之屬性無須接引。
  • 各行分號之後的數被視為註解,'/*' 與 '*/' 之間的文字也被視為註解。


NOTE <音高> <音長> <標籤> 使用方法:

音高(pitch)標示法:
  • C4 = middle C = MIDI note 60; d#3 = D sharp below middle C = MIDI note 51; Bb4 = B flat above middle C = MIDI note 70
  • MIDI 音符之微分音標示法:60 = middle C, 54.5 = E plus one quarter-tone below middle C
  • MIDI cents 標示法:6000 = middle C; 6600 = F sharp / G flat above middle C; 5450 = E plus one quarter-tone below middle C
音長(duration)標示法:1 為四分音符,2 為二分音符,0.125 為三十二分音符。0.333, 0.333, 0.334 為三連音的概數。三連音也可用分數表示為 1/3, 1/3, 1/3

標籤(label) 用法: label 為一個單獨的字所構成,中間沒有空格,是用來作為單一事件的符號。每一個 label 必須是電子樂譜中獨特的。label 並非一定要有,單一事件可以有一個 Label 或沒有 label。當到達 label 事件時,該 label 則從 antescofo~ 第三個出口被以符號的方式送出。若欲將數字的 label 轉換成 max 的整數或小物,則可使用 fromsymbol 物件。label 又可以用來在電子樂譜當中移動,透過 nextlabel, previouslabel, jumptolabel 之訊息來達成。一份電子樂譜中的所有 label 可以使用 getcues 的指令,讓其透過 receive 物件,被一個命名為 named-antescofo-labels 的物件所接收。

@hook 用法: hook 屬性可以被分配給 NOTE, CHORD, TRILL, MULTI, 用來指定一個既定的事件在任何情況下都不可以被跳過 (原先 antescofo~ 跳過錯誤的演奏之機制則暫時被停用,直到設定 @hook 的音被聽到為止。

Chord (<音高>....<音高> ) <音長> <標籤> 使用方法: 括號中用來紀錄和弦中的音高。其他用法與 Note 相同。

TRILL (<音高群>....<音高群> ) <音長> <標籤> 使用方法: 括號中用來指示某個單音或複音事件是由數個音高或音高群以不確定的出現順序所組成。其可用來代表 trill, tremolo, 以及一段有固定長度的即興片段(該片段在固定的時間長度中,可以特定的音高作即興,這些特定的音高可以出現很多次,也可以從未出現)。管樂的複音吹奏也可以使用 TRILL 來表示,因為若以 CHORD 來表示,則常常太不穩定。

MULTI (<音高群或音高> -> <音高群或音高> ) <音長> <標籤> 使用方法MULTI 與 TRILL 用法相近,但 MUTLI 的音高排列順序是有被定義的,主要是用來代表 glissando 的事件。

EVENT <音長> <標籤> 使用方法:EVENT 指令跟樂譜追隨無關,只是用來產生描述性的訊息。


2013年6月23日 星期日

Score Follower 再測試 (一)- 轉檔、與製譜軟體之合併使用初探

隔了很多年沒有再嘗試使用 score follower 來輔助互動音樂的演出,過了這麼多年,IRCAM 的技術也應該有所進步了吧。至目前為止,最新的樂譜追隨技術 Antecofo~ 已經有較為完整的功能與教學檔案,剛好最近忙著兩首互動音樂作品的演出,因此順便測試一下目前樂譜追隨的功能是否已經完備。

首先我將 Finale 的樂譜檔案轉成 XML 格式,然後使用 NoteAbility Pro 來讀取,再透過 NoteAbility 將之存成 (File / Save to) Antescofo 格式,至 Max/MSP 中,由 antescofo~ 來讀取,以 text 檔案開啟 Antescofo 的文字譜,可以看到清楚的小節數,並且每個音或和弦都被以事件來計算,得到一個事件編號。我使用演奏家演奏的 marimba 聲音檔案來對應樂譜,發現 trill 或快速重複的音型,則有時候在辨識時會被當作單一事件。此外,礙於此聲音檔案錄製時,有一些效果器的聲音又被麥克風收進去,所以也造成了些許不精確,但大致上 antescofo~ 還是有繼續將所辨識的事件向前推移,直到接近曲子尾端,變成複音的演奏,且音量較小時,終於 antescofo~ 不再往前推移事件。

除此之外,我另外測試了 NoteAbility 與 Antescofo~ 的連結,過程需透過 netsend 將 max 的偵測結果回送給 NoteAbility ,為了接收來自 max 的訊息,NoteAbility 的 Tool / Network Port Panel 選單中必須選正確的 incoming port 來對應 max 中傳送訊息所透過的 port,如此當 max 中下達 connect 指令時,才能正確連結兩者。目前得知 antescofo~ 需送 position, tempo, beat 的資訊到 NoteAbility 中以達成更精確的同步,另外也得知 NoteAbility 中可以直接寫入 max 訊息,以便於直接存成帶有 max 指令的 antescofo~ 文字樂譜檔。(待續)