粗茶ですが

RubyとかArduinoとかDTMとか

Logic Pro X: Scripterプラグインの使い方 その1

Logic Pro Xでは待望のMIDI FXが追加され、今までアルペジエータ1つ使うのに多大な苦労をしていたのが大幅に改善されました。

デフォルトではアルペジエータをはじめランダマイザ、 コードトリガなどポピュラーなFXが用意されており、 デフォルトのFXだけでも非常に手軽で便利な物が揃ってます。

その中でも取り分けて面白いのが「Scripter」で、 MIDIのイベントをJavaScriptで加工する事が出来るというMIDIでStutterやりたい人にしか需要がなさそうなFXですw

今回はさわりだけ説明したいと思いますが、JavaScriptを多少知っていないと辛い内容です。。。。そして知ってる人にはリファレンス読めば十分という何とも中途半端・・・。

基本的な使い方

「ソフトウェア音源」か「外部 MIDI」トラックを追加して、 追加したトラックのミキサーで「MIDI FX」=> 「Scripter」を選択すればそのトラックにScripterが追加されます。

Scripterを設定

Scripterのウィンドウが開くので、「Open Script in Editor」を選択すると以下のコードが記述されたエディタが表示されて、

1
2
3
4
5
function HandleMIDI(event)
{
  event.trace();
  event.send();
}

上記の状態で、「Run Script」ボタンを押した後に、MIDIキーボードとかMIDIコン弄るとコンソールにばーっとMIDIイベントが出力されます。

また、ソフトウェア音源を設定するか、MIDI音源を接続している場合、押した鍵盤の音やMIDIコンから送られたCC等が音源に適用されます。

Script Editor

何が起きているのか

MIDI入力があった際に「HandleMIDI()」関数が自動的に呼ばれて、入力されたMIDIイベントのインスタンスが 引数である「event」変数に格納されます。

event変数に入るMIDIのイベント情報は、いろいろなオブジェクトのインスタンスになっており、 HandleMIDI()関数内でevent変数に格納されたインスタンスが持つメソッドなどを操作することにより様々な処理を施すことができます。

デフォルトのコードであれば以下の部分ですね。

  event.trace(); // trace()メソッドはeventに格納されているMIDI情報をコンソールに出力する
  event.send();  // send()メソッドはeventに格納されているMIDI情報を音源に出力する

インスタンスによって様々なメソッドが用意されており、 例えば、入力されたノート(鍵盤情報)の3度上のノートを出力するには以下の様なコードになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function HandleMIDI(event)
{
  event.trace(); // MIDI情報をコンソールに出力
  if (event instanceof Note) { // eventの中身がNoteオブジェクトのインスタンスだったら
    event.pitch += 4;          // 3度上のピッチにする
                               // Cのノートだった場合の加算する値と加算後のノートの関係は以下となる
                               // += 1  C#
                               // += 2  D
                               // += 3  D#
                               // += 4  E
                               // += 5  F
                               // += 6  F#
                               // += 7  G
                               // += 8  G#
                               // += 9  A
                               // += 10 A#
                               // += 11 B
                               // += 12 C +1oct
  }
  event.send();  // MIDI情報を音源に送る
}

4行目のif文で「instanceof」演算子を使って、event変数に格納されたインスタンスが「Note」オブジェクトであるかどうか判定をし、 Noteオブジェクトであった場合event.pitchプロパティの値に+4します。 そして、20行目のevent.send();で音源にMIDI情報が送られ、3度上の音が鳴るわけですね。

オブジェクトたち

鍵盤を押したり離したりした時にコンソールを見てみると、

[NoteOn channel:1 pitch:62 [D3] velocity: 88]
[NoteOff channle: 1 pitch:62 [D3] velocity: 64]

この様なログが出力されていると思います。 このログは3行目のevent.trace();によって出力されているevent変数に入っているMIDI情報ですが、NoteOnとNoteOffの二つの情報であることがわかります。

Scripterで用意されている各種オブジェクトは、MIDIで使用されるイベント毎に用意されています。 これらについては後々紹介しようと思いますが、どんなオブジェクトがあるのかはScripterプラグインのドキュメントで知ることが出来ます。

NoteOnとNoteOffもそれぞれ同名のオブジェクトが存在し、NoteOnの情報の時はNoteOnオブジェクト、NoteOffの時はNoteOffオブジェクトが使用されます。

しかし、if文のinstanceof演算子では「Note」オブジェクトかどうかを判定していて、NoteOn/NoteOffオブジェクトかどうかの判定ではなさそうに見えます。

実はこれScripterプラグインのマニュアルには記載されいませんが(実装例でNoteオブジェクトが使われていますがNoteオブジェクトの事には触れられていません)、NoteオブジェクトはNoteOn/NoteOffオブジェクトのプロトタイプとなっているようです。

incetanceof演算子はプロトタイプチェーンも含めて判定してくれるので、NoteOnかNoteOffのどちらかが来てもNoteオブジェクトかどうかの判定をするだけで済むようになっているんですね。

ちなみに、Noteオブジェクトでの判定を行わない場合は以下の様なちょっとかっこ悪いコードになります。

1
2
3
4
5
6
7
function HandleMIDI(event) {
  event.trace();
  if((event instanceof NoteOn) || (event instanceof NoteOff)){
    event.pitch += 4;
  }
  event.send
}

どうでしょう

ひとまずScripterがどのような物かのさわりだけは解ってもらえたかなと思います。

プリセットのスクリプトだけでも非常に楽しそうな事が出来るのが解りますが、自由自在に操れたらとても楽しそうだと思いませんか?

正直Logic使っててかつJavaScript知ってるという、どこに居るんだそんな人向けのプラグインですがやってみると意外と何とかなる物ですよ。

私もプログラミング自体が苦手なので、この文章を書くだけで四苦八苦しましたが・・・(^^;)

では、また次回!

Comments