find_objects 関数を使用してみよう

このチュートリアルでは、find_objects 関数を使った、複数のオブジェクトの一括取得について説明します。
これまで、CRI Atom Craft を操作するための様々な関数を紹介してきましたが、 どの関数も1回の呼び出しで1つのオブジェクトを取得する関数でした。
find_objects 関数は、1回の呼び出しで複数のオブジェクト取得ができるとても便利な関数です。
是非、このチュートリアルで、 find_objects 関数の使い方を覚えましょう。

これからワークユニット内の全てのウェーブフォームリージョンに、ボイスリミットグループを設定するスクリプトを書いていきます。

本チュートリアルは、チュートリアル「 プロジェクトの作成と波形ファイルをキューに登録 」で作成したプロジェクトを使用します。
プロジェクトを開いていない場合は、プロジェクトを開くか、「 プロジェクトの作成と波形ファイルをキューに登録 」にて作成したスクリプトを実行してから、チュートリアルを進めましょう。

スクリプトファイルの準備

スクリプト メニューで「スクリプトリスト...」を選択し、スクリプトリスト ウィンドウを表示します。
スクリプトリスト ウィンドウの新規作成ボタンを押して、以下の名前でスクリプトファイルを作成します。

スクリプトの保存先スクリプトファイル名
tutorials [CRI] tutorial05-2_use_find_objects.py

スクリプトの説明

作成したスクリプトをダブルクリックして、 スクリプトエディターからのスクリプト実行 で開きます。
スクリプトリスト ウィンドウ でスクリプトの概要を確認できるように、スクリプトの説明を次のように記述しましょう。

# --Description:[チュートリアル]find_objects関数を使う&ウェーブフォームリージョンにボイスリミットグループを一括設定


モジュールのインポート

スクリプトの説明が記述できたら、スクリプトで CRI Atom Craft を操作するため、次のモジュールをインポートします。

import sys
import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject

プロジェクト操作のために project モジュール 、ログ出力のために debug モジュール をインポートします。

設定するボイスリミットグループを取得

ウェーブフォームリージョンに設定するボイスリミットグループを取得します。
ボイスリミットグループの取得には、「 ゲームデータ(ACF, ACB)の出力 」チュートリアルでのターゲットコンフィグの取得と同じように次の関数を使います。

関数名 説明
get_global_folder 全体設定フォルダー直下の各オブジェクトフォルダーを取得します
get_child_object 親オブジェクトを指定して、子オブジェクトを取得します

これらの関数を使って、ボイスリミットグループの取得をスクリプトで記述すると次のようになります。

# ボイスリミットグループフォルダーを取得
voicelimit_group_folder = acproject.get_global_folder("VoiceLimitGroupFolder")["data"]
# ボイスリミットグループ「VoiceLimitGroup_0」を取得
voicelimit_group = acproject.get_child_object(voicelimit_group_folder, "VoiceLimitGroup", "VoiceLimitGroup_0")["data"]

同時発音数を管理するためのボイスリミットグループは get_global_folder 関数 を使って、全体設定にあるボイスリミットグループフォルダーから取得します。
ボイスリミットグループフォルダーを取得後、 get_child_object 関数を使って、 ボイスリミットグループフォルダー直下のボイスリミットループ「VoiceLimitGroup_0」を取得して voicelimit_group 変数に格納しています。

ボイスリミットグループを設定するウェーブフォームリージョンを取得

続いて、次の関数を使って、ワークユニット以下の全てのウェーブフォームリージョンを取得します。

関数名 説明
get_workunit ワークユニットを取得します
find_objects 再帰検索を行い一致したオブジェクトをリスト形式で取得します

これらの関数を使って、ウェーブフォームリージョンの取得をスクリプトで記述すると次のようになります。

# ワークユニットを取得
workunit = acproject.get_workunit("WorkUnit_Tutorial")["data"]
# find_objects を使って、キューシートに含まれるウェーブフォームリージョンのリストを取得
waveform_regions = acproject.find_objects(workunit, "WaveformRegion")["data"]

find_objects による複数ウェーブフォームリージョン取得 の解説

find_objects 関数を使用して、ワークユニット以下の全てのウェーブフォームリージョンをリスト形式で取得しています。
find_objects 関数には、「検索のルートとなるオブジェクト」、「取得するオブジェクトタイプ」を指定します。
ワークユニット以下の全ウェーブフォームリージョンの取得なので、 workunit 変数、"WaveformRegion" (ウェーブフォームリージョンのタイプ名)を指定して、取得したリストを waveform_regions 変数に格納しています。

各ウェーブフォームリージョンにボイスリミットグループを設定

先ほど取得したウェーブフォームリージョンのリストから1つずつウェーブフォームリージョンを取り出し、ボイスリミットグループを設定します。
ウェーブフォームリージョンのリストからウェーブフォームリージョンのを取り出しには for 制御文を使います。

# for を使って、ウェーブフォームリージョンリストからウェーブフォームリージョンを一つずつ取り出し
for region in waveform_regions:
# ウェーブフォームリージョンにボイスリミットグループを設定
acproject.set_value(region, "VoiceLimitGroup", voicelimit_group)
acdebug.log("[チュートリアル]find_objects関数を使う&ウェーブフォームリージョンにボイスリミットグループを一括設定 が完了しました")

スクリプトの保存と実行

これで本チュートリアルのスクリプト記述は終了です。
スクリプトを保存し、実行します。
スクリプトが正常に実行されると以下のように、ワークユニット内の全てのウェーブフォームリージョンにボイスリミットグループ「VoiceLimitGroup_0」が設定されます。

criatom_tools_atomcraft_api_tutorial_search_and_edit_voicelimitgroup.png