これは何?
2週間ほど前に、Synthesizer V Studio Pro を購入し、オリジナル曲のボーカルトラックを作成しています。
その中で、スクリプト機能が使えるということを知ったので少し試してみました。
- Synthesizer V
- Dreamtonicsが開発する強力な音声処理エンジンと直感的で柔軟なユーザーインターフェースを併せ持つ歌声合成ソフトウェア。簡単にいうと、初音ミクとかのVOCALOIDみたいなものです。
今回作成するもの
選択しているノートを1オクターブあげるスクリプトを作ってみようと思います。
ちなみにスクリプトの対応言語は、JavaScript
と Lua
になりますが、今回は JavaScript
で試してみます。
公式ドキュメント: https://resource.dreamtonics.com/scripting/ja/index.html
はじめに枠組みを作る
スクリプトの構成には、以下の2つのグローバル関数が必ず必要になります。
-
getClientInfo()
- スクリプトがホストに読み込まれたときに呼び出されます。スクリプトの名前、作者、スクリプトのバージョン、スクリプトを実行するために必要な Synthesizer V Studio の最小バージョン番号を記述したオブジェクトを返します。
-
main()
- ユーザがスクリプトを実行したときに呼び出されます。
function getClientInfo() {
return {
"name" : "Raise octave",
"category" : "Edit note", // categoryの項目を追加すると、スクリプトのメニューが階層表示されます。
"author" : "m.i",
"versionNumber" : 1,
"minEditorVersion" : 65540
};
}
function main() {
// 選択しているノートを1オクターブあげる処理を書く
}
選択中のノートを取得する
まずはじめにホストのオブジェクトを取得します。
ホストのオブジェクトは、SV
という名前のグローバルオブジェクトで、スクリプトのどこからでもアクセスできます。
SV
から、ピアノロールのUIオブジェクトを取得します。
SV.getMainEditor()
さらにピアノロールから選択状態オブジェクトを取得します。
このオブジェクトでは選択解除などの操作や、選択中のノートの取得などが可能です。
SV.getMainEditor().getSelection()
最後に選択された Note の配列を、選択順に取得します。
SV.getMainEditor().getSelection().getSelectedNotes()
ノートを編集する
getSelectedNotes()
で取得した配列の要素は Noteオブジェクト になります。
Noteオブジェクトの関数には、歌詞・音程・音価の取得や設定が可能です。
普段、ピアノロールで打ち込みの作業をしている操作ができるイメージです。
まずは、getPitch()
で MIDIノート番号を取得します。
MIDI | ノート番号 |
---|---|
C0 | 0 |
C1 | 12 |
C2 | 24 |
基本的にオクターブは12単位で変更すれば問題なさそうなので、取得したノート番号に12を足した値を設定してあげれば、1オクターブ上がりそうです。
ノート番号の設定には、setPitch()
を使います。
スクリプトの仕上げ
今までに説明した内容をmain
関数に追加して、最後にスクリプトの終了を示す finish()
を追加して完成になります。
SV.showMessageBox()
を使用することでメッセージを出すことも可能なので、お好み応じて追加してみてください。
function getClientInfo() {
return {
"name" : "Raise octave",
"category" : "Edit note",
"author" : "m.i",
"versionNumber" : 1,
"minEditorVersion" : 65540
};
}
function main() {
var selection = SV.getMainEditor().getSelection();
var selectedNotes = selection.getSelectedNotes();
for(var i = 0; i < selectedNotes.length; i++) {
var note = selectedNotes[i];
note.setPitch(note.getPitch() + 12)
}
SV.showMessageBox("Raise octave", "finish");
SV.finish();
}
実際に完成したスクリプトを取り込む方法などは、下記を参考にしてください。
最後に
今回作成したものは、ピアノロール上でも簡単にできるので恩恵は少ないですが、
今後打ち込みを進めていく中で、操作が面倒だなと思ったことがあれば、今回調べたことを応用して実用的なスクリプトを作っていけたらと考えています。