ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

Synthesizer V Proのスクリプトを作った

2020-08-08

AIきりたん(Neutrino)が生成するf0ファイルを参照してピッチベンドを設定すれば、AIきりたんのように歌う琴葉茜・葵さん達になるかと思った。 けれど、実際にスクリプトを作って設定してみるとf0の音程がメロディ自体を示していない時があるので、とても音痴になりました。

せっかくスクリプトの作り方が分かったので、実用的(?)なのを作りました。

-- ピッチベンドをシフト

local plugin_name = "ピッチベンドをシフト(Lua)"

-- プラグイン情報
function getClientInfo()
  return {
    name = plugin_name,
    category = "ピッチ調整",
    author = "lemorin_jp",
    versionNumber = 0,
    minEditorVersion = 0
  }
end

-- メニュー選択でここに来る
function main()
  -- ダイアログの内容
  local myForm = {
    title = plugin_name,
    message = "トラック全体のピッチをシフト",
    buttons = "OkCancel",
    widgets = {
      {
        name = "shift",
        type = "Slider",
        label = "シフト量",
        format = "%3.0f cent",
        minValue = -100,
        maxValue = 100,
        interval = 1,
        default = 0
      },
    }
  }

  -- ダイアログ表示(モーダル)
  local result = SV:showCustomDialog(myForm)
  if result.status then
    -- Okならダイアログの設定をグローバル変数へ
    pitch_shift = result.answers.shift
    -- 100ms遅延以降にonShiftStartを開始
    SV:setTimeout(100, onShiftStart)
  else
    -- プラグイン終了
    SV:finish()
  end
end

-- 処理開始
function onShiftStart()
  -- 処理に必要なオブジェクトと値をグローバル変数に保存

  -- 選択中のトラックのピッチベンド
  trackAutomation = SV:getMainEditor():getCurrentTrack():getGroupReference(1):getTarget():getParameter("Pitch Deviation")

  -- 全ポイント
  points = trackAutomation:getAllPoints()

  -- ポイント数
  point_num = #points

  -- 処理対象のインデックス
  point_index = 1

  -- 100ms遅延以降にonShiftProcessを開始
  SV:setTimeout(100, onShiftProcess)
end

-- 処理中
function onShiftProcess()
  -- 適当にポイント100個分を処理
  for i = 1, 100 do
    -- 全部のポイントを終了
    if point_num < point_index then break end

    local point = points[point_index]
    point_index = point_index + 1

    -- ブリックとピット
    local br = point[1]
    local pitch = point[2]

    -- ピッチベンドを変更
    trackAutomation:add(br, pitch + pitch_shift)
  end

  -- 未処理のポイントがある?
  if point_index <= point_num then
    -- 処理継続
    SV:setTimeout(50, onShiftProcess)
  else
    -- 100ms遅延以降にonShiftDoneを開始
    SV:setTimeout(100, onShiftDone)
  end
end

-- 処理終了
function onShiftDone()
  -- 終了報告(モーダル)
  SV:showMessageBox(plugin_name, "シフトしました")

  -- プラグイン終了
  SV:finish()
end

スクリプト(shift_pitch.lua)をフォルダにコピー後、Synthesizer V Proのメニュー「スクリプト|再スキャン」を選択すると、 スクリプトのメニュー「スクリプト|ピッチ調整|ピッチベンドをシフト(Lua)」が追加されます。 ピッチを変更したいトラックを選択後、スクリプトを実行すると次のダイアログが表示されます。 ダイアログの確定ボタンをクリックするとダイアログが消えてシフト処理が始まります。 バックグランドで100ms(以上)毎に処理を進め、終わるとメッセージボックスが表示されて完了です。