[TouchDesigner] 連続しないランダム整数の作成
「TouchDesignerで連続しないランダムな整数の作成ってどうやるのでしょうか、できればpythonを書かずにノードだけで組みたい。」と聞かれたことがあり、友人に聞くなどしながら考えてみました。
pythonでランダム関数を使うのが一番良さそうだと思いつつも、実際にTouchDesignerでCHOPで条件分岐をしたことがなかったのでやってみようと思います。
今回作るもの
ボタンを押すたびにランダムな整数が出力されるもの
1. とはいえまずは、Excute DATでpythonを使いながら組んでみました。
# me - this DAT
#
# channel - the Channel object which has changed
# sampleIndex - the index of the changed sample
# val - the numeric value of the changed sample
# prev - the previous sample value
#
# Make sure the corresponding toggle is enabled in the CHOP Execute DAT.
import random
def onOffToOn(channel, sampleIndex, val, prev):
max = op('maximam')['chan1']
out = op('out')['chan1']
r = 0
i = 0
while True:
r = random.randrange(0, max, 1)
if r != out :
print('defined!')
break
op('out').par.value0 = r
print(out)
return
def whileOn(channel, sampleIndex, val, prev):
return
def onOnToOff(channel, sampleIndex, val, prev):
return
def whileOff(channel, sampleIndex, val, prev):
return
def onValueChange(channel, sampleIndex, val, prev):
return
random.randrange(0, max, 1)で0〜maxの間から整数を取得します。
2. 次にCHOPをメインにつかって組んでみました。
Noise CHOPから任意のタイミングでHold CHOPをつかって値を取り出します。
はじめに取り出した値をMath CHOPで正の整数に変換します。以下に設定してください。
同じ値が連続することがあるので、Feedback CHOPをつかって1フレーム前のMath CHOPの値を取り出し、ボタンを押したタイミングで別のHold CHOPにボタンを前の値を取得できるようにします。
二つのHold CHOPで取り出した値をMath CHOPで差分をとって比較しします。
比較した値をExpression CHOPに接続します。
Expression CHOPを以下のように記述し、2度同じ値が出て、差分が0になった場合には1を、差分が0以外だった場合には0を返すように設定します。
はじめにHold CHOPで取り出した値と、Expression CHOPをMath CHOPで接続します。
これによって、2度同じ値が取り出された場合にはその数に1がプラスされるように設定されます。
用意したものは以上になります。
結局、Expression CHOPでpython書いとるやん
変数プラス1だからやや規則性のあるランダムになってやん
等、微妙なところはありますが、試行回数の少ないプログラムでは十分有用なのではないだろうかと思います。
Excute DATを使う方が、シンプルにまとまっていて良さそうです。
強いてExcute DATを使うよりも良さそうな点をあげるのであれば、途中に接続するFeedback CHOPの個数を増やすだけで、指定回数前の値がわかりやすく取り出せるところではないかと思いました。
以上になります。