Do you want your ad here?

Contact us to get your ad seen by thousands of users every day!

[email protected]

Release V0.0.2 of Java DMX512 Library With Universes and USB-to-DMX support

  • August 04, 2025
  • 97 Unique Views
  • 3 min read
Table of Contents
Introduction of DMX UniversesUSB-to-DMX SupportDMX512 Java LibraryDMX512 JavaFX Demo ProjectNext Steps

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 was already 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 a chat-based coding approach, I have implemented several serial DMX512 protocols that you can test, but none have resulted in a working solution. I reached out to Enttec for more information about the protocol, but I haven't received 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.

Do you want your ad here?

Contact us to get your ad seen by thousands of users every day!

[email protected]

Comments (0)

Highlight your code snippets using [code lang="language name"] shortcode. Just insert your code between opening and closing tag: [code lang="java"] code [/code]. Or specify another language.

No comments yet. Be the first.

Subscribe to foojay updates:

https://foojay.io/feed/
Copied to the clipboard