DMD Editor

DMD Editor

The DMD editor builds the animations that play on a table’s dot-matrix display — the panel on the backglass. A scene is a timed, layered document that cade folds into one frame per display: you stack layers, place text, live values, images, and animations onto the panel, give each one a start time and a duration, and watch the whole thing play back.

Everything you see on this page is composed by the engine, not drawn by the browser. The selection boxes, handles, and marks are chrome over cade’s own frame, so what the preview shows is what ships.

It shares the shared editor shell — the same drawer, toolbar, and rebindable shortcuts as the rules, lightshow, and sound editors — but it has no node graph. Reach it from DMD in the top bar.

The layout

There are no view tabs: the Stage and the Timeline are both on screen at once, because where an element sits and when it appears are one decision. Drag the grip between them to re-split, or focus it and use Up / Down.

RegionWhat it is
Stage (top)The composed frame at the playhead — 128×32 on the shipped table — with a placement box drawn over each element
Timeline (bottom)A ruler and playhead, one row per layer, one lane per element
Add element (left)The palette of element kinds, with a filter box
Asset browser (left)The asset catalog, collapsed until you open it
Preview (right)The same frame again, chrome-free — the clean picture beside the annotated one
Scenes (right)Every scene this table declares
Details (right)The selected element or layer, with a live control for each of its parameters

A breadcrumb reads Show › layer name when you have drilled into a layer; click a crumb to come back out. The toolbar carries Undo, Redo, and Copy link — which copies a link to exactly the scene, layer, and element you are looking at.

Scrubbing and playing

The ruler along the top of the Timeline is the scrub surface: drag on it and the playhead follows, snapping to a frame boundary so you land on a frame rather than partway into one. The grid is drawn at the display’s own refresh rate; if the engine doesn’t report one, no grid is drawn and nothing snaps. Scroll over the ruler to zoom about the pointer, Shift+scroll to pan.

The player controls sit in the Timeline’s own head corner, next to the playhead they drive: play, II pause, a Loop checkbox, and a readout like t=1.25s / 6.00s · loop. Space toggles play and pause from anywhere on the page. Playback runs on wall time and does not snap — only the scrub gesture does. There is deliberately no second scrub slider on the strip, since the ruler already is one.

Layers

Layer rows are listed front-first — the order they actually composite in — so the reorder drag means what it looks like it means.

ActionHow
Add+ Layer, at the foot of the layer column. The form takes a name plus priority, blend, and opacity
ReorderPress and drag the layer’s row; a drop line shows where it will land
Edit its paramsThe button, or select the row and edit in Details
RenameThe button
RemoveThe button — it confirms first, and it is undoable
HideThe / toggle
FoldThe fold arrow, which condenses all its elements onto one row
Drill inDouble-click the row, or press Enter on it

Elements

KindWhat it is
TextA fixed string, resolved once when the show starts
Bound ValueA runtime-bound string re-evaluated every tick — a score that keeps climbing on the panel
ImageA still image, placed and sized in a pixel box
AnimationAn animated GIF or sprite sheet, placed and sized like an image

Add one by clicking its palette tile, by pressing the digit on the tile’s badge, or by dragging the tile straight onto the plane to place it where you drop it. Dropping off the plane cancels and writes nothing.

Select an element by clicking its Stage box or its Timeline mark. Shift- or Ctrl-click toggles more into the set, a rubber-band drag on empty plane replaces the set, and Escape clears it. Drag a box to move it — dragging one that is already in a multi-selection moves the whole group rigidly — and the eight handles resize it when that kind has a writable width and height. A move the engine refuses snaps back.

Everything else is in the Details rail: every parameter cade publishes for that kind becomes a live control there. Rows are grouped under Placement (layer, x, y, footprint, at, for) and Content (the rest). F2 renames; Delete or Backspace removes the whole selection as one undo step.

A caption under the Stage explains the one piece of notation: a dashed green box marks a runtime-bound value, and the box is the footprint reserved for it. Scrubbing does not animate it, because its value is only known while the game runs. Underneath, a live problem list names anything placed off the plane or reserving more width than the panel has.

The two hide toggles do opposite things

This is the single easiest thing to get wrong on this page.

  • ■ / □ on a layer row is a real edit. It writes opacity 0, so the art disappears everywhere that show plays. It is undoable, like any other edit.
  • ◉ / ○ on an element row is chrome only. It stops the Stage drawing a box for that element so you can’t grab it by accident. The art still renders. Hiding an element doesn’t deselect it, so Details stays bound to it — which is how you find it again to un-hide.

Starting a show

Each row in Scenes shows the triggers that start it as chips (⊳ device.spinner_001.hit, with a ? when it carries a guard). adds one — the form asks when, from a list of the events cade knows, plus an optional condition — and removes one. A scene with none reads no trigger — inert, and a show can always be started from a scoring rule instead.

The P number on a row is the fold order against the other scenes on the same display: higher sits on top. Clicking a row opens that scene; double-click or right-click it for its settings — duration, loop, device, priority, blend, opacity, and its name.

A scene’s device is an authoring-time default so the editor has geometry to preview against. Play time still decides which display it lands on.

There is no Save button

Every gesture commits immediately: the edit goes to the running engine, cade validates it and rewrites the table’s DMD configuration, and the editor re-reads the result. If cade refuses, nothing is written and the refusal is stated out loud. Undo and Redo restore that configuration’s previous text, so they are a real source-level history rather than a stack of inverse gestures — you can read and edit the same text directly on the Source page.

The edited configuration is kept as a draft in your browser, re-adopted on the next load, and pushed to other open windows, which repaint.

The status line

The status line at the foot of the window is where this page says what it is doing, always prefixed DMD ·. It has three registers, and they look different on purpose:

  • Ordinary grey for a statement of fact — DMD · Attract.
  • Amber for a degraded frame — DMD · Attract — rendered without 2 elements whose art could not be loaded: back/backdrop, front/logo. A missing image costs one element, never the whole frame, and playback stays available. The Preview section repeats the notice under the picture it explains.
  • Red for a refusal, which is announced rather than just displayed.

Fixture mode

If no engine answers, or the engine answers but the table declares no scene, the page still opens — against a bundled sample scene called Attract. The status line names which of the two it is, because they call for different fixes:

No cade engine answered — this page needs the full engine build, which carries the display-show exports.

This machine declares no display_show block, so there is no authored show to open.

In fixture mode the transport is disabled with its reason attached, and every edit refuses out loud rather than quietly doing nothing.

Related: a control the engine could only ever refuse is hidden rather than shown greyed. If + Layer or a layer row’s ⚙ ✎ ✕ are absent, this engine publishes no such operation — a grey control would read as broken instead.

Signing in

The editor itself needs no account. The only thing gated is uploading into the Asset browser: browsing and using what is already in the catalog works signed out. Only image rows can be dragged out of the browser — dropping one onto an existing element retargets its art, dropping on open plane creates a new element, and holding Shift always creates.