Release V0.0.2 of Java DMX512 Library With Universes and USB-to-DMX support
Earlier this month, I released V0.0.1 of my new Java library to interact with DMX512 devices using (optionally) the Open Fixture Library (OFL). After some more experimenting, I’m able to announce the next (beta) release V0.0.2 with the following major changes:
- Code refactoring: As this library is still in beta, major changes were expected and happened ;-) The video of V0.0.1 is still valid, but some of the demonstrated code has changed.
- Improved demos: Demo code has been moved to the
demo
directory in the sources to make them easier to understand and reuse. - Introduction of DMX Universes: to be able to control fixtures connected to the two ports of my IP-to-DMX controller, universes needed to be added. (more info below)
- USB-to-DMX Support: First working protocol over serial communication to DMX512! (more info below)
Introduction of DMX Universes
For my tests, I’m using an JUNELIONY ArtNet 1024 2-Port Sulite DMX LAN512 2-Port ArtNet Converter controller. It has two XLR-connectors, labeled as DMX1
and DMX2
, which can be controlled as universe ID 0 and 1.
A new object DMXUniverse
has been introduced to support the use of universes, defined by an id and a list of
DMXClient`. Check this demo code for a full example. This is the simplified code:
// Load moving head fixture from an OFL file
Fixture movingHead = getFixture("picospot-20-led.json");
var movingHeadMode = movingHead.getModeByName("11-channel");
// Load RGB fixture from an OFL file
Fixture rgb = getFixture("led-party-tcl-spot.json");
// Create moving head clients on channel 1 and 12 in universe 1 (= DMX1 = ID 0)
DMXClient movingHead1 = new DMXClient(1, movingHead, movingHeadMode);
DMXClient movingHead2 = new DMXClient(12, movingHead, movingHeadMode);
DMXUniverse universe1 = new DMXUniverse(0, List.of(movingHead1, movingHead2));
// Create RGB clients on channel 23 and 28 in universe 2 (= DMX2 = ID 1)
DMXClient rgb1 = new DMXClient(23, rgb);
DMXClient rgb2 = new DMXClient(28, rgb);
DMXUniverse universe2 = new DMXUniverse(1, List.of(rgb1, rgb2));
// Universe 1 (= DMX1): Set moving heads to center position
movingHead1.setValue("pan", (byte) 127);
movingHead1.setValue("tilt", (byte) 127);
movingHead2.setValue("pan", (byte) 127);
movingHead2.setValue("tilt", (byte) 127);
controller.render(universe1);
// Universe 2 (= DMX2): Set RGBs green and red
rgb1.setValue("green", (byte) 255);
rgb2.setValue("red", (byte) 255);
controller.render(universe2);
USB-to-DMX Support
USB-to-DMX seems to be more challenging compared to the IP-to-DMX ArtNet protocol that already was integrated in V0.0.1. But V0.0.2 has been tested and is working as expected with a DSD TECH SH-RS09B USB to DMX Cable for Freestyler QLC MagicQ and Pi Open Lighting. Such a device is handled on your computer as a serial device, and the com.fazecast.jSerialComm
library is used in my DMX512-library for the serial data transmission.
Multiple example implementations are available in the sources, this is a simplified version:
// Get a list of all available serial ports
var ports = DMXSerialDiscoverTool.getAvailablePorts();
// Log the serial ports
for (var port : ports) {
LOGGER.info(port.getName());
}
// Create a serial controller
var controller = new DMXSerialController("tty.usbserial-BG01OL60",
SerialProtocol.OPEN_DMX_USB);
// Send raw data, identical as in V0.0.1 with an IP controller
controller.render(0, new byte[]{(byte) 127, (byte) 127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
// Are use a fixture, also similar as done with an IP controller
Fixture fixture = OFLParser.parse(new File("led-party-tcl-spot.json"));
DMXClient client = new DMXClient(23, fixture);
DMXUniverse universe = new DMXUniverse(0, client);
client.setValue("dimmer", (byte) 255);
client.setValue("red", (byte) 255);
controller.render(universe);
DMX512 Java Library
The library I created is open-source with its sources on GitHub and releases on Maven Central.
<dependency>
<groupId>be.codewriter</groupId>
<artifactId>dmx512</artifactId>
<version>${dmx512.version}</version>
</dependency>
DMX512 JavaFX Demo Project
The JavaFX user interface demo application has been updated to use V0.0.2 of the library and has proven to work identically with IP-to-DMX and USB-to-DMX. Check the sources on GitHub.
Next Steps
I also have an Enttec Open DMX USB interface, but I didn’t get it working yet… With some chat-based coding approach, I have several serial DMX512 protocols implemented now that you can test, but none resulted in a working solution. I reached out to Enttec for more info about the protocol, but didn’t get a reply yet.
public enum SerialProtocol {
/**
* Simple serial transmission
*/
OPEN_DMX_USB,
/**
* Direct FTDI chip communication
*/
FTDI_CHIP_DIRECT,
/**
* Enttec Open DMX USB (FTDI-based)
*/
ENTTEC_OPEN_DMX,
/**
* Generic serial-based DMX
*/
GENERIC_SERIAL
}
If a solution for this interface can be found, or if other changes or improvements are added, a new version will be released.