【TouchDesigner】MIDI通信時の不要なnoteをPythonで制御する
備忘録です。
TouchDesignerにMIDIコントローラーを繋げて遊ぼうとしたところ、思わぬ挙動に遭遇。 Pythonを利用して解決したという内容です。
noteが2つ出る
MIDIコントローラーのボタンを押した時に拾ったnoteを見ると同じ信号を二つ送信していました。
今回行いたかった制御は ボタンを押したら映像が切り替わる です。
つまりこのままだと瞬時に2回押されていることになり、映像もババッと二度切り替わるという事態に。
これをコードを書いて制御し、解決しました。
CHOP Execute DAT を利用する
CHOP Execute DAT
の中にコードを書いて今回の信号の問題を解決しました。
信号は二度送られますが、一度目と二度目の時間の差を見て短すぎれば二度目で0を送るという仕組みです。
CHOP Execute DAT
に予め用意されているonOffToOn
を利用し、信号が送られたときに発火するようにします。
constantObj = op('constant3') # 通信時のtimeを保持する変数(Constant CHOP) lastSeconds = constantObj.par.value0 # 保持したtime forwardObj = op('constant1') # 値を送信したいオブジェクト def onOffToOn(channel, sampleIndex, val, prev): now = absTime.seconds diff = now - lastSeconds constantObj.par.value0 = now # ボタン押下時のtimeを保持 if diff < 0.1: forwardObj.par.value1 = 0 # 二度目は0を返す return forwardObj.par.value1 = 1 # 一度目は1を返す return
これでボタンを1回押したときの挙動は「1が代入されたあと、0が代入される」となります。 (制御前は「1 → 0 → 1 → 0」)
映像の切り替わりも無事1回だけになりました。
なぜ2回送信されるのか
未だに謎です。 そもそもそれがスタンダード? そんなことあるのか?
同じような場面で毎度このコードを引っ張り出してくると思うと少々億劫です。
TouchDesignerでこのようなDATをモジュール化していつでも使えるようにできると思うのですが、その辺のやり方が分かっていない。
音のパラメータを3バンドで分けるロジックもいちいち構築しているので、早めに習得したいですね。