2
0

SynthV scriptを書くときの覚え書き

Posted at

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しか返ってこない。
何より、音素が未編集のとき取得できないのが一番やっかい。

また、歌唱モードだのマニュアルモードだのをはじめとする最近の機能絡みのパラメータもたぶん取得できない。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0