Professional Documents
Culture Documents
在這一系列課程中,我們將會鑽研Kontakt 的語法,如果你從來沒有試過這種語法,別擔心,
我們將會從最初頭開始,希望可以用Kontakt 裡的特性給你一些簡單又很酷的東西。
什麼是Kontakt語法
Kontakt語法英文叫KSP (Kontakt Script Processor),是Kontakt 裡的強大功能,它可以讓使用
者及開發者透過程式語言操作內部的參數來製作自己的客製化音色。
每一個你買的Kontakt 的音色或是第三方的音色庫都有語法在裡面,從使用者介面到進階的圓
滑奏功能,語法的功能讓Kontakt 成了世界最強大的取樣器之一。
這個語法本身跟大多的語法相似,像是Java語言、動態語法、PHP等等,也有許多大家熟悉
的特性例如變數、陣列、函數、條件句,如果你有撰寫其他語法的經驗,你會發現這套語法很
好上手。
在以下的教程中,我們先設定大家對程式語言完全不懂,希望到教程最後你們可以做出大家都
想要做的一些基本效果,包括:
.建立一個自製的介面
.連結UI元件到參數
.用琴鍵去觸發效果器
.建立自製的底圖
語法編輯器
語法編輯器 (Script Editor)是所有魔法發生的地方,把左上方的扳手點開,找到右邊的Script
Editor 標簽,再把左方的Edit按鈕點下,就是我們寫語法的地方了。
你會發現有五個欄位可以讓你撰寫,這可以對應到之後介面上的五個視窗標簽,你也可以把自
己寫好的語法存成樣本,甚至可以去其他音色包裡複製別人的語法。
回呼 (Callbacks)
簡單說就是一段語法的起頭和結尾,這裡有一些不同形式的起頭字和結尾字,你可以在KSP
Manual 的Callbacks 章節裡找到,但全部的語法都是結束在”end on”上,以下我列舉幾個很常
用的。
on init...end on
這是最基本的Callback,在你載入或初始音色的時候Kontakt會執行on init 和end on 中間的語
法指令,這也是通常我們創建元件、變數、陣列和給他們指令的地方。
on note...end on
這種回呼,是作用在MIDI琴鍵上的訊息,當你按下琴鍵的時候這個回呼裡的語法就會被執行
,你可以利用「條件句」來決定你要對影的是一個鍵或是多個鍵,我們待會會再多說明「條件
句」,現在先來個簡單的。
on release
如果我只想在我按著琴鍵的時候發生指令,我可以利用on release...end on 讓我放開琴鍵時結
束原本的指令,所以我在下方多打一個on release 和 end on 並在中間打上message (“now
you are not!”)
當你按下琴鍵時你會看到原先的句子,而放開時你會看到新的句子
你可以自己試試這些例子,現在你已經知道這套語法的基本運作了,下堂課程我們會將這些基
礎做延伸,加入一些變數(variables),然後讓你的琴鍵可以觸發效果器語法。
PART2
你們可能都用過Damage或是Evolve的音色,他們有一個很酷的功能就是可以用琴鍵來觸發效
果,像是破音或是殘響等等,我們將用幾個簡單的語法來達成類似的效果。
我們的計劃是這樣,設定幾個效果器把它們都忽略(bypass),然後設定一個bypass的功能參數
,當你按下琴鍵的時候參數會被觸擊,讓效果器生效,而你放開琴鍵的時候效果就會回到
bypass的狀態。
敘述(Statement)
「敘述」可以讓Kontakt 知道當你做了什麼事時,他應該怎麼反應,條件敘述(if...else) 是每個
語法系統裡都有的規則,它可以讓你的語法只在特定的條件下被執行,我們用上次的語法進一
步作範例。
on note
message (“you are playing a note”)
end on
這字樣會顯示於你隨意彈奏一個鍵時,如果我們要讓他只在你彈奏C3的時候顯示,條件敘述
就派上用場了。
如果(if)
我們用「如果」來思考一下:「如果」某件事等於什麼的話,就執行某個效果。琴鍵在KSP語
法裡面有一個特定的字:$EVENT_NOTE,第60個鍵就是C3,所以我們的語法這樣寫:
on note
if ($EVENT_NOTE = 60)
message (“you are playing C3”)
end if
end on
如果你不是彈C3就不會出現字樣,但當你按下C3時字樣就會出現。
if...else
有關於你條件以外的部分我們用else來指定,翻譯成「否則」可能比較好理解,把它比喻為一
個夜店的門衛,就像:
if 如果,這個人是小鮮肉
讓他進來!
else 否則
叫他出去!
end if
好的,以上當玩笑看看就好XD但整個概念就是這樣,讓我們試試看
on note
if ($EVENT_NOTE = 60)
message (“you are playing C3”)
else
Message (“try again bozo!”)
end if
end on
Select
「選擇」就像一個比較靈活的「如果...否則」,在這裡 if 就變成了 case,我把它翻做「剛
好」,所以看起來像這樣:
on note
選擇(琴鍵)
剛好 60
訊息(你在彈60)
結束選擇
end on
實際長這樣:
on note
select($EVENT_NOTE)
case 60
message (“you are playing C3”)
end select
end on
這個結果其實會完全等於我們剛剛寫的「如果」句,但你可以把它寫成這樣,就多了很多其他
琴鍵:
你甚至可以選擇一個範圍
對應到效果
每個能調整的物件都可以對應到KSP裡的語法,其中這裡有一個名字叫set_engine_par(),它
可以操控kontakt引擎裡的參數,我們之後會常常用到,我們可以在括弧裡去指定他的路徑,
也就是對應的參數位置。
set_engine_par(<parameter>,<value>,<group>,<slot>,<generic>)
<parameter>: 我們要設定的參數叫做bypass,寫成語法叫做:$ENGINE_PAR_EFFECT_BYPASS
<value>: 0就是打開功能,1就是關閉功能,我們希望bypass功能被打開,所以寫0
<slot>: 我們的distortion屬於第一格,要打0,第二格是1,第三格是2以此類推
<generic>: 看你的效果是插入的(insert)=1,還是送的(send)=0,我們是插入的所以寫1
所以這句語法寫完是:
整個語法是這樣:
不要忘了很重要的,當你放開琴鍵時,效果要重新被關閉,也就是bypass,所以要再設一段
語法 (on release...end on),並在<value>那個位置打上1
不同的琴鍵,要去觸發不同的格子<slot>,所以slot那一欄,分別打上0, 1, 2
接著你可以用上一次學的語法幫你的視窗命名,然後把它存成樣本模組
成功!下一章,我們要來認識變數
PART3
上一章我們用琴鍵來操控變數:$ENGINE_PAR_EFFECT_BYPASS,這是一個變數的基本栗
子,接下來我們要進行更深入探討,除了內建的變數,還有自定的變數。
什麼是變數(Variable)
變數是語法裡最重要的是之一,雖然它可能有點複雜,但我們很難在不詳細解說它的情況下進
行之後的課程,請大家撐下去~
變數是一個資訊載體,任何你想操控的物件,都可以用「指定變數名稱」來下指令。它可以裝
載一個衡數(constant)像是名字、數字,他也可以裝載動態事件,像是變動的數值或參數。
大致上我們可以分成「內建變數」和「自訂變數」兩類。
內建變數
在KSP語法裡,有很多的變數已經寫在他的語言裡了,舉Lo-Fi效果來說,它裡面的四種參數
,你就可以用這些變數來對應它們:
$ENGINE_PAR_BIT
$ENGINE_PAR_FREQUENCY
$ENGINE_PAR_NOISELEVEL
$ENGINE_PAR_NOISECOLOR
你會注意到他們都擁有特定的字頭:$ENGINE_PAR_,這是KSP語言裡專屬的字頭,當你要
創建自己的變數時,你必須明確地分辨並好好的使用這些字頭。
當中也有些不是效果類的,而是使用者動作類的,例如之前看過的:$EVENT_NOTE。種類
太多這邊不一一舉例,不過你們都可以在KSP Reference Manual裡找到所有的衡數變數。
我們現在舉一個內建變數的例子:$PLAYED_VOICES_INST,他代表你正彈了多少發聲數的
值,如果我們把它寫進語法,你彈多少鍵他就會顯示多少數字。
你會發現這個變數會從0開始數,語法中的符號&&之間讓我可以顯示變數運算的結果。以上
,我們已經學了怎麼用內建變數來集結運算資料。
自訂變數
由於kontakt本身並不認識你自訂的變數,所以首先你要做的就是聲明(declare)他,你必須先
在on init...end on之間聲明你的自訂變數。讓我們來試試先做個命名
聲明$我的變數
declare $myVariable
好,但現在$我的變數:是空的,所以我們給他一個值
$myVariable :=2
注意這邊用「:=」來表示等於
加上其他語法,你可以在視窗裡這樣輸入:
然後得到這樣的字樣
你的數字只會停在2,那是因為我們聲明他等於2
接下來你可以這樣樣設定:
$myVariable := $PLAYED_VOICES_INST + 1
但是在英文文法裡,play 1 notes,多了一個s
所以我們用if...else來排除他
只有大於1的時候會出現複數
以上,是一個很無趣的栗子,但我只是盡了翻譯的責任XD
PART4
這一章我們要來學怎麼做一個自製的使用者介面,好的使用者介面會讓使用者感到很直覺,你
也可以在上面進行有質感的藝術創作,你買的每一個音色包都有自己獨特的介面設計,而這些
都跟後台語法息息相關。
創建舞台視窗
你需要在on init...end on裡打上:make_perfview,你也會需要輸入「高度」,你可以用線格
(grid)或是像素(pixeis)
使用Grid
這裡你一共可以擁有6欄16列,下圖你可以看到他們的坐標
設定高度你要用這個指令:set_ui_height(),我們是是在括弧裡輸入4,你會得到4列的高度
當你按下左上扳手,你的介面也會變成四列高
使用Pixels
你可以用:set_ui_height_px() 來下指令,這在你有自製的底圖時很好用,你可以配合你的底
圖像素來輸入數值,kontakt像素的分佈如下
如果你輸入set_ui_height_px(250)
代表你的工作區有250px
其他的聲明
在KSP的UI設定中,語法的字頭都是ui_
ui_knob - 旋鈕
ui_slider - 預設的水平滑扭
ui_label - 文字標簽
ui_button - 按鈕
ui_menu - 下拉式選單
ui_switch - 開關
ui_table - 給琶音器或是序列器的表格
ui_level_meter - 表頭
ui_waveform - 波形
定義參數
首先你要給你的UI控制原件一個變數名稱,我們先創建一個預設的旋鈕並叫他$myKnob
括號裡的數字分別是:最大值、最小值、最小單位(你也可以自己更改數值)
你的舞台視窗將會長這樣
我們再來幫它建立一個標簽
括號裡表示他的長與高:兩欄長、一列高(你也可以自己設定)
我們試著用語法移動這些原件的位置
所以我們試著移動 $myKnob(變數名稱)
打上 move_control ($myKnob, 1, 2)
結果為這樣
命名你的控制元件
使用 set_text( 變數名稱, “字樣”),詳細如圖
成果
下一章,我們會實際操作控制元件,這也是整個語法開始變得有趣的關鍵!
PART5
第二章我們用MIDI鍵盤讓效果器產生作用,這一張我們會用旋鈕來製造類似的效果,我們
會用到幾個變數:set_engine_par(),get_engine_par(),get_engine_par_display()
我們先建立一個旋鈕$myControl,用set_text()命名為”Cutoff,設立最大值最小值,還有移
動坐標位置
連結控制元件
我們在group effect 的那一層載入filter / low pass / legacy LP4
然後我們在剛剛的語法下方繼續建立一個回呼:on ui_control($myControl)...end on
這代表你操控$myControl時他會運行這段回呼中的語法
設定顯示資訊
接著你會發現,舞台視窗裡的Cutoff數值雖然在改變,但他數值是1-1000000,和底下的
參數並不一致,我們可以用set_knob_label() 和 來解決。
我們先把它拆開
set_knob_label( , )
如你所見括弧裡有兩部分,前半部放名字$myControl
後半部放要對應的變數位置get_engine_par_disp()
而後半塊又要在填入cutoff的變數位置$ENGINE_PAR_CUTOFF,0 ,0 ,-1
得到:
set_knob_label($myControl,get_engine_par_disp($ENGINE_PAR_CUTOFF,0 ,0 ,-1) )
最後的圖像這樣
可以看到上下旋鈕的數值已經是一樣的了
OK,已經很不錯了,但還是有個問提,當我重新Apply他們時,我並不希望他歸零
首先,我去on ui_control的回呼裡,複製set_knob_label那串語法到om init的回呼裡
現在我可以看到他數值不變了,可是旋鈕一樣會歸零
我們再加上make_persistent($myControl)
最後一個步驟我們要讓數值的單位正確顯示出來,我們用set_knob_unit( , )
前半部是名字,後半部是單位,如下
set_knob_unit($myControl, $KNOB_UNIT_HZ)
以上課程,完畢!