KSPリファレンスマニュアル 3 - 変数(Variables)

KSPリファレンスマニュアル 3 - 変数(Variables)


一般情報

  • ユーザー定義変数はすべてon initコールバックの中で宣言する必要があります。

  • 変数名に使用できるのは英数字(0-9a-zA-Z)とアンダースコア(_)だけです。

  • 次の接頭辞が付いた変数は作成しないでください。これらは内部の変数および定数のために使用されています。

    • $NI_

    • $CONTROL_PAR_

    • $EVENT_PAR_

    • $ENGINE_PAR_

    • $ZONE_PAR_

    • $LOOP_PAR_


$ (integer variable)

declare $<variable-name>

単一の32ビット符号付き整数値を格納するユーザー定義変数を宣言します。

補足

  • 整数変数に格納できる有効な数値は -2147483648 ... 2147483647 の範囲です。

on init
    declare $test
    $test := -1
end on

変数を作成します。

on init
    declare $test := -1
end on

上と同様に変数を作成しますが、宣言と同じ行で値を初期化しています。

関連項目

on init

make_persistent()

read_persistent_var()

real()

int()


% (integer array)

declare %<variable-name>[<num-of-elements>]

複数の32ビット符号付き整数値を指定したインデックスに格納するユーザー定義配列を宣言します。

補足

  • 配列の最大サイズは 1000000 インデックスです。

  • 要素数は定数値で定義する必要があります。この目的に変数を使用することはできません。

  • 配列を1つの値で初期化することもできます。下の2番目の例を参照してください。

  • 複数の値で配列を初期化する場合に、初期化子の数が配列サイズより少ないときは、最後の初期化子が配列の残りの部分の初期化に使用されます。

  • 整数配列に格納できる有効な数値は -2147483648 ... 2147483647 の範囲です。

on init
    declare %presets[10 * 8] := ( ...
    {  1 }  8, 8, 8, 0,  0, 0, 0, 0, ...
    {  2 }  8, 8, 8, 8,  0, 0, 0, 0, ...
    {  3 }  8, 8, 8, 8,  8, 8, 8, 8, ...
    {  4 }  0, 0, 5, 3,  2, 0, 0, 0, ...
    {  5 }  0, 0, 4, 4,  3, 2, 0, 0, ...
    {  6 }  0, 0, 8, 7,  4, 0, 0, 0, ...
    {  7 }  0, 0, 4, 5,  4, 4, 2, 2, ...
    {  8 }  0, 0, 5, 4,  0, 3, 0, 0, ...
    {  9 }  0, 0, 4, 6,  7, 5, 3, 0, ...
    { 10 }  0, 0, 5, 6,  4, 4, 3, 2  )
end on

プリセットデータを格納するための配列を作成します。

on init
    declare %presets[10 * 8] := (4)
end on

同じ配列を特定の値で手早く初期化する方法です。

関連項目

配列コマンド

グループコマンド

make_persistent()


~ (real variable)

declare ~<variable-name>

単一の64ビット(倍精度)実数値を格納するユーザー定義変数を宣言します。

補足

  • 実数は、整数であっても必ず小数点を付けて定義する必要があります。たとえば 2 ではなく 2.0 と書きます。

  • 小数部の数字は省略できます。たとえば 2. は有効で、2.0 と同じ意味になります。

  • 指数表記もサポートされています。たとえば 1.25e5 や 2.76e-3 です。e は小文字でも大文字でもかまいません。

on init
    declare ~test
    ~test := 0.5
end on

変数を作成します。

on init
    declare ~test := 0.5
end on

上と同様に変数を作成しますが、宣言と同じ行で値を初期化しています。

関連項目

on init

make_persistent()

read_persistent_var()

real()

int()


? (real array)

declare ?<variable-name>[<num-of-elements>]

複数の64ビット(倍精度)実数値を指定したインデックスに格納するユーザー定義配列を宣言します。

補足

  • 配列の最大サイズは 1000000 インデックスです。

  • 要素数は定数の整数値で定義する必要があります。この目的に通常の変数を使用することはできません。

  • 配列を1つの値で初期化することもできます。下の2番目の例を参照してください。

  • 複数の値で配列を初期化する場合に、初期化子の数が配列サイズより少ないときは、最後の初期化子が配列の残りの部分の初期化に使用されます。

  • array_equal()コマンドとsearch()コマンドは実数配列では動作しません。

on init
    declare ?presets[5 * 4] := ( ...
    { 1 }   1.0, 1.0, 1.0, 1.0, ...
    { 2 }   0.5, 0.7, 0.1, 0.5, ...
    { 3 }   1.0, 0.6, 0.6, 0.2, ...
    { 4 }   0.0, 0.0, 0.5, 0.3, ...
    { 5 }   0.0, 1.0, 0.4, 0.1  )
end on

プリセットデータを格納するための配列を作成します。

on init
    declare ?presets[10 * 8] := (1.0)
end on

同じ配列を特定の値で手早く初期化する方法です。

関連項目

配列コマンド

グループコマンド

make_persistent()


@ (string variable)

declare @<variable-name>

テキストを格納するユーザー定義の文字列変数を宣言します。

補足

  • 整数変数とは異なり、文字列変数を宣言と同じ行でインラインに初期化することはできません。

  • 文字列変数に格納できるテキストの最大長は 320 文字です。

on init
    declare @text
    @text := "Last received note number played or released: "
end on

on note
    message(@text & $EVENT_NOTE)
end on

on release
    message(@text & $EVENT_NOTE)
end on

長いテキストを表示するには文字列変数を使用します。

関連項目

! (string array)

ui_text_edit

make_persistent()


! (string array)

declare !<array-name>[<num-of-elements>]

指定したインデックスにテキスト文字列を格納するユーザー定義の文字列配列を宣言します。

補足

  • 配列の最大サイズは 1000000 インデックスです。

  • 文字列変数の場合と同じく、文字列配列の内容も宣言と同じ行でインラインに初期化することはできません。

  • 各インデックスに格納できる文字列の最大長は 320 文字です。

  • 長い文字列を持つ大きな文字列配列をpersistentにすると、多くのメモリーを必要とすることに注意してください(おおよそ、1文字 = 1バイト、320文字 = 320バイト、320文字の文字列 1000000 個 = 305メガバイト)

on init
    declare $count

    declare !note[12]
    !note[0] := "C"
    !note[1] := "C#"
    !note[2] := "D"
    !note[3] := "D#"
    !note[4] := "E"
    !note[5] := "F"
    !note[6] := "F#"
    !note[7] := "G"
    !note[8] := "G#"
    !note[9] := "A"
    !note[10] := "Bb"
    !note[11] := "B"

    declare !name [128]

    while ($count < 128)
        !name[$count] := !note[$count mod 12] & (($count / 12) - 2)

        inc($count)
    end while
end on

on note
    message("Note played: " & !name[$EVENT_NOTE])
end on

すべてのMIDIノート名を格納した文字列配列を作成します。

関連項目

@ (string variable)


const $ (constant integer)

declare const $<name>

単一の整数値を格納するユーザー定義の定数を宣言します。

補足

  • 名前のとおり、定数変数の値は読み取ることしかできず、変更はできません。

  • 定数の名前は大文字で書くのが一般的です(そして推奨されます)。

  • 整数定数に格納できる有効な数値は -2147483648 ... 2147483647 の範囲です。

on init
    declare const $NUM_PRESETS := 10
    declare const $NUM_PARAMETERS := 5

    declare %preset_data[$NUM_PRESETS * $NUM_PARAMETERS]
end on

定数を作成します。プリセット用の配列を作るときに便利です。

関連項目

on init


const ~ (real constant)

declare const ~<name>

単一の64ビット(倍精度)実数値を格納するユーザー定義の定数を宣言します。

補足

  • 名前のとおり、定数変数の値は読み取ることしかできず、変更はできません。

  • 定数の名前は大文字で書くのが一般的です(そして推奨されます)。

on init
    declare const ~BIG_NUMBER := 100000.0
    declare const ~SMALL_NUMBER := 0.00001
end on

ちょっとした実数定数の例です。

関連項目

on init


polyphonic $ (polyphonic integer)

declare polyphonic $<variable-name>

ノートイベントごとに単一の整数値を格納するユーザー定義のポリフォニック変数を宣言します。

補足

  • ポリフォニック変数は、実行されるノートイベントごとに固有の変数として働き、並行して実行されるコールバックでの競合を回避します。たとえばwait()を使用する場合です。

  • ポリフォニック変数は、対応するノートのon releaseコールバックでも値を保持します。

  • ポリフォニック変数は通常の変数よりもはるかに多くのメモリーを必要とします。Kontaktのノートイベントキューは最大 8192 イベントに対応するため、32ビット * 8192 = 32キロバイトとなります。

  • ポリフォニック変数はnoteコールバックとreleaseコールバックの中でのみ使用できます。

on init
    declare polyphonic $a
    { declare $a }
end on

on note
    ignore_event($EVENT_ID)

    $a := 0
    while ($a < 13 and $NOTE_HELD = 1)
        play_note($EVENT_NOTE + $a, $EVENT_VELOCITY, 0, $DURATION_QUARTER / 2)

        inc($a)

        wait($DURATION_QUARTER)
    end while
end on

ポリフォニック変数の効果を聴くには、オクターブを弾いて押さえたままにします。両方のノートが半音ずつ上昇していきます。次に$aを通常の変数にしてから同じオクターブを弾くと、$aは実行された両方のコールバックで共有されるため、両方のノートはより大きな音程で上昇していきます。

on init
    declare $counter
    declare polyphonic $polyphonic_counter
end on

on note
    message($polyphonic_counter & "  " & $counter)
    inc($counter)
    inc($polyphonic_counter)
end on

ポリフォニック変数は常にコールバックごとに固有であるため、表示されるメッセージの中で$polyphonic_counterは常に 0 になります。


make_instr_persistent()

make_instr_persistent(<variable>)

変数の値をInstrumentの中でのみ保持します。

補足

  • make_instr_persistent()make_persistent()と似ていますが、変数の値はInstrumentとともに保存されるだけで、Snapshotとともには保存されません。Snapshotを読み込むときにUI要素が変更されるのを防ぐために使用できます。

on init
    set_snapshot_type(1)    { init callback not executed upon snapshot loading }

    declare ui_knob $knob_1 (0, 2, 1)
    set_text($knob_1, "Pers")
    make_persistent($knob_1)

    declare ui_knob $knob_2 (0, 2, 1)
    set_text($knob_2, "Inst Pers")
    make_instr_persistent($knob_2)

    declare ui_knob $knob_3 (0, 2, 1)
    set_text($knob_3, "Not Pers")
end on

2番目のノブはSnapshotを読み込んでも変更されません。

関連項目

read_persistent_var()

make_persistent()

set_snapshot_type()


make_persistent()

make_persistent(<variable>)

変数の値をInstrumentおよびSnapshotとともに保持します。

補足

  • 変数の状態は、Instrument、Multi、ホストチャンクとともに保存されるだけでなく、スクリプトをKontaktのプリセット(.nkpファイル)として保存したときにも保存されます。

  • 変数の状態はinitコールバックの最後に読み込まれます。保存された値をinitコールバックの中で手動で読み込むには、その値を使用する前にread_persistent_var()を挿入します。

  • persistent変数の値を取得するためにon persistence_changedコールバックを使用することもできます。

  • 古いコードを新しいコードに置き換えてスクリプトを更新した場合、同じ名前を持つpersistent変数の値は保持されます。

  • 複雑なスクリプトを扱っていると、スクリプトをリセットしてpersistent変数の値を消去したくなることがあります。これは、Script EditorのPresetメニューから - INIT Script - プリセットを読み込み、そのうえでコードをもう一度適用することで行えます。

on init
    declare ui_knob $Preset (1, 10, 1)
    make_persistent($Preset)
end on

ノブなどのユーザーインターフェース要素は、通常、Instrumentを再読み込みしたときにも値を保持しているべきです。

関連項目

read_persistent_var()

on persistence_changed

make_instr_persistent()


read_persistent_var()

read_persistent_var(<variable>)

make_persistent()コマンドで保存された変数の値を即座に再読み込みします。

補足

  • このコマンドはon initコールバックの中でのみ使用できます。

  • persistent変数の値を取得するためにon persistence_changedコールバックを使用することもできます。

on init
    declare ui_label $label (1, 1)
    declare ui_button $button
    set_text($button, "$a := 10000")

    declare $a
    make_persistent($a)
    { read_persistent_var($a) }
    set_text($label, $a)
end on

on ui_control ($button)
    $a := 10000
    set_text($label, $a)
end on

このスクリプトを適用したらボタンをクリックし、NKIを保存して閉じます。もう一度読み込むと、$aの値はinitコールバックのいちばん最後に初期化されるため、ラベルには 0 が表示されます。ここでread_persistent_varを囲んでいるコメントを外し、スクリプトをもう一度適用して違いを確認してください。

関連項目

make_persistent()

on persistence_changed


watch_var()

watch_var(<variable>)

監視対象の変数の値が変化するたびに、Creator ToolsのKSP Logへイベントを送信します。

補足

  • このコマンドはon initコールバックの中でのみ使用できます。

  • このコマンドはKontaktのステータスバーには影響しません。イベントはCreator Toolsにのみ表示されます。

  • このコマンドはビルトイン変数($ENGINE_UPTIME$NOTE_HELD$KSP_TIMER など)では動作しません

on init
    declare $intVar

    watch_var($intVar)
    make_persistent($intVar)
end on
 
on note
    $intVar := $EVENT_VELOCITY 
end on

Creator Toolsを起動した状態で、いくつかノートを弾いてみてください。KSP VariablesパネルまたはKSP Logパネルにフォーカスが当たっていることを確認してください。


watch_array_idx()

watch_array_idx(<array>, <array_idx>)

監視対象の配列インデックスの値が変化するたびに、Creator ToolsのKSP Logへイベントを送信します。

補足

  • このコマンドはon initコールバックの中でのみ使用できます。

  • このコマンドはKontaktのステータスバーには影響しません。イベントはCreator Toolsにのみ表示されます。

  • このコマンドはビルトイン配列変数(%KEY_DOWN%CC%EVENT_PAR など)では動作しません。

on init 
    declare %mykeys[128]

    watch_array_idx(%mykeys, 60)
    watch_array_idx(%mykeys, 61)
    watch_array_idx(%mykeys, 62)
    watch_array_idx(%mykeys, 63)
    watch_array_idx(%mykeys, 64)
    
    declare ui_button $Save
    declare ui_button $Load
end on
 
on note 
    %mykeys[$EVENT_NOTE] := $EVENT_VELOCITY
end on
 
on ui_control($Save)
    save_array(%mykeys, 0)
end on
 
on ui_control($Load)
    load_array(%mykeys, 0)
end on

Creator Toolsを起動した状態で、いくつかノートを弾くか、saveボタンとloadボタンをクリックしてみてください。KSP VariablesパネルまたはKSP Logパネルにフォーカスが当たっていることを確認してください。


参照元情報:Variables
https://docs.native-instruments.com/online-guides/ksp-manual/en/variables