メインコンテンツまでスキップ

既存ベース音源を KSP スクリプトでコントロールするプラグインを作った ——ハマりポイント全記録

· 約6分
Rintaro Nakahodo
NLP Researcher · Engineer · Creator

友人がフレットレスベースを弾いていて、いつか一緒にオリジナルの Kontakt 音源を作りたいという目標がある。ただ録音・サンプリングには準備が要る。まず手を動かすための一歩目として、既存のベース音源を KSP スクリプトでコントロールするプラグインを作ることから始めた。

KSP(Kontakt Script Processor)でスクリプトを書き、ポルタメント・スライドイン・ビブラートを実装するまでの話。「動く」まで思ったより長かった。ハマったポイントを全部記録しておく。


今回やったこと・目指していること

今回:既存のベース音源に KSP スクリプトを載せ、ポルタメント・スライドイン・ビブラートを自由にコントロールできるプラグインを作った。

今後:友人にフレットレスベースをマルチサンプリングしてもらい、そのデータを Kontakt に読み込んでオリジナル音源として仕上げる予定。今回作ったスクリプトはそのまま流用できる。

今回実装したスクリプトの機能:

  • ポルタメント:前の音から現在の音へグライドする(時間・レガート ON/OFF)
  • スライドイン:音が始まる前に半音数セント下(または上)からアプローチ
  • ビブラート:CC1 モジュレーションホイールで深さを上書き可能

KSP とは

KSP は NI Kontakt に内蔵されたスクリプト言語。on note / on release / on init などのコールバックに処理を書くことで、ピッチ変更・CC 反応・カスタム UI を実現できる。

スクリプトは 2 種類のスロットに入れられる:

スロット場所特徴
インストゥルメントスクリプトレンチアイコン → Script Editoron note / on release / change_tune が使える
マルチスクリプトMulti ラックの KSP スロットon note / change_tune は使えない

これを最初に知らず、マルチスクリプトに貼り付けて「なぜ動かない?」と1時間ほど悩んだ。


ハマりポイント全記録

1. 日本語コメントで syntax error on line 1

スクリプトの先頭に日本語でコメントを書いたところ、Kontakt が syntax error on line 1 を吐いて一切読み込めなくなった。

原因:KSP は UTF-8 以外の文字(または BOM 付き UTF-8)を受け付けないことがある。日本語コメントの文字コードが Kontakt のパーサーと合わなかった。

対処:コメントをすべて英語か ASCII 記号だけにする。

NG
{ ポルタメントの処理 }
on note
OK
on note

2. マルチスクリプト vs インストゥルメントスクリプト

最初にスクリプトを貼ったのは Multi ラック上の KSP スロット(マルチスクリプト)だった。ここでは change_tuneon release が使えず、貼るとエラーになる。

change_tune() cannot be used in a multi script!

対処:Kontakt でインストゥルメントを開き、レンチアイコン → Script Editor → スクリプトスロットに貼り直す。


3. ピッチ単位はミリセント ——1 半音 = 100,000

change_tune のピッチ単位はミリセント(millicents)。最初に 1,000 と書いてしまい、ポルタメントが動いているのにほとんど聞こえないという状態になった。

NG(1 半音のつもりが 100 分の 1 半音)
declare const $SEMITONE := 1000
OK
declare const $SEMITONE := 100000

1 セント = 1,000 ミリセント、1 半音 = 100 セント = 100,000 ミリセント


4. declare ui_knob の構文

KSP マニュアルの構文は declare ui_knob $name (min, max, display_ratio) で、ラベル文字列をここに書けない。

NG
declare ui_knob $knob_porta_time ("Time", 0, 2000, 1)
OK
declare ui_knob $knob_porta_time (0, 2000, 1)
set_text($knob_porta_time, "Time")

declare ui_switch / declare ui_menu も同様。宣言とテキスト設定は分ける。


5. declare polyphonic — ポリフォニック変数

on note コールバック内で宣言した変数は存在しない(KSP に declare local はない)。音ごとに独立した値を持つには on init 内で declare polyphonic $xxx と宣言する。

on init
declare polyphonic $note_num
declare polyphonic $offset
declare polyphonic $phase
{ ... }
end on

on note
$note_num := $EVENT_NOTE
{ $note_num は音ごとに独立した値 }
end on

on release%held[$EVENT_NOTE] := 0 と書くと赤くなるのも同じ理由。$EVENT_NOTEon release では参照できないので、on note$note_num := $EVENT_NOTE と保存した polyphonic 変数を使う。


6. CC 配列は %CC[]

モジュレーションホイールの値を読む際、$CC[1] ではなく %CC[1] (パーセント記号 = 整数配列)が正しい。

NG
if ($CC[1] > 0)
OK
if (%CC[1] > 0)

UI レイアウト

make_perfview を呼ぶと Performance View モードになり、move_control($var, col, row) でグリッドにコントロールを配置できる。

on init
make_perfview
set_ui_height_px(104)

declare ui_label $lbl_porta (1, 1)
set_text($lbl_porta, "PORTA")
set_control_par(get_ui_id($lbl_porta), $CONTROL_PAR_TEXT_ALIGNMENT, 1)
move_control($lbl_porta, 1, 1)

declare ui_knob $knob_porta_time (0, 2000, 1)
set_text($knob_porta_time, "Time")
set_knob_unit($knob_porta_time, $KNOB_UNIT_MS)
set_knob_defval($knob_porta_time, 150)
$knob_porta_time := 150
move_control($knob_porta_time, 1, 2)
end on

move_control($var, 0, 0) でコントロールを非表示にもできる。


背景画像

パフォーマンスビューの背景を変えるには $INST_WALLPAPER_ID を使う。

set_control_par_str($INST_WALLPAPER_ID, $CONTROL_PAR_PICTURE, "wallpaper")

画像は .nki ファイルと同階層の [インストゥルメント名] Resources/pictures/ フォルダに置く。PNG / TGA が使える。最小幅 633px、高さは 68 + set_ui_height_px で指定した値 px。

画像と同名の .txt ファイルが必要:

Has Alpha Channel: yes
Number of Animations: 0
Horizontal Animation: no
Vertical Resizable: no
Horizontal Resizable: no
Fixed Top: 0
Fixed Bottom: 0
Fixed Left: 0
Fixed Right: 0

完成したスクリプト

GitHub: NakahodoRintaro/kontakt_test

ポルタメント・スライドイン・ビブラートすべて動いている。UI は 6 つのノブと 2 つのスイッチ、セクションラベルをグリッドに並べた。


まとめ

問題原因対処
syntax error on line 1日本語コメントの文字コードコメントを ASCII のみに
change_tune が使えないマルチスクリプトに貼っていたインストゥルメントスクリプトスロットに移す
ポルタメントが聞こえないミリセントを 1,000 にしていた100,000 に修正
ui_knob が赤い宣言にラベル文字列を入れたset_text() を別で呼ぶ
on release で変数が取れない$EVENT_NOTEon release で無効declare polyphonic で保存
CC 値が読めない$CC[] ではなく %CC[]%CC[1] に修正

KSP のマニュアルは公式 PDF が一番正確。エラーが出たらまずマニュアルの構文定義と単位のページを確認するのが近道だった。

Live with a Smile!