You are on page 1of 26

PART1

在這一系列課程中,我們將會鑽研Kontakt 的語法,如果你從來沒有試過這種語法,別擔心,
我們將會從最初頭開始,希望可以用Kontakt 裡的特性給你一些簡單又很酷的東西。

這個教程我們會使用Kontakt 5,但這些範例在Kontakt 4 上也可以執行。

什麼是Kontakt語法
Kontakt語法英文叫KSP (Kontakt Script Processor),是Kontakt 裡的強大功能,它可以讓使用
者及開發者透過程式語言操作內部的參數來製作自己的客製化音色。

每一個你買的Kontakt 的音色或是第三方的音色庫都有語法在裡面,從使用者介面到進階的圓
滑奏功能,語法的功能讓Kontakt 成了世界最強大的取樣器之一。

這個語法本身跟大多的語法相似,像是Java語言、動態語法、PHP等等,也有許多大家熟悉
的特性例如變數、陣列、函數、條件句,如果你有撰寫其他語法的經驗,你會發現這套語法很
好上手。

這套語法裡有很多專屬的參數名稱,你們可以在你的Kontakt 資料路徑裡找到KSP Reference


Manual來參考,如果你要替換教材裡的名詞成為你自己要改的參數名稱,這個手冊會非常好
用,不過如果你是語法的初學者,那這本冊子可能會有一點令你害怕。

在以下的教程中,我們先設定大家對程式語言完全不懂,希望到教程最後你們可以做出大家都
想要做的一些基本效果,包括:

.建立一個自製的介面
.連結UI元件到參數
.用琴鍵去觸發效果器
.建立自製的底圖

語法編輯器
語法編輯器 (Script Editor)是所有魔法發生的地方,把左上方的扳手點開,找到右邊的Script
Editor 標簽,再把左方的Edit按鈕點下,就是我們寫語法的地方了。
你會發現有五個欄位可以讓你撰寫,這可以對應到之後介面上的五個視窗標簽,你也可以把自
己寫好的語法存成樣本,甚至可以去其他音色包裡複製別人的語法。

回呼 (Callbacks)
簡單說就是一段語法的起頭和結尾,這裡有一些不同形式的起頭字和結尾字,你可以在KSP
Manual 的Callbacks 章節裡找到,但全部的語法都是結束在”end on”上,以下我列舉幾個很常
用的。

on init...end on
這是最基本的Callback,在你載入或初始音色的時候Kontakt會執行on init 和end on 中間的語
法指令,這也是通常我們創建元件、變數、陣列和給他們指令的地方。

我們來試一下基本的語法,在on init 和end on 之間我們打上message (“Hello!”) 然後按下右邊


的Apply按鈕。當你按下按鈕後,下方的狀態欄 (Status)會顯示Script uploaded (no errors),
同時整個視窗的左下方會顯示出「Hello!」。
另一個範例是,為你的視窗標簽命名:set_script_title (),你命名的名稱會在之後的使用者介
面顯示,我們先打上set_script_title (“First Script”) 然後按下Apply按鈕。

on note...end on
這種回呼,是作用在MIDI琴鍵上的訊息,當你按下琴鍵的時候這個回呼裡的語法就會被執行
,你可以利用「條件句」來決定你要對影的是一個鍵或是多個鍵,我們待會會再多說明「條件
句」,現在先來個簡單的。

我在裡面寫下:message (“you are playing a note”)

當你按下隨意一個鍵時,總視窗左下角會出現you are playing a note的字樣。

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

當你彈的不是C3的時候,就會顯示try again bozo!(再試一次,白癡!)


但如果我們要很多個鍵都是不同的效果呢?難道要一個一個打if嗎?不,這時候我們會比較常
用「選擇」,語法這樣寫:select()

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

這個結果其實會完全等於我們剛剛寫的「如果」句,但你可以把它寫成這樣,就多了很多其他
琴鍵:
你甚至可以選擇一個範圍

然後,別忘了我們要加上一段你「放開琴鍵」的語法 (on release...end on),所以當你放開的


時候他就會這樣顯示:
加入效果器
我們在下方 InsertEffect 欄位中加入Distortion, Lo-Fi, Phaser,然後我都先bypass 他們

對應到效果
每個能調整的物件都可以對應到KSP裡的語法,其中這裡有一個名字叫set_engine_par(),它
可以操控kontakt引擎裡的參數,我們之後會常常用到,我們可以在括弧裡去指定他的路徑,
也就是對應的參數位置。

set_engine_par(<parameter>,<value>,<group>,<slot>,<generic>)

<parameter>: 我們要設定的參數叫做bypass,寫成語法叫做:$ENGINE_PAR_EFFECT_BYPASS
<value>: 0就是打開功能,1就是關閉功能,我們希望bypass功能被打開,所以寫0

<group>: insert effect的列位屬於 -1 (上一階是 0,下一階是 -2,以此類推)

<slot>: 我們的distortion屬於第一格,要打0,第二格是1,第三格是2以此類推

<generic>: 看你的效果是插入的(insert)=1,還是送的(send)=0,我們是插入的所以寫1

所以這句語法寫完是:

set_engine_par( $ENGINE_PAR_EFFECT_BYPASS, 0, -1, 0, 1 )

整個語法是這樣:

那當你彈 C3 的時候,這個效果 (Distortion) 就會被打開。

不要忘了很重要的,當你放開琴鍵時,效果要重新被關閉,也就是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

declare ui_knob $myKnob(0,100,1)

括號裡的數字分別是:最大值、最小值、最小單位(你也可以自己更改數值)

你的舞台視窗將會長這樣

我們再來幫它建立一個標簽

declare ui_label $myLabel (2, 1)

括號裡表示他的長與高:兩欄長、一列高(你也可以自己設定)
我們試著用語法移動這些原件的位置

move_control (變數名稱, X坐標, Y坐標)

所以我們試著移動 $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時他會運行這段回呼中的語法

我們用第二章學過的 set_engine_par( 變數名稱 ,值 ,位層 ,槽格 ,屬性 )


set_engine_par($ENGINE_PAR_CUTOFF, $myControl, 0, 0,-1)
屬性方面,因為不是0(insert)也不是1(send)所以這邊用-1
現在當我們用滑鼠推選扭時,他會和底下的參數一起改變

設定顯示資訊
接著你會發現,舞台視窗裡的Cutoff數值雖然在改變,但他數值是1-1000000,和底下的
參數並不一致,我們可以用set_knob_label() 和 來解決。
我們先把它拆開
set_knob_label( , )

如你所見括弧裡有兩部分,前半部放名字$myControl
後半部放要對應的變數位置get_engine_par_disp()

得到: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)

以上課程,完畢!

You might also like