見出し画像

TouchDesignerで被りなし条件付きランダム選択システムを作りました


作成したもの

今回制作したのはゼミで先輩方が設営した計8ブースをipadを触るたびに1つおすすめ(空きブースを案内)してくれる誘導システムを作成しました。
常時付け焼き刃で機能を追加していったので備忘録としてまとめます。

人のノードなんて説明されても普通わからんので直接聞いてください

いい感じに整理できたネットワークはtoxで配布しますのでご活用ください。
追記:ところどころ余計な仕組みありますが直す気力ないのでぜひ直してみてください

ランダム選択と数字の仕分け
DMXライトの制御
選択された数値と映像をリンクさせ、フェードイン/アウトや満員などの処理


私はシステムを動くように作っただけなので、アイディアをくれたみんなのおかげで成り立った機能がほとんどです。
さらにそのシステムはChatGPTと先輩のおかげ、出来がいいのはアミッドや出力映像が綺麗なおかげ、システムには正解があるけどアートには正解がない。

システム要項一覧と作成方法

iPadを触るとランダムで映像が流れる

今回の肝となるシステムです。
上記画像の右真ん中のピンクノード(DAT)の中身です。

理想のランダムを先輩が作ってくれました。一応モザイク
このコードはシステムの中核です。それを頼った癖に「作りましたヅラ」は情けないですよね。
ですのでノードで再現しましょう。
おもったより苦戦しました。
追記:黄色の処理は少し意味ないノードがあります。

1.オフのボタンのみを監視し、ランダムで選ぶ対象とする

ちなみに、プログラム上で「完全な乱数」ってのは実現不可能なんです。
まぁ人間が観測して、法則性を見つけられるほどゆるくもないので「ほぼ完全」って感じです。「行けたら行く」よりかは信憑性あります。
つまりはぱっと見ランダムだったらOKって感じです。

ボタンが8つあるので規模が大きく感じますが、黄色と青がメインの機能です。赤はボタンの管理です。


赤の処理 

右側から 1.ボタンを8つ用意し、出力の種類を分ける

ボタンが8つあるのでmath CHOPで「×2〜×8」をして出力の種類を作る


左側は、1から8の出力を仕分ける
一度選ばれたボタンをオンにし、ランダムから除かせるためです。

Expression CHOPで「me.inputVal == n」と書きます
意味は「私に入力されている数値がnなら1を返す」です
今回はnに1から8が入ります。その後DATが各ボタンのオンオフの処理をしてくれます。

本当はExpressionはいらないし、DATも1つでいけるはずです。
Pythonがかけるならば…

def onValueChange(channel, sampleIndex, val, prev):
op('button' + str(val)).par.value0 = 1
return

これで走るはずんなんですが、なぜがエラーが出ます。解決できるほどの知識がありません。
要件は"'button'val(入力された数値) を連結して生成した名前を持つオペレータ上のパラメータ value0 の値を 1 に設定しています。"5が入力されたらbutton5がオンになる…はずなんですがねぇ…



青の処理

選択されているボタンから1つ選択する、ボタンがオンオフ変わるたびにランダムに並べ替えられるため、選択する行はランダムでも固定でも大丈夫です(多分)

左から

  1. Merge CHOPでブースボタンのオンオフをまとめる

  2. Delete CHOPで0のチャンネルを消す

  3. Shuffle CHOPでグラフ化?並べ替えを可能にする的な?

  4. Sort CHOPのRandom seedで並べ方をランダムにする

  5. CHOP to DATで整理

  6. CHOP to DAT のRow指定でn番目を抽出

  7. CHOP Execute DATで「左のdat to CHOPの数値が変わったら、右のconstant CHOPの数値に同じ数を入れる」

  8. Deley CHOPで時間差で出力して、一番右のCHOP Execute DATでconstant1 CHOPに「constant1が0以外だった場合、0を出力する」

8の処理の簡単なPython↓(変数に代入した方が綺麗)

if op('constant1').par.value0 !=  0:
 op('constant1').par.value0 = 0

(読まなくてもいいよ)
7は冗長してるように思えますが、普通にCHOP Referenceなどで繋げると連打したり想定外の挙動の際にReferenceが途切れてしまいます。(原因不明)
8は一旦数値を0に戻さないと出力された数値が残ってしまい、同時に2つのボタンが返ってきてしまうことがあります。



黄色の処理

オンボタンの合計やランダムで一つ選ぶ処理

こっちの処理はシンプルなので処理の流れよりもオペレーターの解説をします。
(一番上の2つ、意味ないです。オンの時に0、オフの時に-1を出力できればいいのでconstant1つで足ります。配布toxは修正済みです。)

1と0のさまざまな論理演算が可能、鬼便利
詳細はリンク

俺もよくわかってないですが、上から

  • 処理ができる状態の種類(Off When Zero = 数値が0の時はOFF)

  • どうなったら処理をする?(Faling Edge = 数値が減った時)

  • 2つのチャンネルを合わせる (AndやOr、数学のベン図的な)

  • チャンネルじゃなくてオペレーターバージョン

Combien Channels/CHOPsの違い

入力と出力の種類的な感じです。ANDとORで試せばなんとなくわかります。

Noise CHOP

ただのランダムだけでなく滑らかに生成するなど不規則なノイズを発生させます。
詳細はリンク
  • Type(今回のランダム以外使ったことないです)

  • Seed (ランダムシードを決める(マイクラのシード値と同じです))

  • Amplitude (数字を大きさを絶対値で決める(初期値は-1から1))

  • Offset(大きさはそのまま数値をずらす)

Common ページのTime Sliceをオンにするとランダム生成になる

Trail CHOPを繋ぐと最大値と最小値がわかりやすいです

↑Type Alligator
↑Type Random

hold CHOPはその名の通り入力された数値をオンの時のみ保持する
math CHOPは色々な機能付き四則演算


思ったより長くなったので一旦区切ります

次回はDMXの解説です。

配布ファイル



この記事が気に入ったらサポートをしてみませんか?