Houdiniによるオーディオプログラミング例

Houdini
===

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)

# 概要

https://www.sidefx.com/products/houdini/

高精度な映画クオリティの映像制作を支援するプロシージャル3Dアニメーション制作ツール。高額な商用ソフトウェアであるが、小規模スタジオ・個人向けHoudini Indieや非商用利用向けの無料版Houdini Apprenticeなど利用しやすいプランも用意されている。

開発はSideFX社(カナダ)。Omnibus社で1980年代から開発されていたPRISMSが前身。OmnibusのKim DavidsonとGreg Hermanovicが1987年にSideFXを設立、1996年にSideFXは最初のHoudiniをリリース。2000年にGreg HermanovicはSideFXを離れ、Derivative社を設立しTouchDesignerを開発する。

# 実装例

## サイン波生成

Houdiniのオーディオ関連プログラムはCHOP Networkに作成します。

CHOP Networkノードを作成して、その中にOscillatorノードとConstantノードを配置します。Oscillatorのパラメータはデフォルトで440Hzのサイン波になっています。Amplitudeで音量を調整します。

OscillatorノードのPitch Control入力は必須なのでConstantノードを接続します。

![sine1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/a5257e6d-0c9a-d847-8f0c-7c2ec95333a6.png)


OscillatorのChannelタブでSample Rateを44100にします。音質劣化しても問題なければ低い値にして計算負荷を下げることも可能です。

![sine2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/ac1b0572-dc51-b6cb-d902-47f3d49fad20.png)

Constantノードのパラメータchan1はデフォルトの0とします。これを1にするとOscillatorは880Hz、-1にすると220Hzのサイン波を出力します。

![sine3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/2bdab998-2ba8-4fd9-83aa-84752b39938f.png)


ConstantノードのChannelタブでは、Single Frameのチェックを外して持続的に値を出力するようにします。

![sine4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/de2dfc7c-a462-49e1-be40-ad38f1b448ef.png)


画面左下4番目のボタンを押してReal Time Toggleを有効にします。

![btn3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/1e9940b0-a552-f531-3da2-887e1958134f.png)


画面左下のボタンを押してGlobal Animation Options画面を開きます。

![btn1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/6a5137e8-1b2e-6d39-46a8-6486c74f91f0.png)


Global Animation OptionsのMaintain realtime playback, possibly skipping framesを選択します。これを設定しないと再生時に音声が途切れることがあるそうです。

![sine5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/14b76081-e57b-39d7-a69d-c2328a1ce508.png)


画面左下2番目のボタンを押してAudio Panel画面を開きます。

![btn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/ca3cbc2f-032f-15eb-086e-04374ba8a12b.png)


Audio PanelのScrubタブを選択、CHOPでoscillator1を選択します。

![sine6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/a45a9f8e-afbe-476c-cdb7-24ecf2407f11.png)


Playボタンを押して再生します。

![btn4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/8f820a8f-646c-c267-92a5-1e9ae93d42e4.png)


## Delayエフェクト

CHOP NetworkにFile、Delay、Mathを配置して接続します。

Fileのプロパティからwavファイルを選択しておきます。

Delayノードは、パラメータ設定や接続でフィードバックループを作成することはできないようです。しかしながら、ひとつのノードで4個までシングルディレイを設定できるので、これを使ってフィードバックディレイ風にしてみました。

初回のディレイは0.4秒、ゲイン0.5とします。ch("./delay1")とすると、初回のディレイの設定値を参照できるので、2回目以降はこれを利用して計算式を入力しています。ディレイで伸びた末尾が切れないようにRemainderをMake Output Longerにします。

![delay1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/05ac10bd-c9f4-1ca5-fb8d-0450a7661acf.png)


Mathノードのプロパティでは、Combine CHOPsの項目をAddにします。

![delay2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/5ffda53c-6cf4-4e8c-82d2-64f35cffd329.png)


Real Time Toggleを有効にした後に、Global Animation Optionsを開いてMaintain realtime playback, possibly skipping framesを選択します。

![delay3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/98143379-01ca-cf0a-630a-6c4b96dd90f9.png)


Audio PanelのScrubタブを選択し、CHOPでmath1を選択します。

![delay4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/5c7a7479-9f52-4bcd-bc3e-1d636a8ec074.png)


Playボタンで再生します。


# 感想

Houdiniは基本的にはプロユースの3DCGツールで、グラフィックスに関する機能やドキュメントが充実しています。それに比べてオーディオプログラミングに関する情報は十分ではない印象です。オーディオファイル再生に合わせて波形を表示したり3Dモデルを動かすといった解説動画は多いものの、音を生成したりサウンドエフェクトに関する解説は非常に少なく試行錯誤が必要でした。

CHOPにはNoiseノードや、モジュレーションLFOなどに使えるWaveノードもあり、ある程度のオーディオプログラミングもできますが、楽ではありません。また、VEXと呼ばれるスクリプティング機能やVEXのノードベースインタフェースであるVOPもあり、これを使うことでさらに低レベルのオーディオプログラミングも不可能ではないようです。

プロジェクトファイルをシェアする場合は少し注意が必要です。商用版のプロジェクトファイルは.hip形式ですが、Houdini IndieやHoudini Apprenticeの場合、.hiplc、.hipncと異なる形式で保存され、これらを商用版Houdiniで読んでも.hip形式に変換できません。またプロジェクトファイルにはホームディレクトリ情報(Windowsの場合、C:\Users\username)が含まれるため、他人に公開するファイルからOSのアカウント名を知られたくない場合は専用のアカウントを使うなど工夫が必要になります。

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)