find_object 関数を使用してみよう

このチュートリアルでは、find_object 関数を使って、ワークユニットからキューシートを再帰的に検索し、複数の波形ファイルを連続処理でマテリアルに登録して、それらを参照するキューを作成するスクリプトを書いていきます。
プロジェクトの作成と波形ファイルをキューに登録 」チュートリアルでは、キュー、マテリアルを1つずつ作成しました。
実際のサウンドデータ製作では、1回に1つの波形ファイルを登録するのではなく、まとまった数の波形ファイルを一度にまとめて登録することが多いと思いますので連続処理の参考にしてください。

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

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

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

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

スクリプトの説明

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

# --Description:[チュートリアル]find_object関数を使う&複数波形ファイルの一括登録


モジュールのインポート

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

import os
import glob
import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject

フォルダーに含まれる波形ファイルパスを取得するため、glob という Python 標準モジュールをインポートします。
glob モジュールを使用すると、指定されたパターンに一致するファイルパスを取得することが出来ます。
プロジェクト操作のために project モジュール 、ログ出力のために debug モジュール をインポートします。

チュートリアル波形ファイルフォルダー内の波形ファイルリストを取得

glob モジュールを使って、チュートリアル波形ファイルフォルダー「/tutorial_data/tutorial_data02」以下の波形ファイル取得します。
スクリプトで記述すると次のようになります。

# 波形ファイルリストの取得
# チュートリアル波形ファイルフォルダー'tutorial_data/tutorial_data02'パスを取得
data_dir = os.path.dirname(os.path.dirname(__file__)) + '/tutorial_data/tutorial_data02'
# globを使って data_dir 内のファイルを取得
files = glob.glob(data_dir + '/*')
if len(files) == 0:
acdebug.warning(data_dir + "にファイルがありません")
sys.exit()

ファイルリスト取得 の解説

glob.glob 関数で取得したファイルパスリストを files 変数に格納しています。
次に、len 関数を使って files 変数に格納されたファイルパスの個数を調べ、1つも無ければログを出力してスクリプトを終了するようにしています。

覚え書き
glob.glob 関数に指定したパスの最後の「*」は、ワイルドカードという検索パターンに使用する特殊文字です。
「*」(アスタリスク)指定すると、フォルダーに含まれる全てのファイルを取得します。

マテリアルフォルダーとキューシートの取得

次の関数を使ってワークユニットを取得し、波形ファイルを登録するマテリアルフォルダーと、キューを作成するためのキューシートを取得します。

関数名 説明
get_workunit ワークユニットを取得します
get_material_rootfolder マテリアルルートフォルダーを取得します
find_object 再帰検索を行い一致したオブジェクト取得します

find_object 関数を使用したキューシートの取得をスクリプトで記述すると次のようになります。

# 波形ファイルを登録するワークユニットを取得
workunit = acproject.get_workunit("WorkUnit_Tutorial")["data"]
# 波形ファイル登録先のマテリアルルートフォルダーを取得
material_root_folder = acproject.get_material_rootfolder(workunit)["data"]
# キューを作成するキューシートを取得
cuesheet = acproject.find_object(workunit, "CueSheet", "Tutorial")["data"]

find_objectを使ったキューシート取得 の解説

find_object 関数を使用してキューシートの取得をしています。
find_object 関数には、「検索のルートとなるオブジェクト」、「取得するオブジェクトタイプ」、「取得するオブジェクト名」を指定します。
find_object 関数は、指定された値を元にオブジェクト構造を辿って、条件に一致した最初のオブジェクトを戻します。
このため、スクリプトでオブジェクト階層を辿ることなく、1回の呼び出しで目的のオブジェクトを取得することができます。

波形ファイルリストからキューを作成

次の関数を使って、先ほど取得したファイルパスのリストから1つずつファイルパスを取り出し、マテリアルとキューを作成します。

関数名 説明
register_material 波形ファイルを登録します
create_simple_cue マテリアルから情報を使って新規に単純なキューを作成します

ここでは、キューの作成に create_simple_cue 関数を使用します。
for 制御文を使用して、glob.glob 関数で取得したファイルパスリストの要素数分、連続処理します。 これらの処理をスクリプトで記述すると次のようになります。

for file in files:
# マテリアルルートフォルダに波形ファイルを登録、マテリアルを作成
material = acproject.register_material(material_root_folder, file)["data"]
# 作成したマテリアル情報からキューを作成
acproject.create_simple_cue(cuesheet, material)

create_simple_cue 関数を使ったキュー作成 の解説

create_simple_cue 関数は、基本構成のキューを作成します。
create_simple_cue 関数には、「作成先のキューシート」、「キューが参照するマテリアル」を指定します。
作成するキューの名前にはマテリアル名(拡張子を除く)が使用されます。

覚え書き
制御文 for について
for file in files: のようにfor ~ in ~ : の文を for文 と言います。
for文 使うことで、配列に格納された情報を1つずつ順に取り出すことができます。

プロジェクト保存

波形ファイルの登録とキューの作成処理の記述ができました。 最後に、プロジェクトの保存処理を記述します。

# プロジェクトの保存
result = acproject.save_project_all()
if not result["succeed"]:
acdebug.warning("プロジェクトファイルの保存に失敗しました。")
acdebug.log("[チュートリアル]find_object関数を使う&複数波形ファイルの一括登録 が完了しました")

スクリプトの保存と実行

これで本チュートリアルのスクリプト記述は終了です。
スクリプトを保存し、実行します。
スクリプトが正常に実行されると、以下のように「tutorial_data02」内の波形ファイルのマテリアル登録が行われ、それらを参照するキューが作成されます。

criatom_tools_atomcraft_api_tutorial_search_and_edit_add_cues.png