CRI ADX2(AtomCraft)
ロボット編15 CSVを使ったキューシートの作成

これまでのチュートリアルでは、データ操作に必要な情報を全てスクリプトに直接記述してきました。
ゲームのサウンドデータ作成では、作成すべきサウンドの情報をExcelなどのスプレッドシートにて管理していることが多いと思います。
以降のチュートリアルでは、スクリプトでCSV形式のサウンドリストを読み込み、データ作成、データチェックを行う方法について習得します。

このチュートリアルでは、次のような書式のCSVファイルを使用して以下の操作をするスクリプトを書いてきます。

  • CSVファイル名でキューシートを作成
  • 波形ファイルの登録
  • キューの作成
波形ファイル名 キュー名 キューID コメント
Alert.wav SE1000_Alert 1000 警報
Attack_03.wav SE1001_Attack 1001 攻撃
ObjectAppearance.wav SE1002_ObjectAppearance 1002 出現
~ ~ ~ ~

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

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

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

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

スクリプトの説明

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

# --Description:[チュートリアル]CSV を使ったキューシートの作成

モジュールのインポート

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

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

CSVファイルをインポートするため、Pythonの標準ライブラリのcsvモジュールをインポートします。
プロジェクト操作のためにProjectモジュール、ログ出力のためにDebugモジュールをインポートします。

波形ファイルフォルダーとインポートするCSVファイルのパスの設定

読み込みするCSVのパスを設定します。
作業スペースの’tutorial_data/tutorial_data03’以下のtutorial_data3.csvを指定します。

これらの処理をスクリプトで記述すると次のようになります。

# 音声データフォルダーとインポートするCSVファイルのパスの設定
# 音声データのフォルダーパス
data_dir = os.path.dirname(os.path.dirname(__file__)) + '/tutorial_data/tutorial_data03'

# CSVファイルのパス
csv_path = data_dir + "/tutorial_data3.csv"

# CSVファイルが存在するかチェック
if os.path.isfile(csv_path) == False:
    acdebug.log("CSVファイルが見つかりません: " + csv_path)
    sys.exit()

波形ファイルフォルダーとインポートするCSVファイルのパスの設定 の解説

読み込みするCSVファイルには、波形ファイルのフルパスではなく、波形ファイル名のみ記述しています。
register_material関数を使った波形ファイルの登録にはフルパスを指定する必要があります。
あとで波形ファイルのフルパスを作るため、波形ファイルのフォルダー「waveform_dir」とCSVパス「csv_path」を分けて変数定義しています。
ファイルが存在しない場合、スクリプトを中断できるように、os.path.isfile関数でファイルが存在するかのチェックを記述しています。

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

読み込んだCSV情報には、波形ファイル名と作成するキューの情報が記述されています。
次の関数を使って、波形ファイルを登録するためのマテリアルフォルダーの取得と、キューを作成するためのキューシートの作成を行います。

関数名 説明
get_workunit ワークユニットを取得します
get_material_rootfolder ワークユニットのマテリアルルートフォルダーを取得します
get_cuesheet_rootfolder ワークユニットのキューシート ルートフォルダーを取得します
create_object タイプを指定してオブジェクトを作成します

作成するキューシートの名前には、拡張子を除いたCSVファイル名を使用します。
これらの処理をスクリプトで記述すると次のようになります。

# ワークユニットを取得
workunit = acproject.get_workunit("WorkUnit_Tutorial")["data"]
material_root_folder = acproject.get_material_rootfolder(workunit)["data"]

# キューシートルートフォルダ
cuesheet_rootfolder = acproject.get_cuesheet_rootfolder(workunit)["data"]

# 拡張子なしのファイル名をキューシート名にしてキューシートを作成
cuesheet_name = os.path.splitext(os.path.basename(csv_path))[0]
cuesheet = acproject.create_object(cuesheet_rootfolder, "CueSheet", cuesheet_name)["data"]

拡張子なしのファイル名の取り出しの解説

CSVのパスから拡張子なしのファイル名の取り出しには、osモジュールの os.path.splitext 関数、os.path.basename関数を使います。
os.path.basename関数は、パス文字列からファイル名を取得します。
os.path.splitext関数は、最後(一番右側)のドット.で文字列を分割します。
2つの関数を組み合わせて、拡張子なしのファイル名を取得しています。

CSV ファイルを開く

ここからは実際にCSVファイルを読み込み、マテリアルの登録・キューを作成する処理になります。
CSVファイルの読み込みには、csvモジュールの csv.reader関数を使います。
open関数でファイルを開き、ファイルオブジェクトを取得し、csv.reader関数に指定します

# CSVファイルを開いて、読み込み
with open(csv_path) as f:
    reader = csv.reader(f)
withブロックについて
open関数を使用する際、withブロックを使わずに、f = open("ファイルパス") のように記述することもできます。
しかしこの場合、ファイルの読み込み終了したら必ずclose関数でファイルを閉じてあげる必要があります。
withブロックを使うとブロックの終了時に自動的にクローズされます。
閉じ忘れがなくなるのでとても便利です。

CSVファイルからデータを作成(波形ファイルの登録、キューシート、キュー作成)

次の関数を使って、CSV ファイルの内容を1行ずつ読み込み、マテリアルの登録・キューを作成を行います。

関数名 説明
register_material 波形ファイルを登録しマテリアルを作成します
create_simple_cue マテリアルから情報を使って新規に単純なキューを作成します
set_values 指定したオブジェクトのパラメーターをまとめて設定します
指定には、キーをフィールド名、バリューをパラメーターの値の文字列とした連想配列を使用します

これらの処理をスクリプトで記述すると次のようになります。

    for row in reader:
        wave_file_path = "" # 波形ファイルパス格納用
        row_params = {}     # キューのパラメーター情報格納用

        # CSVの各列を取得
        wave_file_path = data_dir + "/" + row[0]  # 波形ファイル名
        row_params["Name"] = row[1]               # キュー名
        row_params["CueID"] = row[2]              # キューID
        row_params["Comment"] = row[3]            # コメント

        # 波形ファイルを登録して、マテリアルを作成
        material = acproject.register_material(material_root_folder , wave_file_path)["data"]
        # マテリアルからキューを作成
        cue = acproject.create_simple_cue(cuesheet, material)["data"]
        # キューのキュー名、キューID、コメントを更新
        acproject.set_values(cue, row_params)
acdebug.log("[チュートリアル]CSV を使ったキューシートの作成 が完了しました。")

CSVファイルからデータを作成の解説

for制御文を使ってreader変数からCSVの内容を1行ずつ取得していきます。
取得したCSVのデータは、「,(カンマ)」ごとに分割されrowに配列で格納しています。
rowには、「波形ファイル名、キュー名、キューID、コメント」の順で格納されています。
1つずつ情報を取得し、波形ファイルの登録、マテリアルを作成、キューの作成を順に行い、作成したキューに対して、CSVから取得した「キュー名、キューID、コメント」情報を設定しています。

プロジェクト保存

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

# Save Project
result = acproject.save_project_all()
if not result["succeed"]:
    acdebug.warning("プロジェクトファイルの保存に失敗しました。")

スクリプトの保存と実行

これで本チュートリアルのスクリプト記述は終了です。
スクリプトを保存し、実行しましょう。
スクリプトが正常に実行されると以下のように、CSVファイルの情報に従ってキューシート「tutorial_data3」が作成され、その中にキューが作成されます。