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

フレーズ毎にラウドネスのノードを作るプラグイン

投稿:2021-10-02

Synthesizer V Proで弦巻マキAIを使うとフレーズ毎に声量がバラバラなのでVUメーターを見ながらラウドネスパラメーターを調整しています。 調整の仕方は、フレーズ毎にノードを4点追加、内側2点を持ち上げたり下げたりします。 ノードを4点追加するのは面倒なのでプラグインを作ろうという訳です。

これです。

-- フレーズ毎にラウドネスの区間を作る

local plugin_name = "ラウドネス区間生成(Lua)"

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

-- メニュー選択でここに来る
function main()
	-- ダイアログの内容
	local myForm = {
		title = plugin_name,
		message = "フレーズ毎にラウドネスの区間を作ります",
		widgets = {{
			type = "Slider",
			label = "外挿ノード間隔",
			name = "node_distance",
			format = "%3.1f 秒",
			minValue = 0.1,
			maxValue = 1.0,
			interval = 0.1,
			default = 0.1
		}},
		buttons = "OkCancel"
	}

	-- ダイアログ表示(モーダル)
	local result = SV:showCustomDialog(myForm)

	if result.status then
		-- 選択中のトラックのメイングループ
		local track = SV:getMainEditor():getCurrentTrack()
		local notegroup = track:getGroupReference(1):getTarget()
		local loudness = track:getGroupReference(1):getTarget():getParameter("loudness")
		local margin_sec = result.answers.node_distance
		local margin = SV:getProject():getTimeAxis():getBlickFromSeconds(margin_sec)
		-- 全音符数
		local phrase_start
		local phrase_end
		local num_note = notegroup:getNumNotes()
		local note_index
		for note_index = 1, num_note do
			-- 音符1個
			local note = notegroup:getNote(note_index)
			local blick_start = note:getOnset()
			local blick_end = note:getEnd()

			if nil == phrase_start then
				phrase_start = blick_start
				phrase_end = blick_end
			end

			if phrase_end == blick_start then
				-- フレーズが続く
				phrase_end = blick_end
			else
				-- フレーズが終わる
				add_partition(loudness, margin, phrase_start, phrase_end)

				phrase_start = blick_start
				phrase_end = blick_end
			end
		end

		if nil ~= phrase_start then
			-- フレーズが終わる
			add_partition(loudness, margin, phrase_start, phrase_end)
		end

		SV:showMessageBox(plugin_name, "区間を作りました")
	end

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

function add_partition(loudness, margin, blick_start, blick_end)
	local v = loudness:get(blick_start - margin)
	loudness:add(blick_start - margin, v)
	v = loudness:get(blick_start)
	loudness:add(blick_start, v)
	v = loudness:get(blick_end)
	loudness:add(blick_end, v)
	v = loudness:get(blick_end + margin)
	loudness:add(blick_end + margin, v)
end

ラウドネスを調整したいトラックを選択してプラグインを起動(メニュー|スクリプト|音量調整|ラウドネス区間生成(Lua)を選択)します。 フレーズ1つにつき、前2点と後2点の計4点を追加します。 それぞれのノード間を秒数(0.01秒~1.00秒)で指定します。 フレーズ間が短い場合は後のノードと次のフレーズの前のノードがラップするので秒数を減らした方が混乱しなくて済むと思います。 ノードを生成した後はフレーズの内側2点を選択してシフトキーを押しながら上下にドラッグするとノード2個が追従します。 あとはVUメーターを見ながらフレーズを聞き音量を調整してください。

バグがあるのが前提ですからSynthesizer V Proのプロジェクトを壊すかも知れません。 くれぐれもバックアップを確保してから作業してください。 プラグインの元ネタとして好きに書き替えてお使いください。 Synthesizer V Proのプラグインがもっと増えますように(-人-)