Top

あちゃぴーの自転車通勤
u-he UHM言語 学習02 フレーム

今回はウェーブテーブルらしくフレームについて実験。 UHMでは、最大256のフレームを持ち、フレームを切り替えていくことでサウンドの変化を作り出すことができる。

u-he uhm

2フレームのモーフィング

まずはフレーム数を2として、ノコギリ波からサイン波へと変化するウェーブテーブルを作ってみる。 フレームが切り替わる際にはフレームとフレームの中間もモーフィングされるため、実際はスムーズに変化する。

NumFrames = 2 //フレーム数を設定
Wave end=0 "2*phase-1" //0フレームにノコギリ波
Wave start=1 end=1 "sin(2*pi*phase)" //1フレームにサイン波
u-he uhm

ワンショットで再生すると上のようになる。2フレームしかないが、スムーズにモーフィングしている。

矩形波のデューティ比

下は矩形波のデューティ比を50%から始めて、だんだんと狭めていく波形。startが最終フレームというところがポイントで、tableはframeを0~1に正規化したもの。この場合だと0フレームはtable=0、255フレームはtable=1、128フレームはtable=0.5という具合。

NumFrames=256
Wave start=255 end=0 "select((phase<=(table/2)),1,-1)"
Spectrum lowest=0 highest=0 "0"
u-he uhm

上記はやや面倒な手続きをしているが、 モーフィングはuhmにお任せ的なところがあって、思ったように変化するとは限らないため。 その場合、上記のようにフレームを細かく制御する必要がある。 更にDCカットして、偏らないようにした。

Karplus-Strong風

式は短いが要素が、てんこ盛りとなっていて難解。 u-heの社長Urs Heckmannのuhmを簡略化したもの。物理音源の基礎的な感じになっている。 流れとしては短いホワイトノイズ(rand)をLPFを通してフィードバックさせるというもの。 1フレーム目は単なるノイズだが、フレームが進むにつれて高域がカットされていき、明確な音程感が残る。 ウェーブテーブルではノイズも一定時間で繰り返されるため、どうしても音程が出てしまう。それを利用した音色といえる。

NumFrames = 101
Seed = 73616
Wave start=0 "rand"
Wave start=1 "y + 0.15 * ( main_fi(frame-1, index) - y)"
Phase "rands * 2 * pi - pi"
Spectrum lowest=0 highest=0 "0"
Normalize base=each
u-he uhm

Ursさんは、101フレームが好みのようだ。ノブのパラメータが0~100までなので、それと一致させたいということだろう。

始めにSeedでrandom seedの設定をしている。この数値によって、ランダムのスタート地点が変わるのでノイズの音色が変わるというもの。 そのため、数値の選び方はかなり難しい。適当に打って気に入ったものを選択するしかないだろう。

書かれていないので想像だが、おそらくlong型で0~2147483647の値が設定範囲。これを超える場合はループされているようだ。y=x-2147483648かな?

もしSeedを設定しなかったら、uhmを読み込むたびに音色が変わってしまうので、uhmにおいてノイズを音色として使う場合はSeedの設定が重要になる。と思ったが、Seedを設定しなくても変化は見られないようだ。設定しない場合デフォルト値があるのかもしれない。

次の行のWaveでは、LPF処理をしている。 前フレームの計算結果を利用して全フレームの波形を作り出している。実質randで作った波形は最初の1フレームだけで、その後は、参照して波形を作っている。 さらにサンプル単位の処理がなされている。yは、この式の前回の計算結果。 LPFの内容は意外と厄介で、説明は割愛するが、0.15の値をいじることで、カットのカーブが変化する。

Phaseはフレームごとに位相がズレていくのを防いでいる。このPhaseは文字通りの位相なのだが、周波数領域で倍音として考える必要がある。注意点としてはDCは位相を持たないので、Spectrumに対して-1の関係になっている。

Spectrumは振幅関係の調整。DCカットを行っている。

Normalizeは言葉通りで主に音量を最大化している。

uhm言語