CRI ADX2(AtomCraft)
ロボット編10 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」内の音声ファイルのマテリアル登録が行われ、それらを参照するキューが作成されます。