(importer.jsx)
#include "./jsx/Commands.jsx"
#include "./jsx/ScriptDictionary2html.jsx"
#include "./jsx/utils.jsx"
var document;
var dialogue_track = 0;
var monologue_track = 1;
var temp_track = 6;
var interval_time = 15000;
var current = interval_time;
function main() {
$.writeln(app.reflect.properties);
if (app.name.indexOf("Audition") < 0) {
alert("Audition用のスクリプトです", "エラー", true);
return;
}
document = app.activeDocument;
if (!document) {
alert("アクティブなドキュメントがありません", "エラー", true);
return;
}
if (document.reflect.name != "MultitrackDocument") {
alert("マルチトラックセッションを選択してください", "エラー", true);
return;
}
if (document.audioTracks[temp_track].audioClips.length == 0) {
alert("TEMPトラックに今回使うwavをすべて追加してください(位置不問)", "エラー", true);
return;
}
var directory = document.path.substr(0, document.path.lastIndexOf("/"));
var source_directory = directory.substr(0, directory.lastIndexOf("/"));
var track_num = directory.substr(directory.lastIndexOf("/") + 1,100)
var f = new File(source_directory+"/scenario.json")
f.encoding="utf-8";
var flag = f.open("r");
if (!flag){
alert("ファイルを開けません");
return;
}
var json_data = f.read();
f.close();
var json = eval (json_data);
var paragraphs = json[track_num - 1]["paragraphs"];
importWave(paragraphs,directory);
alert("インポート完了しました", "完了", false);
}
function importWave(p,dir) {
var l = p.length;
for (var i = 0; i < l; i++) {
switch (p[i]["type"])
{
case "comment":
break;
case "dialogue":
addVoice(dialogue_track,p[i]["line_no"]);
break;
case "monologue":
addVoice(monologue_track,p[i]["line_no"]);
break;
}
}
while (true) {
var l = document.audioTracks[temp_track].audioClips.length;
if (l>0) {
document.audioTracks[temp_track].audioClips.remove(document.audioTracks[temp_track].audioClips[l - 1]);
}
else {
break;
}
}
app.invokeCommand("View.ZoomResetTime");
}
function addVoice(track_num,name) {
var dest = document.audioTracks[track_num];
var src = document.audioTracks[temp_track];
var src_length = src.audioClips.length;
var i = 0;
for (i = 0; i < src_length; i++) {
if (name == src.audioClips[i].name) break;
}
if (i==src_length) {
alert("TEMPに"+name+"がありません。");
exit();
}
var srcClip = src.audioClips[i];
duration = srcClip.duration;
dest.audioClips.add(src.audioClips[i]);
var dest_length = dest.audioClips.length;
for (i = 0; i < dest_length; i++) {
if (name == dest.audioClips[i].name) break;
}
var destClip = dest.audioClips[i];
destClip.startTime = current;
current += duration;
current += interval_time;
}
main();
(scenario.json)
プレーンテキストの台本をパースしてこれを出力するrubyスクリプトは別途作りました。
[
{
"title": "トラック1.txt",
"paragraphs": [
{
"type": "dialogue",
"value": "「声に出す台詞」",
"line_no": "000"
},
{
"type": "comment",
"value": " Se 蹴り"
},
{
"type": "comment",
"value": "SE ぼよよん"
},
{
"type": "monologue",
"value": "(心の中の台詞)",
"line_no": "001"
}
]
},
{
"title": "トラック2.txt",
"paragraphs": [
{
"type": "comment",
"value": "SE ぶよぶよ"
},
{
"type": "dialogue",
"value": "「2トラック目の声に出す台詞」",
"line_no": "057"
},
{
"type": "monologue",
"value": "(こんな感じのJSONデータを元にマルチトラックセッションを構成します)",
"line_no": "058"
}
]
}
]
解説
-
tempトラックに使うクリップ(使わないものが混じっていてもいい、最終的にはこのトラックからはクリップが全削除される)を全部入れてこのスクリプトを実行すると、声に出す台詞(dialogue)と心の台詞(monologue)のトラックに振り分けていい感じに連結してくれる。
-
jsonをevalで強引に読み込んで、一行ずつ種類と名前の情報からtempのクリップを該当トラックに移動していく。
-
「1」フォルダにあるsesxファイルで実行すると、親フォルダにあるscenario.jsonの一つ目(配列インデックス0)のデータを参照して実行する。
-
外のディレクトリからクリップを読み込めればもっと良かったんだけどそのやり方は分かりませんでした。このまま他で使うことはまあないでしょうけど、クリップの移動とかのやり方のメモとして。
(修正履歴)
クリップの間隔を15000に変更(5000はだいぶ詰まって聞こえてた)