タグ「Art-Net」を含む投稿(時系列順)[93件]
やらねばならないことがありますがカラダが悲鳴を上げていて半日は強制休養です。年齢と共に筋力も持久力も回復力も落ちております。
pythonでArt-Netを扱う妄想はしております。
setsocketoptでsocketのインスタンスにインターフェース指定してバインドする方法はいけそうです。
NICに与えるIPアドレスは規格書にある自動設定で決めようと思います。MACアドレスから得る方法です。
データの入り口と出口、つまりデバイスがキチンと設定されれば後はそれほど難しくありません。
ただ、Art-Netの規格書が「熟知した人のオレメモ」なので解読は大変です。わかってしまえば難しくないのですが、説明書として成り立っていないのです。独自用語が突然登場して何の説明も無いまま使われるとか、数値の表し方がバイナリなのかテキストなのかBCDなのか不明瞭とか、2バイト以上のバイナリ数のエンディアンがわからんとか、具体的な処理を作るための重要定義が曖昧なのです。
幸いというか対策としては、ver1から4まである規格書を全部読めばお互いに補完できるところが多いことです。この部分はver1、この部分はver3みたいな読み解き方です。古文書でも相手にしている気分になりますが、この方法で理解を進めるしかありません。総括的にはver3が一番明瞭で曖昧さが少ないと思います。興味のある方はver3から読むことをお勧めします。
勉強したのはしばらく前ですから再勉強しないといけませんが、自分なりの解説書を書き起こしながら進めるのが良さそうです。
#[Art-Net]
pythonでArt-Netを扱う妄想はしております。
setsocketoptでsocketのインスタンスにインターフェース指定してバインドする方法はいけそうです。
NICに与えるIPアドレスは規格書にある自動設定で決めようと思います。MACアドレスから得る方法です。
データの入り口と出口、つまりデバイスがキチンと設定されれば後はそれほど難しくありません。
ただ、Art-Netの規格書が「熟知した人のオレメモ」なので解読は大変です。わかってしまえば難しくないのですが、説明書として成り立っていないのです。独自用語が突然登場して何の説明も無いまま使われるとか、数値の表し方がバイナリなのかテキストなのかBCDなのか不明瞭とか、2バイト以上のバイナリ数のエンディアンがわからんとか、具体的な処理を作るための重要定義が曖昧なのです。
幸いというか対策としては、ver1から4まである規格書を全部読めばお互いに補完できるところが多いことです。この部分はver1、この部分はver3みたいな読み解き方です。古文書でも相手にしている気分になりますが、この方法で理解を進めるしかありません。総括的にはver3が一番明瞭で曖昧さが少ないと思います。興味のある方はver3から読むことをお勧めします。
勉強したのはしばらく前ですから再勉強しないといけませんが、自分なりの解説書を書き起こしながら進めるのが良さそうです。
#[Art-Net]
Art-Net3の英文規格書を翻訳してみました。解説書を作るにしてもまずは文章の翻訳からです。
自力で翻訳など出来ませんので「Doc Translator」を利用してみました。
無料だとファイルサイズ10MBの制限がありますが、幸い規格書は900kBでした。
この翻訳サイトいいですね。
翻訳された文章も読みやすく、表のレイアウトがほぼ崩れません。
これを元に自分なりの解説書を作ります。
誤訳が混じっていたとしても、日本語になっているだけでハードルはグンと下がります。
#[Art-Net]
自力で翻訳など出来ませんので「Doc Translator」を利用してみました。
無料だとファイルサイズ10MBの制限がありますが、幸い規格書は900kBでした。
この翻訳サイトいいですね。
翻訳された文章も読みやすく、表のレイアウトがほぼ崩れません。
これを元に自分なりの解説書を作ります。
誤訳が混じっていたとしても、日本語になっているだけでハードルはグンと下がります。
#[Art-Net]
Art-Netの規格書を読んでいてイマイチわからんことがあります。
「Network Switch (ネットワークスイッチ)」という用語です。IPアドレスの頭1バイトがOFFなら「2」、ONなら「10」になります。突然登場して説明が無い用語の代表株です。
現実には「Art-Netのアドレスは頭1バイトが2もしくは10になるので合わせればいい」となりますが、あえてONとOFFがある意味は何なのか。
Googleで「Network Switch」を検索するとハブのことであるとしか出て来ない。アドレスの定義でハブをON/OFFする!?
「Network Switch (ネットワークスイッチ)」ではなく「Net Switch」ならわかるのです。Art-Net3から拡張されたユニバースを表す「Net」が有効か無効かを定義するならわからんでもありません。つまり、Art-Net1や2互換なら2.xxx.xxx.xxxを使い、Art-Net3以降をフル機能で使うなら10.xxx.xxx.xxxとすべしということなのかな?
2.255.255.255がPrimary Art-Net Address、10.255.255.255がSecondary Art-Net Addressと呼ぶのはいいとして、Art-Netにおける「Network Switch」とは何なのか。
私の不勉強のせいかもしれませんが。。。
この辺りは気にせず、BroadCastで「ArtDMX」と呼ばれるパケットだけを扱えばいいのかな?って気もします。
その他のパケットはUniCastを補完したりNetWorkの状態を検査するインテリジェンス機能です。無いなら無いでもいいかなと。
DIY機器など最大16ユニバース扱えれば十分過ぎます。足りない人は高級品を使えばいいし。
1秒間に44フレーム、16ユニバースなら約400kB/秒です。動画ストリーミングと比べたら誤差レベルのデータ量。
#[Art-Net]
「Network Switch (ネットワークスイッチ)」という用語です。IPアドレスの頭1バイトがOFFなら「2」、ONなら「10」になります。突然登場して説明が無い用語の代表株です。
現実には「Art-Netのアドレスは頭1バイトが2もしくは10になるので合わせればいい」となりますが、あえてONとOFFがある意味は何なのか。
Googleで「Network Switch」を検索するとハブのことであるとしか出て来ない。アドレスの定義でハブをON/OFFする!?
「Network Switch (ネットワークスイッチ)」ではなく「Net Switch」ならわかるのです。Art-Net3から拡張されたユニバースを表す「Net」が有効か無効かを定義するならわからんでもありません。つまり、Art-Net1や2互換なら2.xxx.xxx.xxxを使い、Art-Net3以降をフル機能で使うなら10.xxx.xxx.xxxとすべしということなのかな?
2.255.255.255がPrimary Art-Net Address、10.255.255.255がSecondary Art-Net Addressと呼ぶのはいいとして、Art-Netにおける「Network Switch」とは何なのか。
私の不勉強のせいかもしれませんが。。。
この辺りは気にせず、BroadCastで「ArtDMX」と呼ばれるパケットだけを扱えばいいのかな?って気もします。
その他のパケットはUniCastを補完したりNetWorkの状態を検査するインテリジェンス機能です。無いなら無いでもいいかなと。
DIY機器など最大16ユニバース扱えれば十分過ぎます。足りない人は高級品を使えばいいし。
1秒間に44フレーム、16ユニバースなら約400kB/秒です。動画ストリーミングと比べたら誤差レベルのデータ量。
#[Art-Net]
Art-Netに関するまとめを始めました。
「Art-NetをDIYしてみる 」
規格を整理し始めた段階で実証実験などはこれからの途中記事ですが、pukiwikiには編集中の記事を隠しておく機能が無いので広めてもいいかなと。。。
#ガチ工作 #[Art-Net]
「Art-NetをDIYしてみる 」
規格を整理し始めた段階で実証実験などはこれからの途中記事ですが、pukiwikiには編集中の記事を隠しておく機能が無いので広めてもいいかなと。。。
#ガチ工作 #[Art-Net]
頭を整理するのに「Art-NetをDIYしてみる 」を校正しています。
文章の良し悪しはともかく、人に説明する文章を書こうとすると頭が整理されます。
Art-Netの内容、良し悪し、処理の流れなどのイメージがハッキリしてきました。
年末年始休暇で手を付けられるかわかりませんが、出来るだけ早くモノにしたいです。
DMX512をPICマイコンで扱うことは十数年前に成功していますので、「DMX512をDIYしてみる」といった記事もそのうち書いてみましょう。
#ガチ工作 #[Art-Net]
文章の良し悪しはともかく、人に説明する文章を書こうとすると頭が整理されます。
Art-Netの内容、良し悪し、処理の流れなどのイメージがハッキリしてきました。
年末年始休暇で手を付けられるかわかりませんが、出来るだけ早くモノにしたいです。
DMX512をPICマイコンで扱うことは十数年前に成功していますので、「DMX512をDIYしてみる」といった記事もそのうち書いてみましょう。
#ガチ工作 #[Art-Net]
ライトアップや客席テーブルver4.5などの取り急ぎの物件に区切りが付いたので、Art-Netの実験を始めていこうかなと。
その為にもRaspberryPiの整備からです。7インチの公式タッチパネルディスプレイを使った開発機を組みましょう。
#[Art-Net] #[RaspberryPi]
その為にもRaspberryPiの整備からです。7インチの公式タッチパネルディスプレイを使った開発機を組みましょう。
#[Art-Net] #[RaspberryPi]
本業も工作も取り急ぎの課題が無い状況です。精神的に追われる感覚が無いのは久しぶりです。
Art-NetをRaspberryPiで扱う研究の準備は進めていますが、気持ちとしてはユッタリしております。
ヒマってことは稼ぎが無いことでもあるので、あまり良い状況でもないのですが・・・
Art-Netを扱うRaspberryPiでは同一ゼグメントのIPアドレスを振った2つ以上のNICを別ゾーンとして扱うことが肝になります。入力のArt-Netと出力のArt-Netを1つのRaspberryPiで扱うには必要条件です。
この状態はサーバーやネットワークを複雑に組むと発生し得ることなので可能だと思うのですが、私が適切な設定やプログラミングを出来るかは別問題なので、その研究というか勉強をするワケです。
となると、実験用に複数のRaspberryPiが必要です。
1台は公式7吋モニタで組んだ方が後々の表示作りで都合が良いと思いますが、他はモニタを持たずにSSHでアクセス出来れば済むので、数台をまとめられる箱もあるといいですね。
この様な箱は既製品にもあるにはありますが、RaspberryPiを束に出来るだけで、電源が考慮されいないだけでなく組んでしまうとGIPOに触りにくい状態になります。これじゃダメです。
作るのも面倒なので改めて探してはみますが、キレイにカットしてキレイに塗装した1枚板に必要な物を取り付ければそれでもいいのかな?とも思っております。
#[Art-Net] #[RaspberryPi]
Art-NetをRaspberryPiで扱う研究の準備は進めていますが、気持ちとしてはユッタリしております。
ヒマってことは稼ぎが無いことでもあるので、あまり良い状況でもないのですが・・・
Art-Netを扱うRaspberryPiでは同一ゼグメントのIPアドレスを振った2つ以上のNICを別ゾーンとして扱うことが肝になります。入力のArt-Netと出力のArt-Netを1つのRaspberryPiで扱うには必要条件です。
この状態はサーバーやネットワークを複雑に組むと発生し得ることなので可能だと思うのですが、私が適切な設定やプログラミングを出来るかは別問題なので、その研究というか勉強をするワケです。
となると、実験用に複数のRaspberryPiが必要です。
1台は公式7吋モニタで組んだ方が後々の表示作りで都合が良いと思いますが、他はモニタを持たずにSSHでアクセス出来れば済むので、数台をまとめられる箱もあるといいですね。
この様な箱は既製品にもあるにはありますが、RaspberryPiを束に出来るだけで、電源が考慮されいないだけでなく組んでしまうとGIPOに触りにくい状態になります。これじゃダメです。
作るのも面倒なので改めて探してはみますが、キレイにカットしてキレイに塗装した1枚板に必要な物を取り付ければそれでもいいのかな?とも思っております。
#[Art-Net] #[RaspberryPi]
Art-Netを扱うためにはNICのアドレスを設定しなければなりません。
手計算した値をOSに手打ち設定をしてもいいのですが、どうせなら自動設定にしたい。NICのMACアドレスとArt-NetのOEMコードがわかれば人が判断する要素は無く計算も単純なのですから。
アプリケーションはPythonで書くつもりですが、OSの自動設定はbashスクリプトで書くのが自分流です。なぜなら、PythonでOS設定を変更すると結局はbashコマンドを発行するのですから同じ事です。なんでもかんでも高級言語を使えばいいってもんでもないんです。
やることは、MACアドレスを文字列で取得し、必要な部分を切り出し、一部の文字列を数値に変換して計算し、IPアドレス起こしてコマンド文字列を作って実行するだけです。Linux(UNIX)は標準コマンドだけでこういったスクリプトを簡単に作れます。
わたしはググってコピペするだけですけどね。
#[Art-Net] #[RaspberryPi]
手計算した値をOSに手打ち設定をしてもいいのですが、どうせなら自動設定にしたい。NICのMACアドレスとArt-NetのOEMコードがわかれば人が判断する要素は無く計算も単純なのですから。
アプリケーションはPythonで書くつもりですが、OSの自動設定はbashスクリプトで書くのが自分流です。なぜなら、PythonでOS設定を変更すると結局はbashコマンドを発行するのですから同じ事です。なんでもかんでも高級言語を使えばいいってもんでもないんです。
やることは、MACアドレスを文字列で取得し、必要な部分を切り出し、一部の文字列を数値に変換して計算し、IPアドレス起こしてコマンド文字列を作って実行するだけです。Linux(UNIX)は標準コマンドだけでこういったスクリプトを簡単に作れます。
わたしはググってコピペするだけですけどね。
#[Art-Net] #[RaspberryPi]
Art-Netのアプリは画面表示とキー操作まで一応の完成をみました。
キー操作はレスポンスに少しムラがあるので改善したい点です。使えるレベルなので今のところは将来課題としておきますが、ユーザーがご機嫌をうかがいながら使うユーザーインターフェースは大嫌いなのでとても重要です。
余談ですが、売れている卓とそうでもない卓の違いにはこういった点の僅かなストレスの差もあります。卓は手段としての道具ですが、国内メーカーはカタログスペックばかり求めて手に馴染む道具を作ろうとしない。買うのは使う人ではありませんから仕方ないことでもありますが、国産のホール卓がダメな点です。国産で唯一、松村さんの卓にはこういったストレスが少ないのですが・・・。
とまぁ愚痴はおいといて、これで本丸であるArt-Netの受信に取り掛かれます。
単純な受信は別回しするThread内のsocketで受けるだけなので難しくないと思うのですが、パケットのデコードが少し面倒かもしれません。Art-Netのパケットはバイト列ですが、これらをPythonで扱いやすい様に分解して変換しなければなりません。Pythonはバイト型の扱いが少し苦手ですし、パケットにはアスキーテキスト、LSBの2バイト数、MSBの2バイト数、バイト型が混在しているので、よく考えて作らないといけません。実行回数が多い処理なだけに軽さも重要です。
#[Art-Net] #Python
キー操作はレスポンスに少しムラがあるので改善したい点です。使えるレベルなので今のところは将来課題としておきますが、ユーザーがご機嫌をうかがいながら使うユーザーインターフェースは大嫌いなのでとても重要です。
余談ですが、売れている卓とそうでもない卓の違いにはこういった点の僅かなストレスの差もあります。卓は手段としての道具ですが、国内メーカーはカタログスペックばかり求めて手に馴染む道具を作ろうとしない。買うのは使う人ではありませんから仕方ないことでもありますが、国産のホール卓がダメな点です。国産で唯一、松村さんの卓にはこういったストレスが少ないのですが・・・。
とまぁ愚痴はおいといて、これで本丸であるArt-Netの受信に取り掛かれます。
単純な受信は別回しするThread内のsocketで受けるだけなので難しくないと思うのですが、パケットのデコードが少し面倒かもしれません。Art-Netのパケットはバイト列ですが、これらをPythonで扱いやすい様に分解して変換しなければなりません。Pythonはバイト型の扱いが少し苦手ですし、パケットにはアスキーテキスト、LSBの2バイト数、MSBの2バイト数、バイト型が混在しているので、よく考えて作らないといけません。実行回数が多い処理なだけに軽さも重要です。
#[Art-Net] #Python
Art-Netの受信データをデコードする処理を書いてみました。
製作環境はRspberryPi4、Rasbian_buster、Python 3.7.3です。
------
import numpy as np
class coding:
def decode(self, artnet_packet):
""" Art-Netのbyte列を要素に分解する """
id = artnet_packet[0:8]
opcode = int.from_bytes(artnet_packet[8:10], 'little')
prover = int.from_bytes(artnet_packet[10:12], 'big')
sequence = int.from_bytes(artnet_packet[12:13], 'little')
physical = int.from_bytes(artnet_packet[13:14], 'little')
subuni = int.from_bytes(artnet_packet[14:15], 'little')
sub = subuni // 16
uni = subuni % 16
net = int.from_bytes(artnet_packet[15:16], 'little')
length = int.from_bytes(artnet_packet[16:18], 'big')
data = np.frombuffer(artnet_packet, dtype=np.uint8, count=length, offset=18)
return (id, opcode, prover, sequence, physical, net, sub, uni, length, data)
if __name__ == '__main__':
an = coding()
id, opcode, prover, sequence, physical, net, sub, uni, length, data_uint8 = an.decode(test_artnet_packet)
※ 行頭の空白には全角を使っています。
------
test_artnet_packetに受信データを入れ、codingのインスタンスanでdecodeを呼び出します。
書いてみたら案外スッキリした物になったので記念に掲載しました。
socketで受信するのはバイナリデータ(Pythonで言うところのバイト列)ですが、これを一発でnumpy.arrayに変換してくれるnumpy.frombufferは便利です。
int.from_bytesもバイト列をエンディアン指定でint数に一発変換してくれて便利です。
私はPICマイコンと協調させて使うことが多いので、こういった機能があると助かります。
上記ですとdataの戻り値がnumpy.uint8ですが、計算するためにはnumpy.uint16の方が良いと思います。
data_uint16 = data.astype(np.uint16)
とかで型変換するといいかもしれません。
#Python #[Art-Net]
製作環境はRspberryPi4、Rasbian_buster、Python 3.7.3です。
------
import numpy as np
class coding:
def decode(self, artnet_packet):
""" Art-Netのbyte列を要素に分解する """
id = artnet_packet[0:8]
opcode = int.from_bytes(artnet_packet[8:10], 'little')
prover = int.from_bytes(artnet_packet[10:12], 'big')
sequence = int.from_bytes(artnet_packet[12:13], 'little')
physical = int.from_bytes(artnet_packet[13:14], 'little')
subuni = int.from_bytes(artnet_packet[14:15], 'little')
sub = subuni // 16
uni = subuni % 16
net = int.from_bytes(artnet_packet[15:16], 'little')
length = int.from_bytes(artnet_packet[16:18], 'big')
data = np.frombuffer(artnet_packet, dtype=np.uint8, count=length, offset=18)
return (id, opcode, prover, sequence, physical, net, sub, uni, length, data)
if __name__ == '__main__':
an = coding()
id, opcode, prover, sequence, physical, net, sub, uni, length, data_uint8 = an.decode(test_artnet_packet)
※ 行頭の空白には全角を使っています。
------
test_artnet_packetに受信データを入れ、codingのインスタンスanでdecodeを呼び出します。
書いてみたら案外スッキリした物になったので記念に掲載しました。
socketで受信するのはバイナリデータ(Pythonで言うところのバイト列)ですが、これを一発でnumpy.arrayに変換してくれるnumpy.frombufferは便利です。
int.from_bytesもバイト列をエンディアン指定でint数に一発変換してくれて便利です。
私はPICマイコンと協調させて使うことが多いので、こういった機能があると助かります。
上記ですとdataの戻り値がnumpy.uint8ですが、計算するためにはnumpy.uint16の方が良いと思います。
data_uint16 = data.astype(np.uint16)
とかで型変換するといいかもしれません。
#Python #[Art-Net]