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

vvvv
===

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

# 概要

https://vvvv.org/

オーディオ、ビデオ、3Dアニメーション、インターネットといった様々なメディアを使った作品制作に適している多目的なビジュアルプログラミングツールキット。Windows専用。商用利用は有償。

デザイナー、コンピューターサイエンティストらによるメディア集団MESO（ドイツ）が1998年に開発。現在はvvvv groupによって管理されている。( https://meso.design/en/articles/the-flow-of-creative-expression-paving-the-way-for-vvvv )

# 実装例

vvvvでオーディオプログラミングするには、いろいろと注意点があります。オーディオライブラリにはDShow9/Bass/VAudioなどの系列があり、お互いに混ぜて使用することはできません( https://betadocs.vvvv.org/topics/audio/index.html )。結論から言うとVAudioライブラリがおすすめです。ASIOまわりでバグるとOSを巻き込んで不安定になるわずらわしさは少々ありますが、ノードも充実しており32bit/64bitともに安定して動きます。


## サイン波生成

## VAudioライブラリ

VVVV.Audio pack( https://vvvv.org/contribution/vvvv.audio-pack-alpha )をインストールすることで使えるようになります。インストール方法はvvvvアプリフォルダ直下にpacksフォルダごとコピーします。  
32bit/64bitどちらでも使えます。ASIO必須なのでオーディオインタフェースハードウェアを使っていない場合、ASIO4ALLのインストールが別途必要になります。パッチの中でAudioEngineノードを使用してASIOデバイスを指定します。

![vaudio_sine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/29634ce4-82b8-5c84-923a-a62a2ad83f77.png)


### DShow9ライブラリ

デフォルトでインストールされています。32bit/64bitどちらでも使えます。DShow9ライブラリは提供されるオーディオノードが少なく、オシレーターは作成できないようです。

### Bassライブラリ

addonpack( https://vvvv.org/downloads#addonpack )をインストールすることで使えるようになります。インストール方法はvvvvアプリフォルダ直下にaddonpackフォルダごとコピーします。  
64bit版ライブラリが提供されておらず、32bit版vvvvでのみ使えます( https://vvvv.org/documentation/missing-in-64bit-builds )。各種エフェクトなどのノードが豊富です。

Bassライブラリは、エフェクターノードは豊富ですがオシレーターは作成できないようです( https://betadocs.vvvv.org/topics/audio/effects.html )。

## Delayエフェクト

## VAudioライブラリ

右上の独立したノードはASIOの初期化とバッファの作成。ファイルから読み込んだ音声は中央のBufferWriterでバッファに書き込まれます。Play/Resetボタンを押すとバッファをクリアして0位置にシークしてから書き込むのがポイントです。一方で中央左下のBufferReaderは普段は停止していてPlay状態になってから0.4秒後に0位置から読み始めます。BufferReaderの出力をWet LevelとFeedbackに分岐して、Feedback成分をBufferWriterに送ります。VAudioは＊や＋で音声信号を加工できるので楽ですね。

![vaudio_delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/cf9b5800-84a4-e5d1-17bc-d9812b34484c.png)



### DShow9ライブラリ

DShow9にはディストーション、EQ、リバーブくらいしかエフェクトがありません。今回は複数のFileStreamに時間をずらしてbangを送ることでディレイ効果を実現してみました。

![dshow9_delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/c2b89b22-2a70-5f1c-c1b9-c455cab1238e.png)



### Bassライブラリ

BassライブラリにはEchoノードが用意されています。Echoノードは制限の多いディレイというイメージです。  
フィードバックは1回のみ。Wetのみ取り出すことは不可。また、オーディオグラフはループ構造を許可していないらしく、接続を工夫してフィードバックを作り出すことはできないようです。ディレイタイムの単位は明記されていませんがサンプル数のようです。18000にすると約400msecになります（18000÷44100＝0.408）。上限値下限値も説明がありませんが、さまざまな値を入れて試したところ1200～30000のようで、範囲外の値を指定しても無視されます。AudioOutはVAudioやDShow9と同名ですが、BassライブラリのAudioOutは音声信号を接続するinletの場所が異なることに注意してください。

![bass_delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/41907f83-1156-61ca-1204-f25c18466382.png)



## VSTプラグイン

vvvvはVST2プラグインが使えるのでエフェクトは外部プラグインにまかせる方法もあります。  

## VAudioライブラリ

VAudioライブラリは32bit/64bit VST2プラグインに関して相性問題もなく安定して動きます。プラグインはフルパスのファイル名で指定するのでどこに置いてあってもかまいません。vvvvが64bitの場合プラグインも64bit VST2を指定します。

![vaudio_vst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/6386c39b-6cc3-d8eb-da64-c891eebcebb9.png)



### DShow9ライブラリ

DShow9ライブラリでVST2を利用する場合、32bit版vvvvを使う必要があるようです。(vvvvアプリフォルダ)\lib\nodes\vst\ にVST2 32bitプラグインファイルを置いておくと、プラグインの名前のノードが作成できるようになります。ただし、プラグインによってはDAWで使用したときと音が異なったり、パラメータ設定が音にうまく反映されなかったり相性の悪い部分があるようです。

![dshow9_vst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/d8d7d938-a91d-cfc2-380c-a15f81a42695.png)


インスペクターの赤丸の位置をチェックするとinletが追加されてパラメータを数値ノードから設定できるようになります。

![dshow9_vst_inlet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/567f0fc0-2906-9ffe-9815-4ae41c07d04b.png)


### Bassライブラリ

BassライブラリもVSTノードがあるのですが( https://vvvv.org/documentation/vst-(bass-dsp) )、今回サンプルプログラムを参考にどう設定しても音を鳴らすことができませんでした。サンプルプログラム自体もうまく動きません。


# 感想

メニューの出し方やマウスクリックの挙動が一般のアプリと異なっているため、最初は戸惑いますがすぐに慣れます。MaxやPure Dataのような編集モード／実行モードの切り替えがなく、マウスの左右ボタンが編集／実行に対応しているのでモードを意識せず高速にプログラミングできて快適です。

また、BangボタンやToggleボタンのようなMaxやPure Dataでおなじみのボタンも、微妙に挙動が異なるので注意が必要です。Toggleの下にBangを接続するとBangはToggleのように1を送り続け、Bangの下にToggleを接続するとToggleはBangのように一瞬だけ1を送るようになります。これ自体はボタン同士の間にChangeノードやToggleノードを挟んでやれば解決しますが、Maxなどとの微妙な違いは意識しておく必要があります。

やはりvvvvは映像関係のプログラミング環境だとは思います。公式ドキュメントに、vvvvはオーディオ処理にフォーカスしていないとあるとおり( https://betadocs.vvvv.org/topics/audio/index.html )、オーディオ関係の機能はいろいろと穴があり、高度なオーディオプログラミングだけが目的であればvvvvを最初に選ぶ必要はないと思います。

映像＋音のパフォーマンス用に比較的シンプルなオーディオプログラムを作るのであればVAudioが機能としては十分で、必要に応じてVSTプラグインを利用するのが良いと思います。

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