creation/cr_dmx
DMXの使用
DMXに付いて
-
DMXとは、主に映像機器を扱うための通信プロトコルで、MIDIのようにチャンネルを使用してシリアル通信を行います。
MIDIの場合にはバイト単位で細かく取り決めがされていますが、DMXの場合にはBreak時間から来る相性問題を除けば、チャンネルの指定と、それに続くデータのみで、複雑な要素はありません。
コンピュータと照明器具、コンピュータから照明器具をコントロールするためのDMXインターフェイスがあれば、比較的簡単に実現する事が出来ます。チャンネルの指定は9ビットとスタートビット・ストップビットの11ビットで表し、512チャンネルが使えます。バイトをベースにしているMIDIと若干異なる部分ですが、実際にMaxMSP等から使う場合には、こうした事に煩わされること無く使えます。
我々のように照明を専門としていない者にとって、ホール等で使用されているような高価な機材を所有する事は、使用頻度から鑑みても避けた方が良いと思われます。
ホールでの上演の場合には、会場に備えられた機器を利用したり、照明専門のオペレータにお願いする方法が良い結果が得られるのではないでしょうか・・・ここでは、インスタレーションや照明設備が備わっていない空間で、DMXを利用する方法に付いて紹介しています。
DMX規格の機器
-
インスタレーション等で使用するDMX規格の機材を紹介しています。
DMXインターフェイス
コンピュータからDMXにより機器をコントロールするためのインターフェイスです。 ここで取り上げている、ENTTECのDMX USB PROと言う製品が一般的に使用されているもので、MaxMSP用のオブジェクトもあります。ディマー
DMXからの信号を受けて、交流電源のオンオフやレベル調整をします。写真の物は、4チャンネルで使用出来る廉価な製品で、チャンネルはディップスイッチで行います。変換プラグ
DMXインターフェイス側のコネクタが5pinのため、3pinに変換するためのプラグです。オーディオ用のキャノンケーブルと同じく3pinのケーブルですが、双方のインピーダンスが異なり、DMXではデジタル情報を送りますのでDMX用のケーブルを使います。デジタル・オーディオ用のケーブルであれば良いようです。ライト(LED パー ライト)
DMXでコントロール出来るライトは、RGBの情報を各チャンネルに分けて送るため、1台でも、3チャンネルを使用します。従来のDMXでコントロール出来ないライトの場合には、ディマーを使ってコントロールします。ArduinoとDMXシールド
Arduinoのピンにはめ込んで使えるDMXシールドと言う製品が市販されています。写真は、Arduino UNOに取り付けた状態の物で、DMXインターフェイスとして使います。MaxMSP等からはシリアルで通信しますが、Arduino側に簡単なプログラムを書いてあげる必要があります。(MaxMSPを使っていて、Arduino側での操作が煩雑と感じる場合には、Maxuinoを使う事で、Arduinoをコントロールする事も出来ます。)DMXスプリッター
複数のDMX機器を使用する場合には、A機器のOUTからB機器のINへ、更に、B機器のOUTからC機器のINへと言う具合にデイジーチェーン(カスケード接続)をしますが、DMXスプリッターは、1本の入力をパラレル接続の様に複数のOUTへ分けて送ってくれます。なお、デイジーチェーンの最後の機器のOUT端子には、ターミネーターを差します。
DMXによる接続
-
DMXによる機器のコントロールは、一般的に次の様に接続して行います。
MaxMSPからDMXを使う
-
DMX用インターフェイスであるDMX USB PROを使う場合には、簡単なPatchでDMX機器をコントロールする事が出来ます。
[dmxusbpro]と言うオブジェクトに、チャンネルとデータをペアにしたリストを送るだけです。下記のPatchは、左側のメッセージボックスでは、1チャンネルに255を送って最大値に、右側のメッセージボックスは、1チャンネルに0を送って最小値に設定しています。
[dmxusbpro]と言うオブジェクトは10ユーロで手に入れる事が出来たと思います。
DMX USB PROでは無く、Arduinoを使う場合には、[serial]オブジェクトを使って通信しますが、Arduinoのコードを書いてあげる必要があります。
DMXを使ったPatch例
-
DMX USB PROを使った、MaxMSPによる簡単なPatchの例です。
最初に[open]メッセージを送ってから使います。
この例では、1から16までの乱数を使って、16個のアクチュエータを動かすサンプル・パッチです。
幸い、MaxMSPには、[makenote]と言う優秀なオブジェクトがありますので、それを利用して、乱数で出たDMXチャンネルがオンになった20ms後にオフを送ると言う単純なものです。ソレノイド等のアクチュエータは、オンにした後で、確実にオフにする必要がありますので、[makenote]は大変重宝します。 但し、DMXは、MIDIやudp等のように一方通行の通信ですから、少しでも危険な機器を使う場合には、DMXでは無く、Ethernet上で、全2重(双方向通信)であるtcp-ip等を使う方法が安全です。
シーケンスの使用例
-
DMXを使って音楽を演奏する方法として、MIDIのシーケンスを利用する方法もあります。
MIDIのシーケンスを使用する場合には、ノートオフもシーケンスに記録されていますので、キーナンバーをそのままDMXチャンネルに変換していきます。MIDIの場合、ベロシティは127が最高ですから、DMXの最高値である255に対する変換も必要になります。次の例は、単純に機材のオンオフで使用した例です。
予め、Cubase等のDAWソフトを使って、MIDIの音高をDMXチャンネルと見立てたシーケンスを打ち込んでおき、それを再生する際、各音のノートオンやノートアウトをDMXのチャンネルとして変換する方法です。
核になるのは、[seq]オブジェクトで、MIDIファイルを読み込んでMIDIによる演奏を行います。 この例では、[midiparse]オブジェクトで、ノートオンとオフのみを取り出しています。[unpack]の次にある[-47]と言うオブジェクトですが、MIDIのC音(MIDIのKey number = 48)が、DMXの1チャンネルになるように、47を引いています。 なお、MIDIにおけるノートオフの場合、9nH、40H、00Hのように、ノートオンを使って表現する方法が一般的ですが、MIDIのシーケンスファイルでは、8nH、40H、40Hのように記述される事も多いのです。
そうした場合、ここで使用している[midiparse]オブジェクトの右インレットから出力される値が0にならないのではないかと言う疑問が出るかと思いますが、幸い、[midiparse]オブジェクトは、ノートオフを8nHを使って送った場合には、ベロシティを0として出力するようです。
Arduinoを使う場合
-
Arduinoを使う際、多くのデータを送信するとエラーが出て困る事があります。
そこで、バッファサイズを大きくして、スムーズにデータのやり取りをしてくれるようにしてあげます。
Arduinoがコンピュータとシリアル通信を行う時に使うバッファ(メモリー)のサイズが小さいため、やり取りする時に欠損が起きてしまい、照明が消えなかったり、DMXで動かしているアクチュエータが止まらなくなったりします。
コンパイル時にバッファのサイズが決められるので、ヘッダファイルで設定されているバッファサイズを書き換えてコンパイルします。 実際には、Windowsの場合には、Program Files/Arduino/hardware/arduino/avr/coresフォルダにある、HardwareSerial.hファイルの中にある、次の行を変更する事になります。
#define SERIAL_TX_BUFFER_SIZE 128
#define SERIAL_RX_BUFFER_SIZE 256
この行で上限のバイト数を変更出来ますが、変更前にバックアップを取るなど、細心の注意を払った上で行って下さい。
若干のリスクも無くは無いですが、それ程大変な作業ではありませんし、ググればこれに付いて扱っているサイトも幾つかあります。