Logic Pro Scripter - DTMプログラミング言語探訪

[DTMプログラミング言語探訪](https://qiita.com/aike@github/items/77b3eccc6861de09513a)

# Logic Pro Scripter

## 概要

Apple社のDAWであるLogic Proには[Scripter](https://support.apple.com/ja-jp/guide/logicpro/lgce728c68f6/mac)というプラグインが付属しています。これはスクリプトでMIDIエフェクトを作成することができます。

## 用途

- MIDIエフェクト
- MIDIチャンネルマッパー
- 簡易シーケンサー

## 言語仕様

- JavaScript
- イベントコールバック
- MIDIメッセージ出力
- GUI API


公式リファレンス　[Logic ProのScripter MIDIプラグインのAPIの概要](https://support.apple.com/ja-jp/guide/logicpro/lgce3905a48c/10.6.2/mac/10.15.7)


## GUI仕様

リニアフェーダー、対数フェーダー、モメンタリボタン、メニューを作ることができます。デザインのカスタマイズはできません。

## プログラム例

### MIDIチャンネルマッパー

MIDIの1ch宛のメッセージを5ch宛に変更、2ch宛のメッセージを3ch宛に変更する。
MIDIチャンネル(1-16)を0-15の4bitで表現する言語が多い中、Scripterのevent.channelは1-16で表現するので少し注意が必要です。

```javascript:MidiMapper.pst
var map = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];

map[1] = 5; // map 1ch -> 5ch
map[2] = 3; // map 2ch -> 3ch

function HandleMIDI(event) {
  event.channel = map[event.channel];
  event.send();
}
```

### MIDIエフェクト

MIDI NoteOnを受信したらベロシティを減少しながらリピートすることでフィードバックディレイを実現する。

```javascript:MidiDelay.pst
// parameter
var delayTime = 400;
var feedback = 4;

// GUI
var PluginParameters = [
  {name:'Delay Time', type:'lin', unit:'msec',
  minValue:10, maxValue:400, defaultValue:400, numberOfSteps:400 - 10},	
  {name:'Feedback', type:'lin', unit:'',
  minValue:0, maxValue:8, defaultValue:4, numberOfSteps:8}
];

// GUI callback
function ParameterChanged(param, value) {
  if (param == 0) delayTime = value;
  if (param == 1) feedback = value;
}

// MIDI message callback
function HandleMIDI(event) {
  if (event instanceof NoteOn) {
    event.send();
    var off = new NoteOff(event);
    var startTime = 0;
    off.sendAfterMilliseconds(startTime + delayTime - 10);
    startTime += delayTime;
    for (var i = 0; i < feedback; i++) {
      event.velocity /= 2;
      event.sendAfterMilliseconds(startTime);
      off.sendAfterMilliseconds(startTime + delayTime - 10);
      startTime += delayTime;
    }
  } else {
    event.send();
  }
}
```


## 実行方法

Logic Proで、トラックのMIDI FXからScripterを選択
![scripter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/c38b2885-e086-ddbe-f2c5-22a9c99b59ff.png)

Scripterのプラグイン画面を開く
「Open Script in Editor」ボタンをクリックすると内蔵エディタが開くのでスクリプトを入力する
![scripter2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/c5314580-4d6e-0dde-0476-3b00a9526613.png)

「Run Script」ボタンをクリックして実行する
内容を変更したときは、その都度「Run Script」ボタンをクリックして変更を適用する
![scripter3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/1813eec9-b8ea-71e1-d661-8d209d92f1a0.png)

GUIはScripterのプラグイン画面に表示されます
![scripter5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/8895ccdd-537d-95f8-2ffc-be9b0e6ae4e8.png)

Scripterのプラグイン画面のタイトル部分をクリックしてスクリプトを保存する
![scripter4_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/b1b78080-d2f1-9a60-4900-accd7baf50d9.png)


## 感想

JavaScriptであるため記述は容易です。ショートカットキーを使おうとするとDAWが反応するなど内蔵エディタの使い勝手はあまりよくありません。
KONTAKT KSPのMulti Scriptと用途はほとんど同じであるものの、後続のプラグインを限定せずに使用できるため汎用的に使えます。
しかしながらDAWがLogic Proに限るので広く普及するのは難しいように思います。

[DTMプログラミング言語探訪](https://qiita.com/aike@github/items/77b3eccc6861de09513a)