Audience: the operator, before hardware arrives or on first hookup. This is the practical companion to ARTNET_PIXEL_MAPPING.md (concepts / engine comparison) and WALKTHROUGH_ARTNET_LED_WALL.md (raw consumer schema). It exists to close WO-242’s owner action A242.1: create one, light something, trust it.
Do not confuse it with a Mapping Node. Both live in the Devices tab, but they are different machines:
| Mapping node | Pixel Map destination | |
|---|---|---|
| What it does | Splits a canvas across GPU/DeckLink video outputs (LED processors, projectors) | Turns a Caspar channel into Art-Net DMX packets for pixel fixtures |
| Output | Video signal on a physical port | UDP packets on the network (port 6454) |
| Where | ”+ Add mapping node” band | Screen destinations panel → Pixel Map (native Art-Net) |
<artnet> consumer containing ONE fixture
group fixture-count = cols x rows that samples the whole channel raster with area
averaging (each fixture cell = the average color of its patch of the frame).Real-world receive side: an Art-Net pixel controller (Advatek PixLite, Falcon, ESPixelStick, any Art-Net→SPI/DMX node) configured with the SAME universe numbering and start address, driving the tape/panels. The controller’s pixel count per output must match what you send.
src/config/artnet-pixelmap-universe.js mirrors the deployed
consumer’s loop exactly).+ → type Pixel Map (native Art-Net).A. Sanity-check the generated config (no restart needed to inspect):
grep -A20 "<artnet>" /home/casparcg/highascg/config/casparcg.config
You should see your <fixture> block (type, start-address, fixture-count “colsxrows”,
host, universe) and a custom <video-mode> whose <id> is the bare WxH.
B. Watch the actual packets. The box ships no tcpdump; use python3. Run this on the machine whose IP you typed as Controller IP (or set Controller IP to another machine on the LAN running an Art-Net monitor app — ArtNetominator / DMX-Workshop on Windows, ArtNetView on macOS):
#!/usr/bin/env python3
# artdmx-peek.py — print incoming ArtDMX frames (universe, length, first pixels)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("0.0.0.0", 6454))
print("listening on :6454 …")
while True:
d, addr = s.recvfrom(2048)
if d[:8] == b"Art-Net\x00" and int.from_bytes(d[8:10], "little") == 0x5000:
uni = int.from_bytes(d[14:16], "little")
ln = int.from_bytes(d[16:18], "big")
px = d[18:18+9]
print(f"{addr[0]} universe={uni} len={ln} rgb0..2={list(px)}")
Expected: one line per universe per refresh tick, and rgb0..2 tracking whatever is on the
channel (take a full-red look → [255, 0, 0, 255, 0, 0, …]).
C. Loopback test on the box itself: set Controller IP to the box’s own LAN IP, run the script here, Apply, take a solid-color look. If universes and colors are right on loopback, the only remaining variables on real hardware are the controller’s patch and wiring order.
legacyJsPixelmap flag) — see the comparison in
ARTNET_PIXEL_MAPPING.md.