1つのNKIの中で同時に使用できるMIDIオブジェクトは1つだけです。MIDIオブジェクトはメモリー上に保持され、どのスクリプトスロットからでもアクセスできます。オブジェクトの中のMIDIイベントは追加・削除・編集ができ、MIDIファイルのインポートとエクスポートも行えます。
Multi ScriptもMIDIオブジェクトを1つ保持でき、NKIと同じ方法で扱います。
Kontaktのバージョン5.2で、MIDIファイルの扱いが大きく更新されている点にご注意ください。5.2リリース以前のコマンドや作業方法も下位互換性を保つために残されていますが、このリファレンスでは5.2以降の作業方法を記載します。
Instrumentを初期化すると、空のMIDIオブジェクトも一緒に初期化されます。オブジェクトの編集を始めるには、バッファサイズを定義してイベントを挿入するか、MIDIファイル全体を挿入します。
MIDIシーケンスをゼロから作成したい場合は、まずバッファサイズを割り当てる必要があります。これにより、指定した数の非アクティブなMIDIイベントが実質的に作成されます。ここから先は、MIDIイベントコマンドを使ってMIDIイベントをアクティブに、つまり挿入し、編集できます。
スクリプトの中でデータを使ったり編集したりするために、MIDIファイルを読み込むこともできます。使用するコマンドと変数によって、読み込んだデータは既存のMIDIデータと結合されるか、既存のデータを置き換えます。MIDIファイルの読み込みは非同期コマンドであり、非同期の読み込みに共通するコマンドと作業方法が当てはまる点に注意してください。
MIDIオブジェクトは、save_midi_file()コマンドを使うか、ドラッグアンドドロップを有効にしたlabelウィジェット経由で、Kontaktから書き出せます。どちらの場合も、mf_set_export_area()コマンドを使って、開始時刻と終了時刻、および開始トラックと終了トラックの両面から、エクスポートエリアを定義できます。
エクスポートエリアは最大512個まで定義でき、それぞれが異なる時間範囲とトラック範囲を指すことができます。ここでの手順は、まずmf_set_num_export_areas()でエクスポートエリアの数を設定し、次に同じ数のui_labelウィジェットを作成して、$CONTROL_PAR_MIDI_EXPORT_AREA_IDXコントロールパラメーターを使って個々のエクスポートエリアのインデックスに割り当てる、というものです。そこから先は、エクスポートエリア0を「編集バッファ」とみなし、そこから関心のあるさまざまな時間/トラックの選択範囲を、mf_copy_export_area()コマンドを使って他のエクスポートエリアにコピーします。
KontaktのMIDIオブジェクトの中のMIDIイベントにはイベントパラメーターが与えられており、mf_get_event_par()またはmf_set_event_par()コマンドを使ってアクセスします。特定のイベントにアクセスするには固有のイベントIDを使うか、位置によってイベントをたどることができます。イベントIDは、MIDIイベントが作成または読み込まれるたびに割り当てられます。
読み込んだMIDIファイルのイベントデータにアクセスするには、再生ヘッドに相当するポジションマーカーでMIDIイベントの間を移動します。ポジションマーカーは一度に1つのイベントだけに焦点を合わせ、さまざまなコマンドを使ってそのイベントのパラメーターにアクセスしたり編集したりできるようにします。1つのイベントから次のイベントへ順に移動することも、MIDIティックで正確な位置を指定することもできます。
MIDIのNote Offメッセージは使用されない点に注意してください。mf_insert_file()コマンドでMIDIファイルを読み込むと、Note Offイベントは対応するNote Onイベントに長さのパラメーターを与えるために使われ、その後は破棄されます。
| |
|---|---|
MIDIオブジェクトのイベントのうち、ユーザーが定義したグループにアクセスするために使用します。 | |
| イベントマーク番号。 |
イベントとMIDI: $ALL_EVENTS, $CURRENT_EVENT
| |
|---|---|
トラック番号でグループ化されたイベントにアクセスするために使用します。 | |
| アクセスしたいイベントのトラック番号。 |
機能はby_marks()コマンドと同様です。
イベントとMIDI: $ALL_EVENTS, $CURRENT_EVENT
|
|---|
MIDIエクスポートエリア0の内容を、指定した |
on init
message("")
make_perfview
declare const $DND_AREAS := 4
declare ui_label $label1 (1,1)
declare ui_label $label2 (1,1)
declare ui_label $label3 (1,1)
declare ui_label $label4 (1,1)
declare $i
declare %ID[$DND_AREAS]
%ID[0] := get_ui_id($label1)
%ID[1] := get_ui_id($label2)
%ID[2] := get_ui_id($label3)
%ID[3] := get_ui_id($label4)
declare !track_names[$DND_AREAS]
!track_names[0] := "Synth 1"
!track_names[1] := "Synth 2"
!track_names[2] := "Bass"
!track_names[3] := "Melody"
mf_insert_file(get_folder($GET_FOLDER_PATCH_DIR) & "my_midi.mid", 0, 0, 0)
mf_set_num_export_areas($DND_AREAS + 1)
$i := 0
while ($i < $DND_AREAS)
set_control_par(%ID[$i], $CONTROL_PAR_DND_BEHAVIOUR, 1)
set_control_par(%ID[$i], $CONTROL_PAR_MIDI_EXPORT_AREA_IDX, $i + 1)
set_control_par_str(%ID[$i], $CONTROL_PAR_TEXT, !track_names[$i])
mf_set_export_area(!track_names[$i], -1, -1, $i, $i)
mf_copy_export_area($i + 1)
inc($i)
end while
end on
MIDIファイルを読み込み、最初の4つのMIDIチャンネルにある内容を4つの個別のMIDIエリアに振り分けます。
|
|---|
MIDIオブジェクトのイベントバッファのサイズを返します。 |
バッファサイズの最大値は、アクティブなイベントと非アクティブなイベントを合わせて1000000イベントです。
MIDIイベントを挿入するとバッファサイズが1つ減ります。イベントを削除すると1つ増えます。
| |
|---|---|
イベントパラメーターの値を返します。 | |
| 編集するイベントのID。 |
| イベントパラメーター。自由に割り当てられる4つのイベントパラメーターのいずれか:
またはイベントのビルトインパラメーター:
|
イベントIDとして$ALL_EVENTS定数を使うと、MIDIオブジェクト内のすべてのイベントにアクセスできます。
$CURRENT_EVENT定数を使うと、現在選択されているイベントにアクセスできます。
by_track()とby_marks()コマンドを使って、トラックごとにイベントにアクセスしたり、イベントマークでグループ化したりすることもできます。
イベントとMIDI: $CURRENT_EVENT
| |
|---|---|
ポジションマーカーをMIDIトラックの最初のイベントに移動します。 | |
| 編集したいトラックの番号。-1 はファイル全体を指します。 |
このコマンドを使うと、ポジションマーカーの位置にあるイベントが編集対象として選択されます。
|
|---|
|
| |
|---|---|
ポジションマーカーをMIDIトラックの最後のイベントに移動します。 | |
| 編集したいトラックの番号。-1 はファイル全体を指します。 |
このコマンドを使うと、ポジションマーカーの位置にあるイベントが編集対象として選択されます。
|
|---|
|
このコマンドは、Note OnイベントとNote Offイベントを組み合わせて、Note Lengthパラメーターを持つ1つのNote Onにまとめます。Note Offイベントは破棄されます。
on init
message("")
make_perfview
declare const $DND_AREAS := 4
declare ui_label $label1 (1,1)
declare ui_label $label2 (1,1)
declare ui_label $label3 (1,1)
declare ui_label $label4 (1,1)
declare $i
declare %ID[$DND_AREAS]
%ID[0] := get_ui_id($label1)
%ID[1] := get_ui_id($label2)
%ID[2] := get_ui_id($label3)
%ID[3] := get_ui_id($label4)
declare !track_names[$DND_AREAS]
!track_names[0] := "Synth 1"
!track_names[1] := "Synth 2"
!track_names[2] := "Bass"
!track_names[3] := "Melody"
mf_insert_file(get_folder($GET_FOLDER_PATCH_DIR) & "my_midi.mid", 0, 0, 0)
{ declare export areas, area 0 serves as an edit buffer, so add one extra }
mf_set_num_export_areas($DND_AREAS + 1)
$i := 0
while ($i < $DND_AREAS)
set_control_par(%ID[$i], $CONTROL_PAR_DND_BEHAVIOUR, 1)
set_control_par(%ID[$i], $CONTROL_PAR_MIDI_EXPORT_AREA_IDX, $i + 1)
set_control_par_str(%ID[$i], $CONTROL_PAR_TEXT, mf_get_last_filename & " " & !track_names[$i])
mf_set_export_area(!track_names[$i], -1, -1, $i, $i)
mf_copy_export_area($i + 1)
inc($i)
end while
end on
最初の4トラックを個別のMIDIファイルとして書き出せるMIDIファイルローダーです。mf_get_last_filename()を使って、読み込まれたMIDIファイルの正確な名前を表示します。
| |
|---|---|
イベントにマークが付いているかどうかを調べます。付いていれば1を、付いていなければ0を返します。 | |
< | 編集するイベントのID |
| イベントマーク番号。 |
イベントとMIDI: $ALL_EVENTS, $CURRENT_EVENT
| |
|---|---|
ポジションマーカーをMIDIトラックの次のイベントに移動します。 | |
| 編集したいトラックの番号。-1 はファイル全体を指します。 |
このコマンドを使うと、ポジションマーカーの位置にあるイベントが編集対象として選択されます。
load_midi_file()
| |
|---|---|
ポジションマーカーを、指定した位置の直後にあるMIDIトラックの次のイベントに移動します。 | |
| 編集したいトラックの番号。-1 はファイル全体を指します。 |
| MIDIティックでの位置。 |
このコマンドを使うと、ポジションマーカーの位置にあるイベントが編集対象として選択されます。
load_midi_file()
|
|---|
MIDIオブジェクト内のトラック数を返します。 |
| |
|---|---|
ポジションマーカーをMIDIトラックの直前のイベントに移動します。 | |
| 編集したいトラックの番号。-1 はファイル全体を指します。 |
このコマンドを使うと、ポジションマーカーの位置にあるイベントが編集対象として選択されます。
load_midi_file()
| |
|---|---|
ポジションマーカーを、指定した位置より前にある最初のイベントに移動します。 | |
| 編集したいトラックの番号。-1 はファイル全体を指します。 |
| MIDIティックでの位置。 |
このコマンドを使うと、ポジションマーカーの位置にあるイベントが編集対象として選択されます。
load_midi_file()
| |
|---|---|
MIDIオブジェクト内の非アクティブなMIDIイベントをアクティブにします。ただし、コマンドと位置をこのコマンドの中で定義するため、実質的には挿入とみなせます。 | |
| イベントの挿入先となるトラック。 |
| イベントが挿入される位置。単位はティックです。 |
| イベントのコマンドタイプを定義します。次のいずれかを指定できます:
|
| コマンドの1バイト目。 |
| コマンドの2バイト目。 |
mf_set_buffer_size()コマンドでイベントバッファサイズを先に設定しなければ、MIDIイベントを挿入することはできません。
バッファがいっぱいのとき、つまりサイズが0のときにこのコマンドを使っても、何も起こりません。
次のように書くと、挿入したイベントのイベントIDを変数に取得できます:
<variable> := mf_insert_event(<track>, <pos>, <command>, <byte1>, <byte2>)
| |
|---|---|
MIDIファイルをオブジェクトに挿入します。 | |
| ファイル名を含む、MIDIファイルの絶対パス。 |
| MIDIデータにトラックオフセットを適用します。 |
| MIDIデータに、ティック単位の位置オフセットを適用します。 |
| 挿入のモードを定義します: 0: 既存のイベントをすべて置き換える 1: 重なっているイベントのみを置き換える 2: すべてのイベントをマージする |
このコマンドはon initコールバックでは同期的に、それ以外のすべてのコールバックでは非同期的に実行されます。そのため、読み込みの状態を確認するにはon async_completeコールバックを使うことをおすすめします。
このコマンドは、Note OnイベントとNote Offイベントを組み合わせて、長さのパラメーターを持つ1つのNote Onにまとめます。Note Offイベントは破棄されます。
Kontaktで絶対ファイルパスを扱うときは、必ずスラッシュ(/)を使ってください!
on init
declare $load_mf_id := -1
declare @file_name
declare @filepath
@file_name := "test.mid"
@filepath := get_folder($GET_FOLDER_FACTORY_DIR) & @file_name
declare ui_button $load_file
end on
on ui_control($load_file)
$load_mf_id := mf_insert_file(@filepath, 0, 0, 0)
end on
on async_complete
if ($NI_ASYNC_ID = $load_mf_id)
$load_mf_id := -1
if ($NI_ASYNC_EXIT_STATUS = 0)
message("ERROR: MIDI file not found!")
else
message("Loaded MIDI file: " & @file_name & "!")
end if
end if
end on
ボタンでMIDIファイルを読み込む例です。これを動作させるには、「test.mid」という名前のMIDIファイルをKontaktのファクトリーデータフォルダーに置く必要があります。そうでない場合は、定義したエラーメッセージが表示されます。
一般: $NI_ASYNC_ID, $NI_ASYNC_EXIT_STATUS
| |
|---|---|
MIDIオブジェクト内のイベントを非アクティブにし、実質的に削除します。 | |
| 非アクティブにするイベントのID。 |
このコマンドを使うと、MIDIイベントバッファのサイズが1つ減ります。
|
|---|
MIDIオブジェクトをリセットし、イベントバッファを0にして、すべてのイベントを削除します。 |
このコマンドはMIDIオブジェクト内のすべてのデータを消去します。使用には注意してください!
このコマンドは非同期であるため、非同期IDを返し、on async_completeコールバックを呼び出します。
| |
|---|---|
アクティブにして編集できる、非アクティブなMIDIイベントの数を定義します。 | |
| MIDIオブジェクトの編集バッファのサイズ。 |
mf_insert_event()とmf_remove_event()は、技術的にはバッファ内のイベントをアクティブまたは非アクティブにするものです。
バッファサイズを先に設定しなければ、MIDIイベントを挿入することはできません。
バッファサイズの最大値は、アクティブなイベントと非アクティブなイベントを合わせて1000000イベントです。
このコマンドはon initコールバックでは同期的に、それ以外のすべてのコールバックでは非同期的に実行されます。そのため、読み込みの状態を確認するにはon async_completeコールバックを使うことをおすすめします。
MIDIイベントを挿入するとバッファサイズが1つ減ります。イベントを削除すると1つ増えます。
MIDIファイルを挿入してもバッファには影響しません。
| |
|---|---|
イベントパラメーターを設定します。 | |
| 編集するイベントのID。 |
| イベントパラメーター。自由に割り当てられる4つのイベントパラメーターのいずれか:
またはイベントのビルトインパラメーター:
|
| イベントパラメーターの値。 |
イベントIDとして$ALL_EVENTS定数を使うと、MIDIオブジェクト内のすべてのイベントを制御できます。
$CURRENT_EVENT定数を使うと、現在選択されているイベントにアクセスできます。
by_track()とby_marks()コマンドを使って、トラックごとにイベントを制御したり、イベントマークでグループ化したりすることもできます。
イベントとMIDI: $ALL_EVENTS, $CURRENT_EVENT
| |
|---|---|
ドラッグアンドドロップエリアを使うとき、または | |
| 書き出されるファイルの名前を設定します。 |
| エクスポートエリアの開始位置(ティック単位)を定義します。 オブジェクトの先頭に設定するには -1 を使います。 |
| エクスポートエリアの終了位置(ティック単位)を定義します。 オブジェクトの末尾に設定するには -1 を使います。 |
| エクスポートエリアに含める最初のトラックを定義します。 オブジェクトの最初のトラックに設定するには -1 を使います。 |
| エクスポートエリアに含める最後のトラックを定義します。 オブジェクトの最後のトラックに設定するには -1 を使います。 |
開始点に終了点より大きい値を指定した場合、値は入れ替えられます。
このコマンドを実行すると、範囲内のイベントが有効なMIDIコマンドかどうかがチェックされます。すべてのイベントが有効であればこのコマンドは0を返し、そうでなければ最初の無効なイベントのイベントIDを返します。
on init
declare $area_status
declare @filepath
@filepath := get_folder($GET_FOLDER_FACTORY_DIR) & "test.mid"
declare ui_button $CheckMIDI
mf_insert_file(@filepath, 0, 0, 0)
end on
on ui_control($CheckMIDI)
$area_status := mf_set_export_area(“name”, -1, -1,-1,-1)
if ($area_status = 0)
message(“All Good”)
else
message(“Error: Check event with ID ” & $area_status & "!")
end if
$CheckMIDI := 0
end on
このコマンドを使って、MIDIファイル内のすべてのイベントが有効かどうかをチェックする簡単なスクリプトです。エラーがある場合は、最初の無効なイベントのイベントIDを表示します。これを動作させるには、「test.mid」という名前のMIDIファイルをKontaktのファクトリーデータフォルダーに置く必要があります。
特定のUIウィジェット: $CONTROL_PAR_DND_BEHAVIOUR
| |
|---|---|
イベントにマークを付け、イベントをグループ化してそのグループをすばやく処理できるようにします。 | |
| マークを付けるイベントのID。 |
| イベントマーク番号。 |
| イベントにマークを付けるには1を、マークを外すには0を設定します。 |
イベントとMIDI: $ALL_EVENTS, $CURRENT_EVENT
|
|---|
エクスポートエリアの数を設定します。最大は512です。 |
エリアインデックス0は常にmf_set_export_area()で設定します。
エリアインデックス0の内容は、mf_copy_export_area()を呼び出すことで他のエリアにコピーできます。
参照元情報:MIDI Object Commands
https://docs.native-instruments.com/online-guides/ksp-manual/en/midi-object-commands