LoginSignup
0
1

More than 1 year has passed since last update.

VEGASスクリプトを組む際に気づいたこと

Last updated at Posted at 2023-02-07

はじめに

こんにちわ。
最近、ボイロ動画を作る際の効率化のために、VEGASのスクリプトを組もうとした際に気づいたことをQiitaに投稿しました。

これまでに作ったスクリプトはGithubで公開しております。
また、VegasScriptHelperリポジトリには、出来上がったDLLファイルをリリースとしてDLできるようになっております。

本記事では、それに加えて、VEGASスクリプトを組んだときに分かった注意点を書き出したいと思います。

1. イベントグループを作成するときの順番

VEGASスクリプトではイベントをグループとしてまとめることができます。
以下の順番が自然な流れと思えますが、これでは例外が発生します。

IllegalGroupCreate.cs
            // グループ作成
            TrackEventGroup group = new TrackEventGroup(Vegas.Project);

            // グループに対象のイベントを挿入
            foreach (TrackEvent trackEvent in events) { group.Add(trackEvent); } // Addメソッドで例外発生

            // グループにプロジェクトに追加
            Vegas.Project.TrackEventGroups.Add(group);

正しくは、以下のように実装します。

LegalGroupCreate.cs
            TrackEventGroup group = new TrackEventGroup(Vegas.Project);

            // まず、グループにプロジェクトに追加
            Vegas.Project.TrackEventGroups.Add(group);

            // それからイベント挿入
            foreach (TrackEvent trackEvent in events){ group.Add(trackEvent); }

2. プロジェクトの中身を変更する際の注意点

プロジェクトの中身を変更(追加・更新・削除)しようとすると、タイミングによってはSystem.FormatErrorSystem.Secury.SecurityExceptionが発生します。
特に、拡張機能として実行している場合は確実に発生します。

IncorrectEdit.cs
        SetStringIntoOFXParameter(param, "abc");

        :

        public void SetStringIntoOFXParameter(OFXStringParameter param, string value)
        {
            param.SetValueAtTime(new Timecode(0), value); // ここで例外発生
        }

これは、Undo対象と明示しないために発生するようです。

そのため、これらの処理を呼び出すときは、それをUndoBlockを作成し、using文のブロックで囲む必要があります。

CorrectEdit.cs
        using(new UndoBlock("テキストメディアに文字列設定"))
        {
            SetStringIntoOFXParameter(param, "abc");
        }

        :

        public void SetStringIntoOFXParameter(OFXStringParameter param, string value)
        {
            param.SetValueAtTime(new Timecode(0), value); // 例外が発生しなくなる
        }

3. Timecodeクラスインスタンスの出力

Timecodeクラスはイベントの開始時間や長さを示すために使用しますが、文字列として取得する場合にクセがあります。

ToStringメソッドの引数は省略可能なRulerFormat構造体で、省略時はRulerFormat.TimeAndFramesです。
これは、時・分・秒とフレーム数という単位になっており、VEGASでは標準な時間表記です。

しかし、「完全な時間単位で編集とかしたい」という場合もありますので、そういう場合は引数として明示的にRuleFormat.Timeを渡す必要があります。

余談ですが、VEGASではMV向けにトラックのルーラーを小節・拍単位でも表示できます。その形式で出力したいときにはRulerFormat.MeasuresAndBeatsを渡します。

4. エラーログの出力

スクリプトや拡張機能のデバッグをするときは、実際にVEGASを起動して行います。
しかし、例外によっては不親切なエラーメッセージやバグレポートダイアログが瞬時に表示されて、どこでどんな例外が発生しているのかわからなくなります。
そのため、メイン処理内で例外処理を施して、発生したらVisualStudioのログに出力したり、
万が一(例えばVEGAS起動処理中に発生)のためにメッセージボックスに表示させられるようにしたほうが便利です。

ShowLog.cs
            try
            {
                // メイン処理
            }
            catch(Exception ex)
            {
                string errMessage = "[MESSAGE]" + ex.Message + "\n[SOURCE]" + ex.Source + "\n[STACKTRACE]" + ex.StackTrace;
                Debug.WriteLine("---[Exception Occurred]---"); // ヘッダは適時変更
                Debug.WriteLine(errMessage);
                Debug.WriteLine("--------------------------");
                MessageBox.Show(
                    errMessage,
                    "エラー",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                throw ex;
            }

おわりに

VEGASのスクリプト仕様がめちゃくちゃ不親切なので、試行錯誤したり、VEGASのコミュニティで情報を漁ったりするなどして情報を集めました。疲れた…。

最後に、参考にしたVEGASのコミュニティやブログを紹介して筆を置きたいと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1