UVI Falcon UVI Script - DTMプログラミング言語探訪

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

# UVI Falcon UVI Script

## 概要

UVI社のシンセサイザー[Falcon](https://www.uvi.net/instruments/falcon.html)はScript Processorモジュールを持っており、UVI Scriptでプログラミングができます。Falconの商用ライブラリはUVI Scriptでその挙動やGUIが作りこまれています。

## 用途

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

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

## 言語仕様

- Lua言語
- イベントコールバック
- サウンドエンジンAPI
- GUI API

Lua言語なので、記述能力は現代的な汎用プログラミング言語と同等です。
DAWの小節内位置など取得できるので表拍と裏拍で鳴らし方を変えるようなことも実現可能。

[公式リファレンス](https://www.uvi.net/uviscript/)
[公式チュートリアル](https://www.uvi.net/uviscript/_tutorial.html)

Falconには、再生専用の無料版UVI Workstationも用意されています（KONTAKTに対するKONTAKT PLAYERに相当）。しかしながらUVI Workstationが読めるファイル形式はUFSサウンドバンク(.ufs)のみで、個別のプログラム(.uvip)やマルチ(.uvim)形式は読み込めないようです。UFSサウンドバンクを自作するには[ライセンス契約が必要](https://support.uvi.net/hc/ja/articles/360003728197-%E8%87%AA%E5%88%86%E3%81%A7UFS%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%83%90%E3%83%B3%E3%82%AF%E3%81%BE%E3%81%9F%E3%81%AFFalcon-Expansions%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-)になります。
Falconユーザー同士であれば、プログラムやマルチ形式でライブラリを渡すことができます。

## GUI仕様

ノブやボタンなどのコントローラーはサイズ、位置、背景色を自由に指定できます。画像を使った独自デザインのコントローラーも作成可能です。
UI全体の背景やロゴなどの画像を読み込んで表示することも可能。

FalconのUIは、EDITタブやEVENTSタブ選択時に表示される個別のUIと、INFOタブ選択時に表示される全体のUI（パフォーマンスビュー）があります。GUIパーツを配置すると個別UIに表示されます。プログラム中でmakePerformanceView()と記述するとそれがパフォーマンスビューにも反映されます。
UIの最大サイズは[ドキュメント](https://www.uvi.net/uviscript/_u_i_page.html#UILayout)によると720x480となっています。

個別のUI表示の例
![falcon6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/635a4483-181e-3bb6-9277-70050934936d.png)

パフォーマンスビューに表示した例
![falcon7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/08d0fb6e-c221-f955-133c-f103a50e023a.png)


## プログラム例

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

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

```ShowNoteNumber.lua
function onNote(e)
  playNote(e.note, e.velocity)
  print(string.format("note = %d", e.note))
end
```

コンソール画面は画面右上の2番目のアイコンをクリックすると表示されます。
![falcon8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/0d113051-221f-a72e-dd05-3012ffc50605.png)


### デチューン

デチューンされた二つの音を鳴らす例です。デチューンの幅はノブで指定します。

```Detune.lua
-- add knob
knobDetune = Knob("Detune", 0.1, 0, 0.5)

-- callback
function onNote(e)
  local voice1 = playNote(e.note, e.velocity)
  local voice2 = playNote(e.note, e.velocity)
  changeTune(voice1, knobDetune.value)
  changeTune(voice2, -knobDetune.value)
end
```
![falcon6_noskin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/b204172b-44a9-77de-a1b5-ec1248af8513.png)

同じスクリプトでGUIに画像や色を設定する例です。

```Detune2.lua
-- setup panel
setSize(720, 120)
setBackground("panel.png")

-- add knob
knobDetune = Knob("Detune", 0.1, 0, 0.5)
knobDetune.size = {60, 60}
knobDetune.pos = {80, 30}
knobDetune.fillColour = "#eeee88"
knobDetune.outlineColour = "orange"

-- show performance view
makePerformanceView()

-- callback
function onNote(e)
  local voice1 = playNote(e.note, e.velocity)
  local voice2 = playNote(e.note, e.velocity)
  changeTune(voice1, knobDetune.value)
  changeTune(voice2, -knobDetune.value)
end
```
![falcon6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/635a4483-181e-3bb6-9277-70050934936d.png)



## 使用方法

### MASTERに適用する場合

あらかじめ.luaファイルを用意しておく。
EVENTSタブを選択
右上の＋アイコンをクリック
Script Processor→Default
![falcon1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/e0de00a7-16f7-03ba-1d7c-84a719aa2219.png)

左端のフォルダアイコンからLuaファイルを選択
内蔵エディタはありませんが、左から3番目のEditアイコンで外部エディタを呼び出せます
右端のWatchアイコンを有効状態にしておくと、ファイルを編集してセーブしたら自動的に適用されます。
![falcon2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/95c25bee-1081-b131-0822-ad50fd3f01dc.png)

複数のスクリプトを適用することもできます。その場合画面の上側にあるスクリプトから順番に実行されます。
![falcon3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/5d809b60-8248-5294-6ac0-5e0b0591f800.png)


### 各PARTに適用する場合

あらかじめ.luaファイルを用意しておく。
EDITタブを選択
PROGRAMのEVENTレーンで＋アイコンをクリック
Script Processor→Default
![falcon4_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/6600fca9-d8d3-3eba-822b-76f14367c885.png)

左端のフォルダアイコンからLuaファイルを選択
内蔵エディタはありませんが、左から3番目のEditアイコンで外部エディタを呼び出せます
右端のWatchアイコンを有効状態にしておくと、ファイルを編集してセーブしたら自動的に適用されます。
![falcon5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/4bff042c-61ea-0512-0e64-742c6acc1851.png)


## 感想

Lua言語であるため学習コストも低く、カスタマイズできるパラメータも多いため大きな可能性を感じます。ただ、Falcon自体の普及度とUVI Scriptの普及度が今のところネックになっているように思います。
サンプリング音源もオシレータとして使えてKONTAKTに近いことができるので（ただしUIはKONTAKTほどの自由度はない）、今後サードパーティーから今以上にライブラリがリリースされて市場が大きくなることに期待します。


ちなみにMOTU社の[MachFive](https://motu.com/products/software/machfive)というサンプラーソフトも、UVIエンジンを搭載しUVI Scriptに近いLuaベースのMachFiveScriptでプログラミングできます。しかしながら、2011年のバージョン3以降アップデートされておらず、MachFiveの実質的な後継がUVI Falcon2と見てよさそうです。

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