hello,
Avec iMal, nous sommes en train de bosser sur la mise en place du festival http://www.imal.org/en/activity/media-f … urope-2010. Plus particulièrement sur le travail de Antoine Schmitt : http://www.citysleeplight.com/[/url]. Ici à Bruxelles, nous projetons ça avec des lampes dmx que nous pilotons via la fonction UDP de la librairie hypermedia.net de processing.
voici le bout de code que j'utilise pour envoyer le tableau de contenu DMX via UDP.
import hypermedia.net.*; // See http://vvvv.org/sites/default/files/user-files/LCplus%20Reference%20v2.0a1.pdf (p83) // and discussion on http://vvvv.org/forum/artnet-to-lanbox public class DMXUDPsender { UDP udp; String pLanboxIP; int pPort; int chanR; DMXUDPsender(String aip, int achanR) { pLanboxIP = aip; // supposes that channels are in the order RGB chanR = achanR; pPort = 4777; udp = new UDP(this); } void free() { if (udp != null) { udp.close(); udp = null; } } // value is 0..255 void resend(int value) { byte valByte = byte(value); // header 4 bytes // message length = 6 (header) + 3 (channels) + 1 padding = 10 // total = 14 int nbBytes = 20; byte [] frame = new byte[nbBytes]; // header frame[0] = byte(0xC0); frame[1] = byte(0xB7); frame[2] = byte(0x0); frame[3] = byte(0x0); // message frame[4] = byte(0xCA); // type Buffer write frame[5] = byte(0x01); // layer A frame[6] = byte(0x00); frame[7] = byte(0x05); // message length = 9 frame[8] = (byte)(floor(chanR/256)); frame[9] = (byte)(chanR % 256); // first channel frame[10] = frame[11] = frame[12] = valByte; // channel value frame[20] = byte(0xFF); // padding udp.send(frame, pLanboxIP, pPort); } }
Ce code fonctionne très bien pour piloter une série de spot écoutant le même canal,
mais je n'arrive pas à produire un code pour piloter plusieurs spots indépendamment -écoutant des canaux différents-.
J'ai du raté un truc du protocole DMX. Quelqu'un a-t-il des conseil à me donner pour arriver à mon but?
Hors ligne
voila la réponse à ma question au cas où ce poste intéresse quelqu'un un jour...
Il faut adresser les spots DMX à partir de l'adresse 7 puis 10, 13 ,16... et ainsi de suite
DMXUDPsender dmxUdpSender; void setup() { String dmxupdip = "192.168.1.77"; dmxUdpSender = new DMXUDPsender(dmxupdip); } void stop() { dmxUdpSender.free(); dmxUdpSender = null; } void draw() { int [] ValueF={ 50,25,31,56,98,50}; /// Tableau de valeur contenant les niveaux RVB pour chaque spot dmxUdpSender.resend(ValueF); } import hypermedia.net.*; // See http://vvvv.org/sites/default/files/user-files/LCplus%20Reference%20v2.0a1.pdf (p83) // and discussion on http://vvvv.org/forum/artnet-to-lanbox public class DMXUDPsender { UDP udp; String pLanboxIP; int pPort; DMXUDPsender(String aip) { pLanboxIP = aip; // supposes that channels are in the order RGB pPort = 4777; udp = new UDP(this); } void free() { if (udp != null) { udp.close(); udp = null; } } // value is 0..255 void resend(color [] data) { // header 4 bytes // message length = 6 (header) + data.length + 1 padding // total = 14 int datalen = data.length; int bufferlen = 4 + 6 + datalen +1; int lngMess = 6 +datalen; byte [] buffer = new byte[bufferlen]; int index=10; // header /*0*/ buffer[0] = byte(0xC0); /*1*/ buffer[1] = byte(0xB7); /*2*/ buffer[2] = byte(0x0); /*3*/ buffer[3] = byte(0x0); // message /*4*/ buffer[4] = byte(0xCA); // type Buffer write /*5*/ buffer[5] = byte(254); // layer A /*6*/ buffer[6] = (byte)(HighByte(lngMess)); // HighByte length HEXA /*7*/ buffer[7] = (byte)( LowByte(ngMess)); // LowByte lenght HEXA /*8*/ buffer[8] = (byte)(HighByte(0x03)); //HighByte first channel /*9*/ buffer[9] = (byte)( LowByte(0x03)); // LowByte first channel for(int i=10 ; i<10+datalen;i++){ buffer[i]=byte(data[i-10]); } if((10+datalen)%2!=0)buffer[10+datalen]= byte(0xFF); else{ buffer=shorten(buffer); } println(buffer); udp.send(buffer, pLanboxIP, pPort); } } int HighByte(int a){ return (a >> 8); } int LowByte(int a){ return (a & 0xFF); }
Hors ligne