![見出し画像](https://assets.st-note.com/production/uploads/images/28808186/rectangle_large_type_2_495a11a5be04b833418a174b694ccdbf.jpg?width=1200)
Max/MSPから照明ソフトのDoctorMXにOSC信号を送るパッチ。
こんにちは。
僕は普段大まかには、音響とプログラミングをまたいで仕事をしたり、開発したり、思索したりしています。アウトプットの形はそれこそ様々ですが、使用するツールはここ最近は一旦落ち着いてきてるのかなとも思います。
・普段使っているアプリケーションたち
・Xcode / iOS や Mac のアプリケーションを作るためのコード・エディター
・Max/MSP / コードベースではなくビジュアルベースのマルチメディア・プログラミングツール
・ableton LIVE! / 音響屋さんご用達のマルチ再生・シーケンスアプリ
・DoctorMX / PC/Macベースの調光/照明信号(DMX512-A)生成ソフト
・美術作品「トコヨノモリ」
そして現在、美術家の竹内良亮さんのお手伝いとして、トコヨノモリという美術作品のために、照明と音響の制御システムを組んでいます。
#トコヨノモリ 作業日。今日は作りたかった粘菌を作っていました。 pic.twitter.com/prllPNsIMy
— 竹内良亮ryosuke takeuchi (@takebamb) May 26, 2020
昨日は誰かがさまよいこんで来たようです。
作業は、照明さんに通常の照明仕込みとシーン作りをお願いして、僕は効果音をつくり、選曲をして、それらを統合制御するプログラムを作成しています。
制御の方向性については、
・音響の面では、あらかじめ作成しておいた キュー(きっかけ)リスト に従って、MIDI 信号をトリガーに使い、ableton LIVE! 上に組んであるシーンを呼び出す。
・照明の面では、音響と同様に、照明ソフトに記憶させているシーンを呼び出すということもしますが。それだけでは表現しきれない複雑なパターンを生成して、すでにあるシーンに重ねたりもしながら、動的で重層的な照明効果を実現する。
といった感じです。
(今回吊り込んだ照明機材のうち、↓LED系のものたち)
・OSC とは
さて、それでは OSC ですが、これは Open Sound Control の略称で、従来からある MIDI の代替も視野に入れて開発された、マルティメディア通信プロトコルです。↓WIKI
照明ソフトの DoctorMX は MIDI にも OSC にも対応していて、それぞれ用意された拡張機能を使えば、DMX信号を生成する流れ(図)の好きな段階に、追加の制御信号を流し込むことができるようになっています。
OSC を受け取る DoctorMX 側の設定は↓こんな感じですね。わりとシンプルな設定に見えます。Max のパッチを解説するときに OSCアドレス というのがキーワードになってきますので覚えておいてください。スクリーンショットの中にある「/maxout」というやつです。
・Max/MSP から OSC信号 を送るパッチ。
というわけで、今回はじめて僕の書いた制御用のMaxパッチ(のごく一部をすこし分かりやすくしたもの)を、試験的に公開してみたいと思います。とは言っても、ほんとに切れ端で、あんまり役に立たないかもしれませんが。もし質問などあれば、コメントにお願いします。
はい、↑これです。データとしてアップロードするまでもないようなシンプルなパッチですね↓(泣)。
・各オブジェクトの解説
それではすこし解説していきます。
Max に関する知識はある程度ある、という前提で書きますので、まだあまり慣れていない方は、Saito Music Lab. さんのドキュメントなどを参考にしてください。
http://www.s-musiclab.jp/mmj_docs/max5/max/max_tutorial/max5_mxtu_top.html
OSC は通信プロトコルなので、決まった文法に沿って記述すると、期待通りの働きをしてくれます。逆にうまくいかないときは、その辺りに誤りがあるということですね。プログラミングでもなんでもそうだと思います。
・それじゃあどんな規則に従えば良いのか。
まずは受け側である DoctorMX の説明書を見てみましょう↓。
OSC アドレス
受信する OSC アドレスを指定します。送信側と受信側を同じにして下さい。
「/」(スラッシュ)ではじめて下さい。
送信側では、ここで指定したアドレスにチャンネル番号を付加することで、チャンネル別に送信できます。例えば、チャンネル 1 は「/dmx/1」です。
任意のチャンネル番号に値を送る場合は、「/基準アドレス」の後に「 / 」をつけて、その後にチャンネル番号を書きましょう、ということですね。
・それでは Max パッチのオブジェクトを下から順に見ていきます。
まずは 「udpsend 127.0.0.1 51200」という部分です。
「udpsend」がオブジェクトの(種類を表す)名前です。それ以降が引数(アーギュメント)、いわゆるオプションみたいなものですね。
OSC は UDP という通信プロトコル(ネットワーク上の高速道路のようなもの)の上を走っていますので、そのルールにも従う必要があります。
「127.0.0.1」というのは、ローカル・ループバック・アドレスを指していて、自分自身のPCにつけた住所みたいなもの。そのあとの「51200」はポート番号で、住所に対する部屋番号みたいなものです。
つまりこのオブジェクトを使うと、UDP のネットワークを使って 住所 127.0.0.1 (自分自身のPC) の 51200号室にデータをお届けできますよ、とゆーことです。
・じゃあどんなデータを送るのか。
というわけで一つ上の「メッセージオブジェクト」を見てみます。
「/maxout/1 0」これは先ほど DoctorMX の個別のチャンネルに向けてデータを送るために作成したアドレスの後に、半角スペースをつけて、さらに 0 を付け足したメッセージですね。
・Max では複数のデータをまとめて送るとき、各メッセージを半角スペースで区切ってリストとして表現します。「udpsend」オブジェクトは「アドレスと値」のペアになったリストを受け取ってデータとして送信するので、このメッセージは「OSCアドレス /maxout/1 (DoctorMX的には /maxout のチャンネル1番)」に「0」という値を送信してください、というメッセージになります。
・任意のチャンネル番号と値のデータを作る。
原理的には毎度このメッセージを書き換えても送信できるのですが、それだと柔軟な運用はできません。というわけで、ナンバーオブジェクトの数値が変わるたびに新しいチャンネルと値のOSC信号を生成する部分を見ていきます。
「sprintf /maxout/%d %d」
今度は「sprintf」というオブジェクトです。C言語をはじめ様々なプログラミング言語でおなじみの「sprintf」ですが、これは指定されたフォーマットに沿って生成された文字列を返すメソッドです。
二つの「 %d 」の部分が引数の受け皿になっていて、左からそれぞれチャンネル番号と値を受け取れるようになっています。「 %d 」は整数として記述するときの修飾子で、例えば小数点付きの数値を送りたい場合は「 %f 」などを使います。
「 %d 」が二つあるということで、上側のインレット(入力)も二つになっています。右から順に新しい数値を入れていって、一番左側のインレットに数値が入力されたとき、下側のアウトレット(出力)から、生成された後の文字列を出力します。
「sprintf」のひとつ上にある「unpack」は、入力されたリストを、個別の値として別々のアウトレットから出力してくれるオブジェクトです。
そしてその上の「1 255」というメッセージが「1」と「255」のリストになっているので、このメッセージを押すと「sprintf」を通って「udpsend」から「(DoctorMXにとっては) チャンネル1番を255(8bitの最大値)に設定しておくれよ」というOSC信号が送られることになります。
・ナンバーオブジェクトの操作でOSCを送る。
丁寧に書くとだいぶ長くなってしまうので、駆け足で。
というわけで、↑のスクリーンショットですが、Channel と Value に対応するナンバーオブジェクトの値を変えるたびに、両方の値を「pack」でリスト化したメッセージが、その下の「unpack」に流れるという部分です。
ナンバーオブジェクトは、ユーザーが(マウスで)値を変更するたびに、その数値を下部のアウトレットから出力します。
そしてそれを受け取るメッセージオブジェクトですが、
・右のインレットに入力した時は、自身の値を書き換えます。
・左のインレットに入力した時は、自身の値をアウトレットから出力します。
・そして同じアウトレットからパッチされた信号は、下流にある各オブジェクトに対して、右から左の順で処理されます。
というわけで、各ナンバーオブジェクトの値が変更されると、その真下のメッセージに値が保存され、次に左側のボタンオブジェクトが呼び出される。呼び出されたボタンオブジェクトは bang というトリガー信号を発して、二つのメッセージに保存された、Channel と Value の値を、それぞれ出力させる。
するとその下にある「pack」オブジェクトが、二つの値をひとつのリストにまとめて、さらにその下へと流す。するとめでたく「sprintf」から「udpsend」を通って、OSC信号が送信される。というように、先ほど解説した部分にまで信号が辿り着くというわけです。
めでたしめでたし。。
・実際に動作を確認してみる。
というわけで、DoctorMX のコンソールの「入力状態」をオンにして、上から流れてくる信号をモニタリングしてみました。チャンネルの1番が、Maxパッチの Value の部分に連動していると思います。
実際にやってみて気づいたのですが、DoctorMX 側では常に信号の入力がないと、ゲージは0に戻ってしまうみたいですね。そのあたりも次回の記事では解決しようと思います。ちなみにその時に使うオブジェクトは「metro」です。
・MIDIの送信パッチ、さらに発展させた落雷パターンのパッチ
こんな感じでMaxパッチを公開してみて、とくに問題が起きなければ、もう少し複雑な処理のパッチも公開してみようと思います。
よくあるもう一つの制御信号として MIDI 関連とか。トコヨノモリでいうと、落雷の音響に合わせた稲妻の明滅パターンや、まるでランタンが呼吸をしているかのような、手描きの明滅パターンのパッチがあります。
当初は音響から流れる心音に合わせて明かりが明滅する、という処理もあったのですが、残念ながら演出的な判断で割愛になりました。
・関連記事
トコヨノモリの作業について、すこし書いています↓。
そして次の記事は↓こちらです。
・Max/MSPからMIDIノートとコントロール・チェンジを送信するパッチ。
・まだまだ続きますよー
というわけで、トコヨノモリの制御パッチ自体は↓まだ全然見切れて見えないくらいありますので、またどこか一部分を切り出して解説できたらなと思います。
長々とお付き合いありがとうございました。それではーー
三橋
この記事が気に入ったらサポートをしてみませんか?