DMX caputre/playback software
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

55 lines
1.9 KiB

import socket
import struct
import time
def send_dmx(universe=0, num_channels=512, fade_time=5):
UDP_IP = '255.255.255.255' # Broadcast address
UDP_PORT = 6454
# Create UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sequence = 0
physical = 0
# Fading parameters
fade_steps = 100
fade_interval = fade_time / fade_steps
try:
while True:
# Fade up
for value in range(0, 256):
dmx_data = [value] * num_channels
dmx_packet = build_artdmx_packet(sequence, physical, universe, dmx_data)
sock.sendto(dmx_packet, (UDP_IP, UDP_PORT))
time.sleep(fade_interval / 256)
# Fade down
for value in range(255, -1, -1):
dmx_data = [value] * num_channels
dmx_packet = build_artdmx_packet(sequence, physical, universe, dmx_data)
sock.sendto(dmx_packet, (UDP_IP, UDP_PORT))
time.sleep(fade_interval / 256)
except KeyboardInterrupt:
print("DMX transmission stopped.")
finally:
sock.close()
def build_artdmx_packet(sequence, physical, universe, dmx_data):
header = b'Art-Net\x00' # Protocol identifier
opcode = struct.pack('<H', 0x5000) # OpCode: ArtDMX (0x5000), little endian
protocol_version = struct.pack('>H', 14) # Protocol version (14 for Art-Net)
sequence = struct.pack('B', sequence) # Sequence
physical = struct.pack('B', physical) # Physical port
universe = struct.pack('<H', universe) # Universe, little endian
length = struct.pack('>H', len(dmx_data)) # Data length, big endian
data = bytes(dmx_data) # DMX data
packet = header + opcode + protocol_version + sequence + physical + universe + length + data
return packet
if __name__ == '__main__':
send_dmx()