【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バンドで分けるロジックもいちいち構築しているので、早めに習得したいですね。