u-he Hive UHM
概要
u-heのウェーブテーブルシンセサイザーHiveはウェーブテーブルデータを生成するための言語UHMが用意されています。
用途
- ウェーブテーブルデータ(波形とその時間的変化)の生成
- ウェーブテーブルデータのwavファイル出力
言語仕様
- 独自言語
- 数式処理
- システム変数
- 波形バッファ
- wavファイル出力
読み取り専用のシステム変数があり、その状態によって処理を分岐することができますが、チューリング完全を満たすプログラミング言語ではありません。ユーザー定義関数も作れません。
計算途中の波形を保持しておくためにmain、aux1、aux2の3つのバッファがあり、通常のプログラミング言語の配列のように使用できます。
1周期2048サンプル分の波形を計算式で生成します。
ひとつのプログラム内で最大256個の波形を定義することができます。これらはフレームと呼ばれ、フレームの順番で波形をモーフィングして発音します。つまり、1周期分の波形×フレーム数がウェーブテーブルデータとなります。
ウェーブテーブルデータはwavファイルにエクスポートすることができます。エクスポートしたwavファイルは、Hive以外のウェーブテーブルシンセソフトでも利用することができます。
公式リファレンス Hive Wavetables
GUI仕様
UHMでは独自のGUIは作成できません。
Positionノブがフレームに対応しており、モーフィングOffのときは指定したフレーム位置の波形を鳴らします。モーフィングが有効なときは指定位置から後ろのフレームを使用してモーフィングします。
余談ですが、Hiveをはじめu-heのシンセサイザーソフトは独自画像を使ったGUIスキンを作ることができてユーザー同士で自作スキンの配布もさかんにおこなわれています。スキンはテキスト形式の.h2pファイルで記述することができますが、その仕様はオープンになっていません。
u-he/Hive.data/Presets/Hive/default.h2pファイルに以下のように記述すると、画面を右クリックすることで各種のGUIパーツのパラメータを設定できるようになり、そのように調整した結果をh2pファイルに出力することで独自のスキンを作成します。
!EDITOR=YES
プログラム例
各種波形合成
サイン波生成
phaseは1周期分の変化を0~1.0で表すシステム変数です。
// Sine wave
Wave "sin(2 * pi * phase)"
減算合成
2 * phase - 1でノコギリ波を生成したものにローパスフィルターをかけています。
// Subtractive synthesis
Wave "lowpass(2 * phase - 1, 0.3, 0.5)"
加算合成
blend=addとすることで直前に生成した波形との加算を指定できます。
// Additive synthesis
Wave "sin(2 * pi * phase * 1) * 0.5"
Wave "sin(2 * pi * phase * 2) * 0.3" blend=add
Wave "sin(2 * pi * phase * 4) * 0.2" blend=add
Wave "sin(2 * pi * phase * 8) * 0.1" blend=add
FM合成
sin(θ + sin(2θ))の例です。
// FM synthesis
Wave "sin(2 * pi * phase + sin(2 * pi * phase))"
フレーム番号を指定したモーフィング
波形1から波形2になめらかに変化させる指定です。この例では普通のサイン波からオクターブ上のサイン波へ変化します。
NumFrames = 2
Wave start=0 end=0 "sin(2 * pi * phase)"
Wave start=1 end=1 "sin(4 * pi * phase)"
モーフィング指定でOne ShotまたはLoopを指定することでモーフィングが有効になります。
tableシステム変数を使ったモーフィング
tableは0~1.0まで256フレーム分変化するシステム変数です。
以下のように記述することでローパスフィルターが徐々に開いていく波形をモーフィングで表現することができます。
// Filter morphing
Wave "lowpass(2 * phase - 1, 0.1 + table * 0.5, 0.5)"
Wavファイルへのエクスポート
Export文でwavファイルへ出力します。
出力はNumFramesで指定した周期だけ生成されます。省略時は256周期分になります。
NumFrames = 1
Wave "sin(2 * pi * phase)"
Export "sine.wav"
実行方法
あらかじめu-he/Hive.data/Wavetables/user/に.uhmファイルを置いておく。
タイトル部を右クリックしてInitを選択。設定を初期化します。
OSC1の波形欄タイトル部をクリックしてWavetableを選択
click here to browse wavetablesと書いてある箇所をクリックするとuhmファイルが選択できます
uhmファイルを編集して保存したときは、自動的に更新を検知して読み直してくれます。
感想
1周期分の波形を生成することに特化した大変ユニークな言語です。ある種、信号処理の一番面白いところに専念できる感覚があり、書いていてとても楽しいです。
汎用言語にくらべると表現力の自由度が低いのは否めませんが、目的のために小さな仕様の専用言語を設計するというDSLとして理想的なかたちだと思います。
本エントリー執筆にあたり、SoundQuestさんのWavetable言語「UHM」の基礎知識を参考にしました。