JavaScriptがわからん。
しかしLuaはもっとわからん。
SynthV scriptとはなんぞや
Synthesizer Vというソフトを拡張するためのスクリプト。
ノートの操作だけでなく選択や再生、果ては画面操作まで何でもできる。
何でもできすぎて逆に不安になる。
この記事は何
スクリプトを書くたびに毎回既存のコードやらサンプルコードやらからコピペしているので
いいかげん真面目にメモを作ろうと思った。
筆者は基本C#しか書けないというかC#もまともに教わったことないので
いわゆる「お作法」みたいなものは何もわからない。
とりあえず最初に書くやつ
function getClientInfo() {
return {
"name": SV.T("Title"),
"author": "Maiko", // 作者名
"versionNumber": 1.00,
"minEditorVersion": 65537, // 実は「ライセンスとアップデート」のとこで見れる本体バージョン
"category": "Playback"
};
}
function getTranslations(langCode) {
if (langCode == "ja-jp") {
return [
["Title", "タイトル"]
];
}
return [];
}
画面上に表示される文字は一応SV.T("")
で囲って翻訳できるようにしておく。
(SynthV Forumに翻訳作って~と投げると誰かがやってくれる可能性あり)
カテゴリは適当。
よく使うオブジェクトまとめ
ノート関連
var groupReference = SV.getMainEditor().getCurrentGroup(); // 操作中のグループ(配置されてるやつ)
var group = groupReference.getTarget(); // 親グループ(音符の位置はグループ頭からの位置)
var selection = SV.getMainEditor().getSelection(); // 選択状態を取得したり操作したりするやつ
var selectedNotes = selection.getSelectedNotes(); // 今選択されてるノート
どうも、SynthVにもボカロやOpenUtauでいうパートみたいなものがあるらしい。DAWでいうクリップというか、ピアプロスタジオでいうリージョンというか。
それがNoteGroup
と呼ばれるもので、やっかいなことにこれはトラック上に同じグループを複数配置できる。編集の中身も共有される。
ので、親グループ・子グループみたいな概念が存在する。
仮に、配置されているものが子グループ、それらが共有しているノート情報が親グループとして、トラック上の(正確にはグループ内の)すべてのノートにアクセスしたいなら親グループから、今操作しているグループの開始位置とかを取得したいなら子グループから取得する。
選択しているノートを取得するだけならグループ情報は必要なく、このコードでいうselectedNotes
だけあればいい。
ちなみにスクリプトマニュアルでは子グループはNoteGroupReference
と書かれている。
その他のオブジェクト
// 再生状態を取得したり操作したりするやつ
var playback = SV.getPlayback();
// 分秒とBlickを変換したりするやつ
var timeAxis = SV.getProject().getTimeAxis();
// トラック
var track = SV.getMainEditor().getCurrentTrack();
// スクロール関連(CoordinateSystem)
var mainCoordSystem = SV.getMainEditor().getNavigation(); // ピアノロール
var trackCoordSystem = SV.getArrangement().getNavigation(); // トラック
-
BlickはMIDIでいうTickみたいなやつで、SynthV独自の単位?みたい。
Tickが一般的に4分音符=480なのに対しBlickの数字はめちゃくちゃ細かい。 -
ノートの項で書いたがノートの位置はノートグループ内での相対位置なので、再生バーの位置とノートの位置を比較する場合などは
playback.getPlayhead()
をTimeAxis
使ってBlickに直し、
(NoteGroupReferenceの開始位置+グループ内でのノートの位置)と比較する。 -
PlaybackControlは再生状態の取得も制御もできるし、CoordinateSystemは画面の表示範囲の取得もスクロール・ズームの制御もできる。
-
Arrangement
というワードがでてきたらだいたいトラックエリアの話。
他、覚え書き
// デバッグに詰まったらとりあえず出してみる
SV.showMessageBox("title", "message");
// 4分音符ぶんのBlick
var quarter = SV.QUARTER;
// パラメータパネルのオートメーション取得例
var pitch = group.getParameter("pitchDelta");
// 最後に絶対書くやつ
SV.finish();
できないこと
初期値の取得。
たとえば、ノートにパラメータ(マニュアルのビブラートとか)が設定されていないときはトラック(グループ?)のデフォルト値が使われるが、ノートからビブラートの情報を取得しようと思ってもUndefinedしか返ってこない。
何より、音素が未編集のとき取得できないのが一番やっかい。
また、歌唱モードだのマニュアルモードだのをはじめとする最近の機能絡みのパラメータもたぶん取得できない。