KSPリファレンスマニュアル 17 - 時間関連コマンド(Time-Related Commands)

KSPリファレンスマニュアル 17 - 時間関連コマンド(Time-Related Commands)


change_listener_par()

change_listener_par(<signal-type>, <parameter>)

on listenerコールバックのパラメーターを変更します。任意のコールバックで使用できます。

<signal-type>

変更するシグナルです。次のいずれかを指定できます。

$NI_SIGNAL_TIMER_MS

$NI_SIGNAL_TIMER_BEAT

<parameter>

指定したシグナルタイプに応じて異なります。

$NI_SIGNAL_TIMER_MS:マイクロ秒単位の時間間隔(最小値は1000マイクロ秒で、1ミリ秒に相当します)

$NI_SIGNAL_TIMER_BEAT:4分音符1拍を分割した単位での時間間隔(1 ... 24)

補足

  • <parameter>を0に設定すると、特定のリスナーシグナルを完全に無効にすることもできます。

on init
    declare ui_value_edit $Tempo (20, 300, 1)
    declare ui_switch $Play

    make_persistent($Tempo)
    read_persistent_var($Tempo)

    $Tempo := 120

    set_listener($NI_SIGNAL_TIMER_MS, 60000000 / $Tempo)
end on

on listener
    if ($NI_SIGNAL_TYPE = $NI_SIGNAL_TIMER_MS and $Play = 1)
        play_note(60, 127, 0, $DURATION_EIGHTH)
    end if
end on

on ui_control($Tempo)
    change_listener_par($NI_SIGNAL_TIMER_MS, 60000000 / $Tempo)
end on

ごく基本的なメトロノームです。

関連項目

on listener

set_listener()

コールバックとUI: $NI_SIGNAL_TYPE


ms_to_ticks()

ms_to_ticks(<microseconds>)

マイクロ秒の値を、テンポに依存するMIDIティックの値に変換します。

on init
    declare ui_label $bpm (1, 1)
    set_text($bpm, ms_to_ticks(60000000) / 960)
end on

現在のホストテンポを表示します。

関連項目

ticks_to_ms()

時間とトランスポート: $NI_SONG_POSITION


set_listener()

set_listener(<signal-type>, <parameter>)

listenerコールバックが反応するシグナルを設定します。on initコールバックの中でのみ使用できます。

<signal-type>

listenerコールバックが反応するイベントです。次のタイプを使用できます。

$NI_SIGNAL_TRANSP_STOP

$NI_SIGNAL_TRANSP_START

$NI_SIGNAL_TIMER_MS

$NI_SIGNAL_TIMER_BEAT

<parameter>

ユーザーが定義するパラメーターで、指定したシグナルタイプに応じて異なります。

$NI_SIGNAL_TIMER_MS:マイクロ秒単位の時間間隔(最小値は1000で、1ミリ秒に相当します)

$NI_SIGNAL_TIMER_BEAT:4分音符1拍を分割した単位での時間間隔(1 ... 24)

$NI_SIGNAL_TRANSP_START:ホストのトランスポート開始コマンドにlistenerコールバックを反応させる場合は1に設定します。

$NI_SIGNAL_TRANSP_STOP:ホストのトランスポート停止コマンドにlistenerコールバックを反応させる場合は1に設定します。

補足

  • $NI_SIGNAL_TIMER_BEATを使用する場合、最大の分解能は1拍あたり24ティックです。

on init
    set_listener($NI_SIGNAL_TIMER_BEAT, 1)
end on

on listener
    if ($NI_SIGNAL_TYPE = $NI_SIGNAL_TIMER_BEAT)
        message($ENGINE_UPTIME)
    end if
end on

1拍ごとにlistenerコールバックをトリガーします。トランスポートが停止しているときもトリガーされます。

関連項目

change_listener_par()

コールバックとUI: $NI_SIGNAL_TYPE


stop_wait()

stop_wait(<callback-id>, <parameter>)

指定したコールバック内のwaitコマンドを停止します。

<callback-id>

waitコマンドを停止する対象のコールバックのID番号です。

<parameter>

0:現在のwaitのみを停止します。

1:現在のwaitを停止し、このコールバック内の以降のwaitコマンドをすべて無視します。

補足

  • コールバック内のすべてのwait()コマンドを停止する場合は、whileループの扱いに注意してください。

on init
    declare $id

    declare ui_button $Play
end on

on ui_control ($Play)
    if ($Play = 1)
        $id := $NI_CALLBACK_ID

        play_note(60, 127, 0, $DURATION_QUARTER)

        wait($DURATION_QUARTER)

        if ($Play = 1)
            play_note(64, 127, 0, $DURATION_QUARTER)
        end if

        wait($DURATION_QUARTER)

        if ($Play = 1)
            play_note(67, 127, 0, $DURATION_QUARTER)
        end if
    else
        stop_wait($id, 1)
        fade_out($ALL_EVENTS, 10000, 1)
    end if
end on

Playボタンで単純な3和音のアルペジオをトリガーします。stop_wait()コマンドが無い場合、Playボタンを素早く連続して押すと並行してコールバックが実行され、アルペジオが複数重なる結果になります。

関連項目

wait()

wait_async()

wait_ticks()

コールバックとUI: コールバックタイプの変数と定数


reset_ksp_timer

reset_ksp_timer

KSPタイマーのビルトイン変数($KSP_TIMER)を0にリセットします。

補足

  • $KSP_TIMER変数は32ビット符号付きであるため、2147483648マイクロ秒、およそ35分47秒で上限に達する点に注意してください。

  • KSPタイマーはCPUクロックに基づいているため、主な用途はデバッグと最適化です。スクリプトの特定の処理の効率を測定するのに非常に役立つツールです。ただし、Kontaktをオフラインバウンスで使用している場合でもリアルタイムの一定速度で進むため、音楽的なタイミングの用途には使用しないでください。

on init
    declare $a
    declare $b
    declare $c
end on

on note
    reset_ksp_timer

    $c := 0
    while ($c < 128)
        $a := 0
        while($a < 128)
            set_event_par($EVENT_ID, $EVENT_PAR_TUNE, random(-1000, 1000))

            inc($a)
        end while

        inc($c)
    end while

    message($KSP_TIMER)
end on

入れ子のwhileループの例です。およそ5400〜5800マイクロ秒かかります。

関連項目

時間とトランスポート: $ENGINE_UPTIME, $KSP_TIMER


ticks_to_ms()

ticks_to_ms(<ticks>)

テンポに依存するMIDIティックの値を、マイクロ秒の値に変換します。

補足

  • 戻り値はマイクロ秒単位であるため、32ビット符号付きの性質上、現在のテンポでの指定したティック数が2147483648マイクロ秒、およそ35分47秒を超える場合は正しい値が返らない点に注意してください。

on init
    declare $msec
    declare $sec
    declare $min


    declare ui_label $label (2, 1)

    set_listener($NI_SIGNAL_TIMER_MS, 1000)
end on

on listener
    if ($NI_SIGNAL_TYPE = $NI_SIGNAL_TIMER_MS)
        $msec := ticks_to_ms($NI_SONG_POSITION) / 1000
        $sec := $msec / 1000
        $min := $sec / 60

        set_text($label, $min & ":" & $sec mod 60 & "." & $msec mod 1000)
    end if
end on

ソングポジションをリアルタイムで表示します。

関連項目

ms_to_ticks()

時間とトランスポート: $NI_SONG_POSITION


wait()

wait(<wait-time>)

コールバックを、マイクロ秒単位で指定した時間だけ一時停止します。

補足

  • wait()は、スクリプト内のその位置でコールバックを指定した時間だけ停止します。つまりコールバックをフリーズさせますが、その間も他のコールバックは処理されます。指定した時間が経過すると、コールバックは続きから再開します。

on note
    ignore_event($EVENT_ID)

    if ($DURATION_BAR = 0)
        wait(($DURATION_QUARTER * 4) - $DISTANCE_BAR_START)
    else
        wait($DURATION_BAR - $DISTANCE_BAR_START)
    end if

    play_note($EVENT_NOTE, $EVENT_VELOCITY, 0, -1)
end on

すべてのノートを次の小節の頭にクオンタイズします。このスクリプトは、Kontaktスタンドアローンでは$DURATION_BARが0を返すことにも対応しており、その場合は4分音符の長さを使って4/4小節を組み立てます。

関連項目

stop_wait()

wait_async()

wait_ticks()

while ()

時間とトランスポート: $DURATION_QUARTER


wait_async()

wait_async(<async-id>)

<async-id>で指定した非同期コマンドが完了するまで待機します。

補足

  • 複数の処理を実行する場合、それらをまとめて収集し、そのコレクションに対してwait_async()関数を呼び出すこともできます。このようにまとめて収集した処理は1つのブロックとして計算されるため、パフォーマンスが向上します。非同期処理がすでにパイプラインに存在しない場合や無効な場合は、待機は行われずスクリプトはそのまま続行します。

wait_async(set_engine_par($ENGINE_PAR_EFFECT_TYPE, ... $EFFECT_TYPE_CHORUS, -1, 2, 1))

単一の非同期処理を実行する例です。

%asyncid[0] := async_operation
%asyncid[1] := another_async_operation
...
%asyncid[x] := last_async_operation

$i := 0
while($i < num_elements(%asyncid))
    wait_async(%asyncid[$i])

    inc($i)
end while

複数の非同期処理を実行する例です。

関連項目

一般: $NI_ASYNC_EXIT_STATUS, $NI_ASYNC_ID


wait_ticks()

wait_ticks(<ticks>)

コールバックを、MIDIティック単位で指定した時間だけ一時停止します。

補足

  • wait()と同じですが、待機時間のパラメーターにMIDIティックを使用します。

  • 960MIDIティックが4分音符1拍に相当します。

関連項目

stop_wait()

wait()


参照元情報:Time-Related Commands
https://docs.native-instruments.com/online-guides/ksp-manual/en/time-related-commands