提灯2.0 システム解説 (オーディオ・ビジュアル、複数台マシンの同期) 

# 提灯2.0 システム解説 (オーディオ・ビジュアルと複数台マシンの同期) 

## 提灯2.0とは

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">こないだの盆踊りの動画上がってたよい○<br>2018/07/21 八幡大盆踊り大会 エマーソン北村さん&amp;mmm <a href="https://twitter.com/hashtag/daibon?src=hash&amp;ref_src=twsrc%5Etfw">#daibon</a> <a href="https://t.co/EbqR7nTyxu">https://t.co/EbqR7nTyxu</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; seto (@_seto_) <a href="https://twitter.com/_seto_/status/1028244211642945537?ref_src=twsrc%5Etfw">2018年8月11日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


先日高円寺の神社のお祭りで提灯2.0という謎案件を担当しました。
http://daibon.jp
お祭り自体も盆踊りを中心にライブやDJも行い、公式グッズも盛りだくさんで伝統を守りつつも前衛的なお祭りになっています。
昨年もスタッフとして協力していましたが、今年は主に提灯2.0のプログラマとして参加協力しました。
提灯2.0と題して既存の提灯に制御機能をつけてライブやDJ、盆踊りの音に合わせて提灯を点滅演出するというもので、なかなか世間的にも初めての試みで、屋外での音に合わせた照明演出はもともとやってみたいと思っていたので非常にやりがいがありました。
今回の提灯2.0を作る過程でオーディオビジュアルや大きめの規模のインスタレーションの知見も随分得られたので共有したいと思います。

まず今回はソフトウェアとハードウェアを分業して僕の方はソフトウェアメインで、提灯を制御して演出を作成する部分を中心の作業でした。
ライブやDJや盆踊りの音を入力して音に合わせて提灯を制御演出できるようなシステムを用意しました。
そのために必要なソフトウェアやシステムについて説明したいと思います。

### 今回やりたかったこと

- リアルタイムオーディオに同期した提灯演出
- 現場での柔軟な操作
- 組み込みオーディオに対しても完全同期の演出（時間足りなくてできず。別の機会にやりたい）
- 参加してくれたの人々を盛り上げて発狂させる、感動させる

の4つです。

### ときに優しく、ときに大胆に動く提灯たち

https://www.instagram.com/p/BlqL-agnT2l/?utm_source=ig_web_copy_link
https://www.instagram.com/p/Blihvv8ghrO/?utm_source=ig_web_copy_link
https://twitter.com/mashikeso/status/1020994208017002496
https://twitter.com/ichiro_chann/status/1020626737338540032
https://www.instagram.com/p/Blh1RQ_H3Ni/?utm_source=ig_web_copy_link

結果的に他のアーティストさんや参加者の熱気も相まってすごい盛り上がりで終了いたしました。
動画であげてくださる方も多く、成功と言えるのではないでしょうか。
特に最後のオオルタイチさんライブでは音にバッキバキに反応させて自分でも見ていて面白いものでした。

## システム概要

基本的には会場全体の音をまとめたミキサーからmacに音声入力解析、
macからローカルネットワークで制御データをブロードキャストしてRaspberryPiに通信
ラズベリパイが制御データを元に各提灯を制御する流れです。

### システム構成図

![systempic.png](https://qiita-image-store.s3.amazonaws.com/0/57778/2baf47d1-f55c-cbaf-d559-5b103fe1daa0.png)


### 機材リスト

- macbook pro 13inch Mid 2014
- Roland - DUO-CAPTURE(オーディオインターフェース)
- RaspberryPi3+ x 11
- TP-Link Archer C1200(ルータ)
- TP-Link TL-SG1016D(スイッチングハブ)
- ELECOMのLANケーブル

### 考え方

今回はデバイス担当と制御ソフトウェア担当で分業して進めていたので
お互いの作業をうまく分割するために演出はPC、提灯の制御(arduino or RaspberryPi)にきっかり分けて

PC -> 制御データ -> RaspberryPi -> 提灯制御

という設計で行いました。
これにより実際の現場の設置なしでPC上での音響解析、演出パターンの柔軟な操作、演出のシミュレーションが可能になりました。
簡単にゆうとPC上で好き勝手やって、確認もでき、当日は現場でシミュレーションどうりに反映されます。

## 提灯制御プログラム部分

各提灯は16個ずつグループ化されてそれぞれラズベリパイで制御しています。
提灯の数は176個だったのでラズベリパイ11台で制御しました。
通信で制御データを使って提灯を制御するというだけのシンプルなプログラムです。

### シフトレジスタで点灯制御するプログラム

http://www.hiramine.com/physicalcomputing/arduino/shiftregister.html
を参考にしてシフトレジスタ使用した大量のLED制御のプログラムを組みました。
LEDと同様に提灯が点灯するように回路側担当が作成してくれました。

### PCからの制御データフォーマット

PCでの演出を純粋な提灯制御データにしてラズベリパイに送信してパースして制御信号に変えて提灯を制御しています。
これによってPCは演出、ラズベリパイは提灯制御とシステムを分離してデバックできるようにしました。
基本的には提灯の制御はOnOffで数も180個程度で数も多くなかったので
毎フレーム各ラズベリパイに全ての提灯のOnOffデータのビットフラグを256個分を純粋に送っています（シンプルです）。

00000001 00010000 11110000 00000000 .... こんな感じですね。1が点灯している提灯です。

ASCIIコードだと一文字(1byte)が提灯8個分なので32文字で256分で+で改行を送って区切る

ABCDEFG ABCDEFG ABCDEFG ABCDEFG ABCDEFG ABCDEFG ABCDEFG ABCDEFG %n(改行)

これくらいの量なら毎フレーム送っても十分に処理できました。
これを元に受け取ったラズベリパイが制御している部分のビットフラグを参照して制御信号に変えて送り提灯を制御しています。

### RaspberryPiの利点

小型PCということでIP知っていればネットワーク越しのログインが可能です。
なので遠隔でプログラムを実行、修正が可能で安心感があります。
また故障時も本体の故障（ネットワークログインできなくなるので）なのか回路の故障なのかがわかります。

## 音響解析について

今回はDJや盆踊り、ライブの音にリアルタイムで同期する演出を行いたいと思っていました。
なのでビート検出(テンポや拍など)とボリュームなどが必要になりました。
最終的にオーディオ解析はUnity、ビート検出はVDMX5で行いました。

### オーディオインターフェース

オーディオインターフェースがあると音声入力のレベルを調整できるためやはり便利です。
RolandのDUO-CAPTUREを使ってミキサーからアプトプットしてもらってPCに入力しました。

### オーディオ解析

Unityでは標準のマイク機能では速度的に少し怪しかったので高橋啓治郎さんが作成した以下のプラグインを使用しました。
https://github.com/keijiro/Lasp
こちらは高速で低音、中音、高音のボリュームにアクセスできてシンプルに使用できて助かりました。
ありがとうございます。

### ビート検出

今回はVDMX5というVJソフトのClockというビート検出機能を使いAbleton LinkでUnityと同期させる方法をとりました。
Ableton Linkとは以下のような音楽アプリケーションの同士の同期に使われる機能です。
https://qiita.com/COx2/items/675f0072352a1b78c203

Unity側でAbleton Linkに対応するために以下のプラグインを導入しました。まじで感謝です。
https://github.com/comoc/UnityAbletonLink

#### VDMX5とClockについて

VDMX5のビート検出は優秀でJ-Popなどのわかりずらい楽曲でも結構正確に検出してくれます。
またClockはタップテンポにも対応しているので最悪手で叩けば良いという保険付きです。
加えて世界中で使われているアプリなだけあってVDMX5はかなり安定かつ軽量です。
一日起動しっぱなしでも落ちたりすることないし、Clock以外の画面を消してしまえば処理負荷による他のアプリに影響は少ないです。
ちなみに設定を保存する必要がなければ無料で使えます。
個人的にはVDMX5+Ableton Link+Unityはリアルタイムビート検出では最適解な気がしました○

![abletonlink.gif](https://qiita-image-store.s3.amazonaws.com/0/57778/a52a17fa-7d18-2433-c19a-1df95bf3a4d0.gif)


#### 補足
リアルタイムのビート検出は色々調べましたが、今回の用途にうまく使えそうなアセットは見つかりませんでした。
自分で作るのもかなりの高度な技術が必要になりそうでかついろんなジャンルの音楽に対応できるかといえばできなそうです。

http://wavesum.net/products.html
のようなアプリがあり他のアプリで解析しoscやmidiなどでUnityに飛ばして使用する方法考えましたが上記のソフトは現状のMacバージョンでは安定しないのとクラブミュージック以外はうまく検出できないみたいです。

### 簡単な音声入力の確認環境作り

mac単体で音声入力を取れるアプリでloopbackというアプリがあるので紹介します。
https://rogueamoeba.com/loopback/
特定のアプリからの音声を音声入力として扱えるアプリです。
itunesやブラウザで音楽をかけてそれらを音声入力とすれば簡単にVDMX5やUnityでのオーディオでの反応を確認できます。
有料ですが便利なので時短したい場合は購入しても損はないと思います○

## 演出シミュレーションおよび演出制御について(Unity)

ここでは仕事でも使っているゲームエンジンのUnityを使用しました。
Unityはゲーム開発でよく使われていますが、インタラクティブコンテンツなどゲーム以外でも使われています。
3DCGを容易に扱え、開発者も多いので様々な知見が公開されています。
今回はUnityの機能を使って簡易の3Dモデルを作成し演出の作成、シミュレーター、演出操作で使用しました。
以下はUnityの画面の一部で演出を作成して確認したり、当日はそのまま演出の制御に使いました。

![editor.gif](https://qiita-image-store.s3.amazonaws.com/0/57778/2c5bb0a3-af67-f4e4-93e9-8cdd2ffc30b2.gif)

### 3Dモデルの作成

ProBuilderというアセットを使ってUnity内で神社や櫓、提灯などの簡易モデルを作成しました（雰囲気）。
ProBuilderは最近Unityに組み込まれた機能（アセット）で3DCGモデルをMayaなどの3DCGソフトを使用せずにUnityのみで作成できます。
みなさんぜひ使ってみてください。
https://blogs.unity3d.com/jp/2018/02/15/probuilder-joins-unity-offering-integrated-in-editor-advanced-level-design/

### 演出作成＋シミュレーション

上記で作成した3Dモデルを配置し当日の現場を再現し、制御用のプログラミングを行いシミュレーションを可能にしています。
Unity上ではカメラやモデルの配置修正や色々な設定をエディター上で設定できるので変更して確認するのが非常に簡単にできます。
実際にシミュレーションすることでイメージができるし、演出を作る際の動きの確認には必須でした。当日の操作もシミュレーションで確認しておけます。

### 演出操作

UnityではUIを作る機能も標準(uGUI)で付いているので演出を切り替えるためのUIを作成して現場で操作して対応しました、便利です。
また音声入力の可視化や調整もでできるようにUIで作成しました。

### 制御データ送信

制御データの送信にはルータ+イーサネットハブ+LANケーブルを使ってLANを構築して、制御データを接続済のマシンにUDPブロードキャストで一斉送信しています。以下のサイトを参考にしました、ネットワークをよく知らなかったためこういう発想に至らないのでかなり重要な情報でした。
https://qiita.com/yuji_yasuhara/items/af5375b430d0f12c3168)
LANケーブルは50mのものが平気で売っていてかなりの広範囲の領域かつ低価格で引き回せますし、既製品なので安定感があります。
この方法はおそらくPC同士の同期とかにも使われてるんじゃないでしょうか？
また広範囲でのインスタレーションをやる機会があったら使うと思います。

## 組み込みサウンドに完全同期した演出（検証のみ）

Vazerというシーケンスを組めるアプリがあります。
https://imimot.com/vezer/
こちらはシーケンスを組みoscなどで別アプリと通信して同期できるようです。
これでオーディオに完全に対応した演出を組みUnity側で受け取り演出を切り替え変化させることでうまくできそうです.
もちろんMadMapperやVDMX5もそれらのプロトコルに対応しているので映像演出用途でも使えると思います。
Unityのアニメーションイベントのみでもできそうですが。

## まとめ

作業時間も取れなかったので自分の力を過信せずできるだけ作らず使えるものは全て使う精神で臨みました。
そのおかげでアセットや通信によって別のアプリ、マシンと連携する手段をとることでうまく機能分割したシステムを構築できたと思います。
重要な知見としては

- Unityはゲームだけでなくシミュレータとしても使える、演出をシミュレーションし、そのまま演出制御できる。
- VDMX5でビート検出をしてAbleton LinkでUnityと同期できます、オーディオビジュアルでビート検出したいときは有力な手法になる。
- LANを構築してUDPでブロードキャストすることで外部のマシンとシンプルに連携できる。

です。参考になれば幸いです。
より良い解決策が他にあればご意見よろしくお願いします。
また日本のすべて盆踊りに提灯2.0が導入され一般化されることを切に願います○

## 参考リンク
[大和町八幡神社 大盆踊り会](http://daibon.jp)
[[Unity]ＬＡＮ専用の機器構成で有効なＵＤＰ通信のUnityサンプル]
(https://qiita.com/yuji_yasuhara/items/af5375b430d0f12c3168)
[JUCEにAbleton Linkを組み合わせてみた]
(https://qiita.com/COx2/items/675f0072352a1b78c203)
[少ない出力ピンで、大量のLEDを制御する（シフトレジスタ使用）]
(http://www.hiramine.com/physicalcomputing/arduino/shiftregister.html)