タイトルが長いですがそのまんまなものを作ってみました。TouchDesignerで作ってみた第二弾です。第一弾はこちら。
今回作ったものは、OSCを受けたときにアドレスをチェックし、値を読み取ってパスに変換したあと、そのパスに動画が存在していれば、現在再生されている動画の終了時にその動画に切り替えるといったものです。ちょっと説明が長いですが何をしたかったのかは伝わるかと思います。また、これを読んで似たような処理がしたいんだけどわからん!って人の参考になれば幸いです。
ちなみに同じ内容をopenframeworksで書いたら一瞬でかけちゃう気がします。
OSCを送信するシステムを作る
なにはともあれ送信側がないと成立しないので、OSCを送信するプログラムをXcodeで書きました。とりあえず適当にこんな感じでアドレスに値を送ってます。
1 2 3 4 5 6 7 8 9 10 |
@IBAction func testBtnAction(_ sender: Any) { let osc = OSCController.sharedManager let ms = "liquidFun.mp4" osc.sendMessage(addressPattern: "/Value", arguments: [ms as AnyObject]) } @IBAction func videoResetBtnAction(_ sender: Any) { let osc = OSCController.sharedManager let ms = "liquid" osc.sendMessage(addressPattern: "/Value", arguments: [ms as AnyObject]) } |
細かい説明は今回は省きます。大体こんなのを送ってるのがわかるとは思うので、Xcode側はここで終了です。
OSCから受け取った値をファイル名に変換する
改めてTouchDesigner側の説明に入ります。まず値を抜き出してtextデータに変換する箇所はこんな感じで作りました。
/Valueというアドレスに”liquid”という値が受け取れているのが分かるかと思います。ちなみにOSC In DATではOSC Address Scopeに/Value*と設定しており、/Valueから始まるアドレス以外は受け取らない様にしています。
ざっくり順番に説明していくと、OSC In DATで指定のアドレスのOSCを受け取り、Select DATによって値のみを抜き出しています。指定はIndex番号を使っています。
次にConvert DATを2回使い、Text Datの形式に変換しています。まずはじめに、””が不必要なので、Convert DATのSplit Cells atに”を指定して取り除き、今度はConvert DATのHowにTo Textを指定することによりText DAT形式へ変換しています。
以上でOSCから値を抜き出してファイル名に変換が出来ました。
ファイルが存在しているか確認する
次に、受け取ったファイル名を元に、ファイルの存在有無を確認し、あればをのパスを返し、なければデフォルトのパスを変換するシステムについてです。これは少し複雑になったので、一旦Containerに入れました。
中身はこんな感じです。
この流れとしては、ファイル名からファイルのパスを作成し、それをMovie File In TOPに入れてみて、もしファイルが読み込めたらSwich DATのIndexを変更するという流れになっています。
まず、パスの作成は、ディレクトリを記載したText DATとOSCの値から生成したText DATの値をMerge DATによりつなげて生成しています。
次に、Movie File In TOPでのファイルの読み込みについてですが、これはMovie File In TOPのfileに
1 |
app.samplesFolder + op('null1').text |
を指定しています。これは、デフォルトで設定されているサンプルフォルダとnull1のOperatorのtextデータを合わせたパスを指定しています。これにより、もしこのパスにファイルがあれば読み込まれる様になっています。この画像のときはliquidというファイルはないため、黄色い!マークが出てエラーが出ています。
また、このファイルが読み込めたかどうかという情報は、Info CHOPを使って取得する事ができます。Info CHOPのOperatorに配置してあるMovie File InTOPをドラッグドロップすると、Movie File In TOPの情報がChannelに分かれて表示されるようになります。今回は、この中で、openをSwich DATのIndex番号とし、パスの切り替えを行なっています。
以上でファイルの存在有無でパスの切り替えが出来るようになりました。
動画再生終了時に動画のパスを切り替える
まずは全体の構成としてはこのような感じです。
まずはMovie File In TOPの説明から。このOperatorはfileのパスに
1 |
app.samplesFolder + op('null4').text |
と書かれており、常にnull4のテキストのパスを読みに行くようになっています。またnull4はtext2からの値を表示しており、text2はどこにもつながっていません。何故ここで、先程出し分けたパスをそのまま使用していないのかというと、Movie File In TOPはパスが変わった瞬間に表示されているものが変わってしまうためです。そのため、動画の再生終了時にだけパスを変更し、再生中はずっと値を保持しておくといった処理が必要となっています。
次に動画の再生終了時の取得についてですが、これも先程動画が開けたかどうかを確認した際に使った、Info CHOPを使用しています。また、Info CHOPのScopeにはlast_frameを指定しており、他の情報はChannelに表示しないようにしています。last_frameは動画の最後のframeになった際に発火される値となっており、その発火イベントを元に、CHOP Execute DATを実行しています。
CHOP Execute DATは少しだけスクリプトを追加しています。内容はこんな感じです。
1 2 3 |
def onOffToOn(channel, sampleIndex, val, prev): op('text2').text = op('null3').text return |
これはみての通りですが、指定のCHOPの値が0から1に変化した時に、text2の値をnull3の値に書き換えているだけです。こうすることで、動画が再生終了したときだけMovie File In TOPのパスを書き換えることが出来ます。
以上でOSCの値を元に動画の切り替えシステムを作ってみた内容でした。
終わりに
今回はわりとプログラムチックな内容を作ってみました。作ってみたといいつつ実際に作る必要があったので作ったという理由が大きかったりもします。
まだまだTouchDesignerに慣れていないので、openFrameworksでやったほうが断然早いという状態はまだありますが、こういうTipsだったりContainerを作っていったりして、数が揃っていったときにかなりの速度でものが作れるようになるような気がしています。なのでまだまだ触っていこうかなと思います。
次はそろそろ作品っぽいものを作ってみたいなーと思います。どんなものを作るかはまだ未定ですが。
では、また。