Steinberg HALion Script - DTMプログラミング言語探訪

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

# Steinberg HALion Script

## 概要

Steinberg社のサンプラーソフト[HALion](https://new.steinberg.net/ja/vst-instruments/halion/)の最上位版はLua Scriptモジュールを持っており、NoteOnイベントなどに応じた発音ロジックを記述することができます。

## 用途

NoteOnイベントに対応してサウンドエンジンのパラメータをカスタマイズしたり、タイマーイベントで音を鳴らしたりするのが主な使い方です。

- キースイッチなどによるアーティキュレーション切り替え
- 乱数やラウンドロビンによるヒューマナイズ
- スウィング
- アルペジエーター
- ストラミング
- GUI

## 言語仕様

- Lua言語
- イベントコールバック
- サウンドエンジンAPI
- パラメータ API
- MIDIファイルAPI

Lua言語なので、記述能力は現代的な汎用プログラミング言語と同等です。
DAWの小節内位置など取得できるので表拍と裏拍で鳴らし方を変えるようなことも実現可能。
GUIとは疎結合になっていて、値を取得するのにGUIエレメントを直接見るのではなく、パラメータレイヤを経由して参照します。

[公式リファレンス](https://developer.steinberg.help/display/HSD/HALion+Script+Home)

HALionには廉価版のHALion Sonicおよび無償版のHALion Sonic SEもありますが、HALion Scriptが使えるのは上位版のHALionだけのようです。

## GUI仕様

GUIはMACRO Page DesignerというWYSIWYGエディタで作成します。
作成したGUIのValueプロパティにパラメータをひもづけることでパラメータがGUIから操作可能になります。

ノブ、ボタン、スライダー、メニュー、テキストフォーム、テーブル、波形表示、XYパッドなど。
パーツを自作画像に置き換えられるため、独自デザインのGUIを作ることができます。
UI全体の背景やロゴなどの画像を読み込んで表示することも可能。

HALionにはMIDI module scriptの他にUI scriptという表示に関するスクリプトもあります。今回は発音に関係するMIDI module scriptの紹介となります。


## プログラム例

### ノートナンバー表示 

押された鍵盤のノートナンバーをコンソール画面に表示します。

```ShowNoteNumber.lua
function onNote(e)
  local id = postEvent(e)
  print(string.format("note = %d", e.note))
end
```

コンソール画面は右上の四角いアイコンをクリックすると表示されます。
![hal7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/4b474507-376d-3fc2-3773-a0ad9c61c897.png)


### デチューン

デチューンされた二つの音を鳴らす例です。デチューンの幅はノブで指定できるようパラメータとして定義しておきます。
ノブの作成手順は後述します。

```Detune.lua
defineParameter("Detune", "Detune width", 0.1, 0.1, 0.3, nil)

function onNote(event)
    local id1 = playNote(event.note, event.velocity, -1, nil, 1.0, 0.0, Detune)
    local id2 = playNote(event.note, event.velocity, -1, nil, 1.0, 0.0, -Detune)
    waitForRelease()
    releaseVoice(id1)
    releaseVoice(id2)
end
```

## 使用方法

### 音源の設定

音が鳴らないとスクリプトの効果がわからないので、仮音源としてシンセサイザーのオシレーターを挿入しておきます。

プログラムツリーでプログラム名を右クリックしてNew → Zone → Synth Zoneを選択
![hal1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/29de72bd-0e1a-d980-bdd1-bd7f453d835c.png)

プログラムツリーのプログラム名をスロットラックにドラッグ＆ドロップ
![hal2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/2ddbb34f-38d4-201b-cdd1-465c8a718b80.png)

これでとりあえず音が出るようになりました。

### スクリプトの設定

プログラムツリーでプログラム名を右クリックしてNew → MIDI Module → Lua Scriptを選択
![hal3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/22268aa7-e178-44d5-9879-309031a0e8bc.png)
右側のプログラムツリーでLua Scriptを選択、画面中央ではEDITセクション、SOUNDエディターを選択します
![hal4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/b6b739e9-2d28-56e4-1bf6-17ab71dc59da.png)
eボタンを押すと内蔵エディタが開いてスクリプトを入力できます
![hal5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/89267cf6-2d0d-01ff-a84c-1e09b094eac1.png)
OKボタンを押すとエディタが閉じてスクリプトが実行されます
![ha10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/51734d62-106e-4855-0954-4e6b8467142e.png)


### GUIの設定

Open New Windowボタン → Macro Page Designer Extendedを選択
Macro Page Designerという選択肢もありますがMacro Page Designer Extendedの方が見通しが良くておすすめです。
![hal8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/2c9f49cb-07f3-90d8-1e68-c0cc357353ff.png)
右側のプログラムツリーでプログラム名を選択してから、左端のCreate New Macro Page/LibraryボタンのCreate HALion Sonic Macro Pageを選択
![ha11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/e719eb5d-f1be-a3f7-655e-84bfb5aed601.png)
中央下のBROWSERでタイトル部をクリックしてBasic Controlsを選択
![ha12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/fbe90d36-7ee3-a47e-b64f-3631802ace42.png)
Knobsフォルダを開くとノブコントロールがいくつかあるのでデザイン画面にドラッグ＆ドロップ
![ha13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/2c2fb4f2-cec5-4774-cea8-13614c1c8804.png)
ノブのプロパティからラベル名をわかりやすい名前（ここではDetune）に変更
![ha14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/3f1e9e31-a472-413f-dde9-776ffc84412a.png)

### GUIとパラメータのひもづけ

Macro Page Designer Extended画面の右側にあるプログラムツリーでLua Scriptを選択
Lua Scriptを選択すると、左隣のパラメータリストにdefineParameter()で定義したパラメータが出てくる（ここではDetune）
そのパラメータをノブのプロパティのValue欄にドラッグ＆ドロップ
![ha15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/3672744f-9385-08f4-4f1b-1427d27f491d.png)

これで完成です。
HALion本体のウィンドウのMACROセクションを選択するとノブが配置されたパネルが表示されて、ノブを操作すると音にデチューンがかかります。
![ha16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/63236eed-10ab-d9e6-6c71-c9e35f072d01.png)


## 感想

UVI Script同様、Lua言語であるため学習コストも低く、カスタマイズできるパラメータも多いためポテンシャルは非常に高い機能です。エンドユーザーにはあまり使われない機能にも関わらず、GUIの自由度も含めここまでしっかり作りこんであってドキュメントも充実しているのはさすがSteinbergという印象です。
HALionはサンプラーとしても必要十分な機能を備えており、またシンセサイザーの各種オシレーターも内蔵しているのでNI KONTAKTやUVI Falconに決して負けておらず、むしろ優位な点がいくつもあるソフトウェアです。
しかしながらHALionの現状の利用率を考えると、人気の高いKONTAKTから市場を奪うのはなかなか厳しい気がします。また、廉価版とはいえそれなりに高価なHALion Sonicではスクリプト機能が使えないのも残念です。

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