ここ半年でCycling '74 Max 8というアプリケーションを知りました。
本家サイトを見ると「クリエイターの共通言語Max」というふわっとした事が書いてあるだけでなんの事だかよくわかりません。どうやら、一つの目的の為に作られているアプリケーションではなく、音響映像のライブパフォーマンスに特化した制御用アプリケーションの様です。
「Cycling '74 Max 8があれば何々が出来る」というよりも、「何々をしたいからその為にCycling '74 Max 8を使う」と言った感じでしょうか。
公式サイトリンク:
https://www.mi7.co.jp/products/cycling74/
まず、どういった使い方が可能なのか、普段YAT Yet Another Terminalで行っているBrightSignのUDP・シリアル制御を置き換える目的でプログラムを作ってみました。今回は購入には至っておらず、一か月試用版での操作になります。
※ユーザ登録を行わないと期間は無制限になるが、機能制限(保存不可、exe書き出し不可等)が加えられる仕様の様です
Blog内参考リンク:
YAT Yet Another Terminalは簡単に各コマンドのテストが行えます。下記は筆者がいつも試験している設定です。細かいプロトコルなどはこちらの環境の問題ですので説明は省きます。
BrightSignをUDP制御する
BrightSignをシリアル制御する
まず、UDP制御について考えてみます。
Cycling '74 Max 8でUDP制御をテストしてみる
Maxは上記のように、各コマンドをワイヤでつないでいく操作を基本としています。従来のプログラミングにあるようなコマンドラインでコマンドを打っていく・・・といった物では無いようです。
※もちろん、CUIによるプログラミングも可能なようです
上記は、message、udpsendでUDPコマンド送信、udpreceive、printでUDPコマンド受信を目的とした一番簡素な組み方です。この時点で2つの問題が起きました。
まず一つ目は、UDP制御を行う場合、Max側でNIC(ネットワークインターフェイスカード)が指定出来ない事です。従来、こういった制御コマンド送信はまず目的の制御信号を送出するポートをアプリケーション側から指定する必要があります。
これからUDPコマンドを送出しようと言うのに、送出するためのNICが何なのか、ポートは開いているのかの確認が出来ないのです。
何度かトライしましたが、どうやらNICに関してはMaxはany(PCから見ると全てスイッチ経由とみなしている)での接続になる様で、これはどうする事も出来ませんでした。
※筆者が知っている制御アプリケーションとしてはあり得ない動作ですのでかなり驚きました。
二つ目ですが、udpsendでは任意のコマンドが送信できるのに対し、udpreceiveではOSCコマンドしか受信出来ないという点です。
printはMaxコンソールというコマンドラインに情報を吐き出すオブジェクトなのですがOSCコマンドではない旨を示す「OSC packet size (7) not a multiple of 4 bytes」というエラーが出力されるのです。この辺でもう無理だ、と思いましたが、Cycling '74のフォーラムで下記の記事を見つけました。
https://cycling74.com/forums/udpreceive-gives-me-osc-packet-size-1-not-a-multiple-of-4-bytes-error
根本的な大きな勘違いがここで判明しまして、Cycling '74 Max 8は音響映像のライブパフォーマンスに特化した制御用アプリケーションの為、OSCがUDP制御の基準となっていたのです。
※OSC = Open Sound Control
ここで紹介されている「sadam.udpReceiver」を使用するとUDPコマンドのすべてが受信出来る事がわかりました。また、Maxはこうした有志によるフォーラムでの情報交換がさかんな事、Max用のプラグインを作っている方が沢山いる事を知れました。
※「sadam.udpReceiver」は下記リンクからダウンロードが可能です。
参考リンク:
http://www.sadam.hu/en/software
sadam.udpReceiverを使用した状態
上記は、message、udpsendでUDPコマンド送信、sadam.udpReceiver、printでUDPコマンド受信をした状態です。目的のコマンドが受信出来ました。
itoaでasciiからテキストに変換した状態
上記は、message、udpsendでUDPコマンド送信、sadam.udpReceiver、printでUDPコマンド受信、itoaでテキスト変換しmessageで表示をした状態です。段々分かってきました。
とりあえずこれでUDP制御が可能な事が分かりました。
シリアル制御を考えてみます。
Maxでのシリアル制御
シリアル制御においてはUDP制御の時のようなanyという考え方は無く、ちゃんとポート指定があります。シリアルは詳細な通信設定を行う必要があるからでしょうか?
CRの扱いが不明であったので、asciiを直接打っています。
serialコマンドは送信と受信が一体になっており、このままprintすれば受信コマンドがMaxコンソールに表示されるはず、と考えましたがここでまた難題が降りかかります。なんと何にも表示されません。
調べて見るとasciiは表示しない仕組みの様です。コンソールにすら何も表示しないなんてなんだこれもうダメだ、と本当に思いましたが、あらかじめ来るであろうコマンドとコンペアを行う事が可能だと言う事に気が付きました。
※本来はヘッダで認識し変数を受け取る、といった使い方をする様です
※UDP受信の時の「sadam.udpReceiver」の様な、シリアルコマンド全てを受信できるオブジェクトがあるのかもしれません
返答シリアルコマンドが合致する場合は1を出力
返答シリアルコマンドが合致しない場合は0を出力
ここまで複雑にする必要があるのか・・・と思いましたが、上記の方法で目的のコマンドが来たら1、それ以外は0を出力する動作が可能です。
基本的に、シリアルコマンド送信は、message、serialで完結、100msec後にmatch、zl.compareを実行し、せーので返答コマンドの答え合わせを行います。
きっと、もっと上手なやり方があるかとは思いますが、とりあえずこれでシリアル制御が可能な事が分かりました。
Maxは基本的に「送信コマンドは自由だが、受信コマンドはフィルタがある」という事を念頭に置く必要があります。
そして完成したのが以下です。
Cycling '74 Max 8でBrightSignをUDP・シリアル制御をしてみる
これはUDP・シリアルコマンド送信を同時に行い、返答があった場合、ボタンの横のそれぞれのインジケータが点灯するというものです。映像の表示ももちろん可能なので、返答コマンドが受信出来れば頭合わせで該当番号の映像を同時再生を行い、今映像はこれくらいの再生位置だな、というのが目視で分かるようにしてみました。(BrightSign側の映像データをPC側に入れる作業が必要です)
拡大
UDP制御コマンドを送出する場合はCRなし、シリアル制御コマンドの場合はCRありという条件だったのでこの様になりました・・・・・・
※zl.joinオブジェクトでコマンド連結を行うとスペースが入ってしまい諦めた
各ボタンにはMIDIやキーボードをアサインする事も可能です。
Maxはプレゼンテーションモードと言うものがあり、必要な情報だけを表示できます。
プレゼンテーションモード。表示させたい情報のみ表示するとそれっぽくなる
https://www.youtube.com/watch?v=h6q092-_duU
実際の動作の動画
また、これらをexeファイルで書き出し、アプリケーションとして実行する事が可能です。
但し、その場合はudpsendのipアドレスの変更が利かないので筆者が望む動作をしません・・・
シリアル制御ポートはドロップダウンで変更が可能です。
※こちらもきっとクリアできる課題かと思います。
udpsendは手打ち、serial制御はドロップダウンで設定変更が可能
以上で終了です。
これが誰かの役に立つとは思えませんが、自分の備忘録としてここに残します。