オーディオリアクティブな火炎を作る

この記事はTouchDesignerのアドベントカレンダー７日目の記事です．
# はじめに
はじめまして，@syoukeraです．大学院で燃焼のことを研究している傍らで，気晴らしとしてTouchDesingerを使って映像を作ったりしています．たまにVJもしていますので，イベントなど声をかけていただければ喜びます．
今回の記事では以下のようなオーディオリアクティブな火炎を作ります．そのために，Arduinoを介してTouchでガスの供給系を操作します．主に行った作業としては，流量制御器であるマスフローコントローラーをArduinoで操作できるように配線をして，それに対してTouchによる操作をおこないました．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">一眼レフで撮影した正弦波の火炎<a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://t.co/xiN953I5yY">pic.twitter.com/xiN953I5yY</a></p>&mdash; syoukera (@syoukera1) <a href="https://twitter.com/syoukera1/status/1467685726800076812?ref_src=twsrc%5Etfw">December 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

燃焼と音楽の組み合わせについては，発熱と圧力の相互作用による燃焼振動を利用して音を奏でる[Pyrophone](https://www.youtube.com/watch?v=rI37T3vA7fM)や，隣り合った火炎が存在するところに圧力波である音を流すことによって火炎が変動する[Rubens' Tube](https://www.youtube.com/watch?v=1ZcOusmB4Ls&t=115s)が有名ですが，今回の記事では音のデータをもとにして空気の流速をマスフローコントローラで変化させることによって火炎を音楽に対応させます．

# 事前準備
## バーナーとガス供給系
今回使用したバーナーの写真を示しています．実験室に落ちていたスワールバーナーを用いて火炎を形成します．スワールバーナーでは中心軸上をまっすぐに流れる燃料に対して，四方向から旋回をかけるようにして空気を吹き込むことによって流れ場と混合が変化して回転がかかった火炎を作ることができます．空気を流さないときには長く伸びる黄色い火炎が，空気を流した時には青い発光の逆円錐形状の火炎が形成されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/f85a2369-19e8-c6be-f88e-97cc7b3c0162.png)

今回使用したマスフローコントローラーと電源及びArduinoは以下のものを使用しました．マスフローコントローラーは，研究室に落ちていた堀場エステック社製，SEC-4500Rです．マスフローコントローラーとセットで電源と操作部がセットになった黒い箱が付属しています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/2aa383ef-b756-67c2-8609-539222e86aa5.png)

ガスの供給系についての概略図を示しています．今回は燃料の流量は一定とした状態で，空気の流量をマスフローコントローラーを操作することによって変更させることで火炎形状を変化させます．通常の使用時には黒い箱から流量指令値と電源である±15 Vをマスフローコントローラーに接続することで使用します．今回は概略図に赤線で示している通り，±15 Vのみを電源から与えることとして流量指令値をArduinoから与えられるように配線を行う事が主な作業です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/6d04f21e-04e8-1c8c-f9fd-fe6027ab67b4.png)


## マスフローコントローラーの配線
マスフローコントローラーは，その頭頂部にある９ピンの端子それぞれに対して必要となる信号の種類が記載されています．マスフローコントローラーの仕様書におけるコネクタの説明を記載します．仕様書によると，主に必要となるのはバルブを動かすための電源として+15 Vおよび-15 Vの直流電位と，バルブの開閉信号，そして流量の指示値のインプットと計測値のアウトプットが必要になります．流量の指示値と計測値のみをArduinoに接続することとしますのでマーカーを記載しているピンについてArduinoで準備します．残りの配線に関してはそれ専用の基盤を組んだ方がいいとは思うのですが，手っ取り早く動かすために黒い躯体から出ているものを端子から抜き取って使用することとします．
<img alt="hogehoge" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/d7c4f39c-b202-fdbf-f8f3-c7f8c328415e.png" width="600">

マスフローコントローラー上部の９ピン端子に上記の配線を接続するのですが，ブレッドボードに接続して使用したかったので９ピン端子をはんだ付けせずにジャンパ線を使って取り出しました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/2175aa3e-045e-ad90-95eb-b3b0a9ae5755.png)


## 電源の配線
電源の箱に，それぞれの端子の出力の説明が記載されていました．今回はマーカーで示している番号の端子をはんだ付けによって取得します．±15 Vおよび0 Vと4000番はバルブの開閉信号を出力しているようでした．
<img alt="hogehoge" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/1bdb7a76-a927-4ad5-eaad-d0d00c73dd12.png" width="400">

24ピンのオス端子に対して４か所をはんだ付けします．雑な配線になってしまいましたが，はんだ付けが終了してほしい電位が取得できていることを確認しました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/58a5b822-504b-98ae-e20f-376a15f2d9f6.png)

## 最終的な配線
このような状態で配線を組ん後にマスフローに接続しますが，ここでも手抜きをして９ピンの端子をはんだ付けせずに直接ジャンパ線を接続しています．±15 Vについてはブレッドボードの接続では上手くいかなかったために圧着端子で接続しています．あまり考えにくいのですが，電流地が大きいとブレッドボードでは上手く接続できないなどという事があるのでしょうか．
最終的に作った配線はこのようになっています．見にくい写真になっていますが，右下に向かう配線は電源に伸びています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/2cd8c152-2f0f-5dca-d51f-c839054a87ea.png)


## ToudhDesignerでの設定
ArduinoとTouchDesignerの連携にはFirmataを使用しました．Arduino側での準備は通常の使用時と同じようにArduino IDEを立ち上げて，スケッチ例からStandardFilmataというサンプルをArduinoに書き込みます．書き込みが終了したらAruino側の設定は終わりです．
続いてTouchDesignerでの設定を行います．パレットのToolタブにあるFirmataを追加して，追加されたCOMPのPortをプルダウンから選択し，ActiveをOnにします．この時点で上手くいくと読み込まれてCHOPの値が反映されますが，もしうまくいかなければQuery Versionをクリックすると上手く読み込むことがあるようです．読み込んだらPin ModeのタブでPWMを使用するための設定を行います．FirmataのCOMPでは上側の0から17までがデジタルのピン，18番以降がアナログのピンの用です．今回使用するピンはPWMを用いて電圧を指定するデジタルの3番と,出力の流量指示値を受け取るためのアナログの0番ですので，Pin Modeのタブで3番をPWM (8 Bit)として18番目が(Analog 10 Bit)になっていることを確認します．この状態でPin Valuesの値を確認すると，3番ピンのスライダーが使用できるようになっており，それを操作することで電圧を変更できるようになっています．また18番以降のアナログピンでは何らかの値が入力されています．接続したアナログ0番の電位に引っ張られるようにしてそれ以外の箇所の電位も変化していたのですが，接続していれば問題ないくらいの値になるのでしょうか．ともあれ，これで使用するための準備は整いました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/6a1a0ab1-3c2e-94e1-b312-db8eda138a6f.png)


## 動作確認
マスフローと電源，Arduinoを全て接続して動作の確認を行います．地味ですが，PWMで変更した電位に合わせて，空気の流量を変更することができることを確認しました．ただし使用したマスフローが窒素用だったために，フルスケールの性能値である20SLMではなく，最大でも18.3SLMしか流量が出ませんでした．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">流量制御器をArduino で触れるようになりました <a href="https://t.co/uWWNjxpCbB">pic.twitter.com/uWWNjxpCbB</a></p>&mdash; syoukera (@syoukera1) <a href="https://twitter.com/syoukera1/status/1465990356030263304?ref_src=twsrc%5Etfw">December 1, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 実験
空気の流量をコントロールすることができることを確認しましたので，いよいよ燃やしていきます．
## 正弦波
正弦波で空気の流量をゼロから最大値まで変化させてみます．正弦波では最大と最小の状態をとるところで最も変化量が少ないために，空気が流れていない長い火炎と，空気が流れている円錐の火炎の違いがはっきり分かれていて変化が分かりやすいです．Frequencyを上げると２くらいで追従できなくなってしまった．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">正弦波で与えるとこんな感じです <a href="https://t.co/DSARocI2Dp">pic.twitter.com/DSARocI2Dp</a></p>&mdash; syoukera (@syoukera1) <a href="https://twitter.com/syoukera1/status/1467485393780342784?ref_src=twsrc%5Etfw">December 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## Kickをひろう
例のビートをAudio Analysisに突っ込んで得られたKickdetectionをTrigger CHOPで引き延ばしたものを与えます．正弦波の時と比べて変動が少なくなって，Kickのタイミングに合わせて黄色の炎が昇っているのが分かります．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Kickをひろったとき<a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://t.co/bzSdflLM72">pic.twitter.com/bzSdflLM72</a></p>&mdash; syoukera (@syoukera1) <a href="https://twitter.com/syoukera1/status/1467901684517154823?ref_src=twsrc%5Etfw">December 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## Lowを与える
Audio Analysisを使用して得られたLowを流量設定値として与えると，ゆっくりとした時間スケールで変動する結果となりました．信号の変動は結構早いのに対して，火炎の応答はゆっくりと大きな変化を示していてその点は面白かったです．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Lowを入れると長い時間スケールで変動する<a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://t.co/99nn68mdOa">pic.twitter.com/99nn68mdOa</a></p>&mdash; syoukera (@syoukera1) <a href="https://twitter.com/syoukera1/status/1467901924490248193?ref_src=twsrc%5Etfw">December 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## 課題
- 周波数が上がったりBPMが高くなってくるとマスフローでの制御が追従できずに与えている信号がなまった形で流量が制御されてしまいました．流路の開閉を切り替える電磁バルブを組み合わせて，高い周波数ではそちらに切り替える方法をとった方がいいのかも知れません．
- 流量を制御している個所からバーナーまで流れる時間が必要であるために，音から遅れて火炎が変化してしまいました．流れる音楽を事前に知っている状態で，数秒早く信号を入れる必要がありそうです．