気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【VOCALOID3】ジョブプラグイン(Lua Script)*自分用メモ

VOCALOID3では、luaスクリプトを用いて各トラックのプロパティ値を一括で設定することが可能。
ノートイベントやトラックを取得する関数が用意されており、Luaスクリプト側で呼び出すイメージ。

サンプルファイルをざっくりと見てみた。



function manifest()
    myManifest = {
        name = "ジョブ名",
        comment = "Jobコメント", 
        author = "作者",
        pluginID = "{77E0B197-7E0D-46b5-A78E-FCCE63545372}",
        pluginVersion = "1.0.0.1", -- バージョン情報
        apiVersion = "3.0.0.1" -- VOCALOID3のバージョン
     }

    return myManifest
end

function main(processParam, envParam)
-- 実行時に渡されたパラメータを取得

local beginPosTick = processParam.beginPosTick -- 選択範囲の始点時刻(ローカルTick).

local endPosTick   = processParam.endPosTick -- 選択範囲の終点時刻(ローカルTick).

       -- カレントソングポジション時刻(ローカルTick).

local songPosTick  = processParam.songPosTick

      -- 実行時に渡された実行環境パラメータを取得します.

       -- Luaスクリプトが配置されているディレクトリパス(末尾にデリミタ "\" を含む).

local scriptDir  = envParam.scriptDir


        -- Luaスクリプトのファイル名.

        local scriptName = envParam.scriptName
        

        -- Luaプラグインが利用可能なテンポラリディレクトリパス(末尾にデリミタ "\" を含む).

        local tempDir    = envParam.tempDir

     -- 正常終了.

        return 0
end

ジョブプラグインの情報を設定するmanifest関数と
実際のジョブ処理の内容を示すmain関数(エントリポイント)が基本。
自分で関数定義することもできると思う(まだ試してない)

○manifest関数
manifest関数内では、そのプラグインの自体の情報を記述する。
「Jobプラグインを実行」を選択したときに、埋め込んだプラグイン情報がVOCALOID3自体から
呼び出されて、読み込まれるっぽい。
無題


○main関数(エントリポイント)
ジョブの内容はこの関数の中に書くよ。
mainにはprocessParamとenvParamっていう実行時のパラメーターが渡される。

[processParam]
processParam.beginPosTick => 選択範囲の開始位置
processParam.endPosTick => 選択範囲の終了位置
processParam.songPosTick => 現在のカーソル位置

渡された値の形式としては、
例えば現在のソングポジションが[2:1:0]2小節1拍目である場合
分解能(tick)×4拍分の数値が戻される(1拍=480tickの場合1920・・・というか480tickが一般的みたいだから細かく書かなくても良かったかも)

[envParam]
envParam.scriptDir => Luaスクリプトのディレクトリパス
envParam.scriptName => Luaスクリプトのファイル名
envParam.tempDir => プラグインが利用可能なテンポラリディレクトリパス(これはまだようわからん)


*勉強がてらに、今後使いそうな関数についてサンプル見ながらメモしていく。

○ダイアログを表示して、パラメーターを入力させたい場合


VSDlgSetDialogTitle("Jobプラグインパラメータ入力")

-- ダイアログにフィールドを追加するよ
local dlgStatus
local field = {}
field.name = "field_name"
field.caption = "フィールドの説明"
field.initialVal = "初期値"
field.type = 1
dlgStatus = VSDlgAddField(field)
field.name = "field_name2"
field.type = 3
dlgStatus = VSDlgAddField(field)
field.name = "field_name3"
field.type = 4
dlgStatus = VSDlgAddField(field)
-- パラメータ入力ダイアログを表示しましょう
dlgStatus = VSDlgDoModal()
if (dlgStatus ~= 1) then
    -- OKボタンが押されなかったら終了おおおお
    return 1
end

無題


Luaスクリプトのテーブル{}で、
テーブル名.キー名 = 値
として、fieldを定義するようだ。
なお、field.typeについては各値ごとにフォームの形式を変えることができる。
1:チェックボックス
3:テキストボックス
4:コンボボックス

パラメーターを取得するにはVSDlgGetStringValue("キー名")を指定して、
以下のように記述すればいいみたい。

-- 変数定義するよ
local field_value01 -- 変数名は任意
local field_value02
local field_value03
-- 変数に値をセットするよ
dlgStatus, field_value01 = VSDlgGetStringValue("field_name")
dlgStatus, field_value02 = VSDlgGetStringValue("field_name2")
dlgStatus, field_value03 = VSDlgGetStringValue("field_name3")

○各ノートを取得したい場合

VSSeekToBeginNote(), VSGetNextNoteEx()という関数を利用するらしい。

サンプルではnoteExとnoteExList、あとnoteCount、retCode、idxっていう変数が定義されていて、
whileループで各ノートを取得していた。

-- テーブル変数定義っす
local noteEx = {} -- ノート自体
local noteExList = {} -- ノート一覧
local noteCount -- 取得したノート数
local retCode -- リターンコード。VSGetNextNoteEx関数の戻り値か?まだノートがあったら1が戻されるよ
local idx -- 現在のノート位置を示します

-- 以下処理書くよ
VSSeekToBeginNote() -- 今からノート読むよー
idx = 1 -- テーブルの一番目から格納するぜ
retCode, noteEx = VSGetNextNoteEx() -- ノートを取得して、リターンコードとノートの変数に入れるよ

while(retCode == 1) do -- リターンコードが1なら、まだノートあるからずっと処理するよ
    noteExList[idx] = noteEx -- noteEx変数に入れたものを一覧に移し変えてあげるよ
    retCode, noteEx = VSGetNextNoteEx() -- 次のノート取得するよ。なければリターンコードは0を戻すぜ
    idx = idx + 1 -- もうidx番目に格納しちゃったから、値増やすよ
end

noteCount = table.getn(noteExList) -- table.getn関数を使って、テーブルの件数をカウントするよ

ひとまずはこんな感じで。

=====================

*宣伝*
昨晩、ボカロ曲アップしました!
ボーカルはGUMI Powerです。宜しければ聞いてくださいっ!

【GUMI Power】モノクロストリング