HISE HiseScript
概要
オープンソースのサンプラー/シンセサイザーソフトHISEにはHiseScriptというJavaScriptをベースにした独自言語が用意されています。
HISEはモジュールをツリー状に積み重ねて楽器を構成します。スクリプトはそのモジュールごとに作成することができるため、小さな機能単位でモジュール化されたロジックを書くことができます。
用途
NoteOnなどのイベントに対応してサウンドエンジンのパラメータをカスタマイズしたり、タイマーイベントで音を鳴らしたりするのが典型的な使い方ですが、Webアクセスをはじめ非常に多くのAPIが用意されているため、可能性としてはそれだけにとどまりません。
Script FXは音声信号データを直接操作することが可能で、いわゆる信号処理を記述することができます。
GUIの作成やカスタマイズ、コールバックロジックなどもスクリプトで書くことができます。またGUIの作成はWYSIWYGエディタからおこなうこともできます。
- キースイッチなどによるアーティキュレーション切り替え
- 乱数やラウンドロビンによるヒューマナイズ
- アルペジエーター
- GUI
- 信号処理
言語仕様
- JavaScriptをベースにカスタマイズした独自言語
- イベントコールバック
- サウンドエンジンAPI
- ファイルAPI
- WebアクセスAPI
- GUI API
JavaScriptをベースに、newオペレータを廃止、namespace、inline関数、reg変数の追加など、動的なメモリ確保を最小限に抑え、より安全で高速に実行できる言語にカスタマイズされた独自言語です。
GUI仕様
スライダー(ノブ)、ボタン、コンボボックス、テーブル、波形表示などが用意されています。
パーツを自作画像に置き換えられるため、独自デザインのGUIを作ることができます。
UI全体の背景やロゴなどの画像を読み込んで表示するだけでなく、パス指定のベクタグラフィックスなど自由な描画ができます。
フローティングタイルを使用してWebページのように拡大縮小に対応した自動レイアウトも可能です。
プログラム例
ノートナンバー表示
押された鍵盤のノートナンバーを表示します。
ConsoleのCは大文字であることに注意してください。
function onNoteOn()
{
Console.print("note = " + Message.getNoteNumber());
}
MIDIチャンネルマッパー
HiseScriptはMIDIメッセージの操作も可能です。
ただし他のプラグインにMIDIメッセージを送ることはできないようなので、HISEに複数の発音モジュールをロードしてマルチティンバー楽器として使用する場合に利用できるスクリプトです。
const 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
functionon NoteOn()
{
Message.setChannel(map[Message.getChannel()]);
}
function onNoteOff()
{
Message.setChannel(map[Message.getChannel()]);
}
function onController()
{
Message.setChannel(map[Message.getChannel()]);
}
エフェクター
さらに、限定的ですが信号処理のスクリプトを書くこともできます。
以下はScript FXを使用したFuzzエフェクターの例です。ノブで歪みの量を調整します。
reg dataL;
reg dataR;
reg val;
reg drive;
const var knbFuzz = Content.addKnob("Fuzz", 50, 0);
Content.setPropertiesFromJSON("Fuzz", {
"text": "Fuzz Drive",
"defaultValue": 0.5
});
function processBlock(channels)
{
drive = knbFuzz.getValue();
dataL = channels[0];
dataR = channels[1];
for(i = 0; i < dataL.length; i++)
{
val = dataL[i];
val *= 20.0 * drive;
if (val > 1.0)
val = 1.0;
else if (val < -1.0)
val = -1.0;
val /= 10.0;
dataL[i] = val;
}
dataL >> dataR;
}
実行方法
トップレベルのスクリプト
Master ChainモジュールのMIDIタブをクリック
MIDI Processorの左端にある+をクリックしてScript Processorを選択
onInit、onNoteOnなどコールバックごとにタブがあるので選択して内蔵エディタに入力する
右下のCompileボタンを押すとスクリプトが適用される
トップレベルのGUIは家アイコン(Frontend Panels)をクリックすると表示されます
子モジュールのスクリプト
次に子モジュールのスクリプトの例です
Master Chainから例としてSine Wave Generatorを子モジュールとして追加します
今回はFXを作成します
Sine Wave GeneratorのFXタブをクリックする
FXの左端にある+をクリックしてScript FXを選択する
FXの場合、コールバックがMIDIと異なります
スクリプトを入力してCompileボタンで適用する
子モジュールのGUIはInterfaceタブを選択すると表示されます
感想
オープンソースながらHISE自体非常に安定しており、機能も豊富で、想像以上に完成度の高いソフトウェアという印象でした。
内蔵エディタも、シンタックスハイライトやショートカット、アンドゥなど用意されていて普通に使いやすいものになっています。
スクリプトは、商用ソフトウェアに比較しても圧倒的にAPIが充実していて多様な機能を実装することができます。また、JavaScriptそのままではなく、安全性と高速性を高めたカスタム言語であるところにもセンスを感じます。
さらに、今回は触れていませんがC++インタフェースやScriptnode Expression Language(SNEX)と呼ばれる高速な言語なども用意されています。もちろんオープンソースなのでソースコードを追加・改変することでHISE自体を変更することも可能です。ただしライセンスはGPL v3なのでその点は注意してください。
ただ、現状はサンプルスクリプトが非常に少なく、APIドキュメントだけ見てもわからないことも多い状況です。また、実用的なライブラリもほぼない状態で、このあたりが充実してくるとHISEのポテンシャルがもっと広く伝わるのではないかと思います。