---
name: writing-shows
description: Write a light show for club.slopped.site - one plain-text file ([track] [rig] [palette] [cues] [chase] [fx] [video]) programmed to one of DJ Sloppy Droppy's remixes - that validates first time, passes the flash check and looks good. Covers the workflow (write, check in the editor, fix, share as a link), the rig and DMX patching, timing to the song's bars and sections, chases in Patter, effects with phase spread, pixel-mapped video, lighting craft for dance music, the safety rules and the validator's common complaints. Use when asked to make, fix, extend or review a show for club.slopped.site.
---

# Writing shows

A show is one UTF-8 text file, up to 32 KB: a light show programmed to one song, the way a lighting desk keeps its
cues. It plays on https://club.slopped.site/ in 2D or 3D, in time with the song, and drives a virtual DMX universe.

- The full specification (every word, every limit, the songs and their sections): https://club.slopped.site/spec.md
- The same, for people: https://club.slopped.site/format/
- The editor (the file beside the room, checked as you type): https://club.slopped.site/editor/
- The six shows DJ Sloppy Droppy programmed, to read and copy: https://club.slopped.site/shows/index.json lists them;
  each is at https://club.slopped.site/shows/<song id>.show

## The workflow

1. **Pick the song** from the spec's set table and note its sections and roles: you will time things to them.
2. **Write the whole file.** Start from a bundled show (the house rig is in every one) or the skeleton below.
3. **Check it** in the editor: paste it in. Every error has a line and says what would be right; fix the top one first.
   The status then runs the flash check over the whole song (a few seconds).
4. **Watch it.** Press Play: the song plays from its notes and the room follows. Scrub to the build and the drop.
   Try Calm lights too: the same show with reduced motion must still read well.
5. **Share it.** "Copy a link" puts the whole show in the link's `#s=1.…` fragment; nothing is uploaded. Links stop at
   12,000 characters; bigger shows travel as `.show` files.

## The shape of a file

```text
show 1
title: Tea Break, my way
by: you
seed: 7                         random chases and sparkle follow it

[track]
song: tea-break-sloppy-droppy   an id from the spec's set table

[rig]
par front*8 at -8,3,7 to 8,3,7 in pars      eight pars in a row over the floor: front1..front8, group "front"
wash head*4 at -6,-1,8.5 to 6,-1,8.5 in heads
wall screen at 0,-6.6,6 px 24x12 m 10x5     a pixel wall on its own universe
haze fog at 0,-6.8,0.5                       beams only show in haze

[palette]
color tea #c8702a
pos crowd pan -25..25 tilt 55                a fan across the fixtures it is given to

[cues]
1 fog: dim 50
1 pars: color tea dim 20 fade 8 bars
drop heads: pos crowd color white dim 90
drop run pour for 32 bars
breakdown all: dim 0 fade 4 bars

[chase pour]
on: pars
pattern: x ~ x ~                             Patter: one cycle (a bar) of steps and rests
order: inout
look: dim 90 color white
decay: 1.5b
```

## The room

Metres. `x` across (negative is left as the floor sees it), `y` from the stage edge into the room (the stage is
negative, to -7; the floor runs to 16), `z` up to 11. The booth is at 0,-2.2 on a stage 1 m high. A head below 1.5 m
stands and points up; above, it hangs and points down, tilting towards the room as tilt grows. Pan 0 faces the room.

Good places: a wall at the back of the stage (y about -6.6, z 5 to 7); spots standing on the stage (z 1.2) for beams up
through the haze; washes on a truss over the stage edge (y -1, z 8.5); pars over the floor (y 2 to 4, z 7); blinders at
the sides facing the floor; strobes high at the back.

Fixtures patch themselves from universe 1, address 1, in order; a wall starts a universe of its own. The 2D view's DMX
monitor shows every channel; point at one to see whose it is.

## Timing

Dance music is counted in bars of four beats, in phrases of 8 and sections of 16 or 32. Change things on bar 1 of a
phrase and the room feels in time; change them anywhere else and it feels late.

- Time cues by section: `drop`, `breakdown+8`, `drop#2`, `build+15.4` (the last beat before a drop). The spec lists every
  song's section names and roles; a role works where a name doesn't.
- Lengths: `4b` (beats), `2 bars`. `run hits for 16 bars` stops by itself; `stop hits` stops early.
- Cues track: a value stays until another cue changes it. Fades are in beats or bars.

## Craft that works (and what the bundled shows do)

- **Restraint, then the hit.** Keep intros low and slow (one colour, a few lights, slow fades). Take almost everything
  away in the last beat of a build (`build+15.4 all: dim 0`), then land the drop: blinders for one beat
  (`drop blind: dim 100`, `drop.2 blind: dim 0 fade 1b`), heads to the crowd, the main chase on.
- **Builds speed up in steps:** quarter notes for four bars, eighths for four, then sixteenths across a wide group, never
  faster than the safety rules allow (below).
- **Breakdowns are slow and cool:** one beam (a single spot on the booth works), uplights breathing on a long sine,
  haze up, the wall slow.
- **Colour:** one main colour and one accent a section; complementary pairs on different fixtures, not the same one.
  Warm on the peaks, cool in the breakdowns. Saturated red never flashes.
- **Movement follows the tempo:** pan sweeps of 2 to 8 bars, `spread: 180` with `wings: 2` for mirrored fans.
- **The wall is part of the rig:** name LED bars with it (`on: screen+bars`) and the bars show the same picture.
- **Strobes are punctuation:** one bar at 2 a second on a drop, then off.

## Safety: the rules a show must pass

The club plays every show through, frame by frame, before it is allowed to play, and refuses one that flashes more than
three times in any one second anywhere (WCAG 2.3.1): any single light, any ninth of the stage, the whole view, or a
patch of wall pixels larger than about 6 m² flashing together; saturated red counts on its own. A refusal names the
bar, the beat and what flashed. To stay inside:

- `strobe` is 3 at most.
- A chase lights each fixture at (hits a second) ÷ (fixtures ÷ width). At 175 BPM sixteenths are 11.7 hits a second:
  over 8 pars with width 2 that is about 2.9 for each par, right at the limit. Eighths are safe almost everywhere.
- A light that flashes on its own (order: all, or one fixture) flashes at the hit rate: keep those to quarter notes or
  slower above 180 BPM, eighths below 90.
- Dimmer effects (`attr: dim`) with square or pulse waves flash once a period: a period of 1 beat at 140 BPM is 2.3 a
  second; half a beat is too fast.
- A checker or a full-wall pulse flashes the whole wall: a period of 1 bar or longer.

With reduced motion on (the visitor's setting, or Calm lights), strobes stop, chases become slow fades, effects slow
down and swing less, and video slows: write shows that still make sense like that.

## What the validator says, and what fixes it

| It says | Fix |
| --- | --- |
| `There is no fixture or group called “x”` | a typo, or a group you never made with `in`; types (`par`, `wash`) and `all` are groups too |
| `The song has no section called “x”` | use a name or role from the spec's set table (it lists them) |
| `“x” is already in the palette` | colours, positions and beams share one set of names |
| `None of pars has pan` | only `wash` and `spot` move and zoom; only `spot` has gobos and a prism |
| `strobe is 0 to 3 flashes a second` | the safety limit; slower |
| `Too much flashing at bar N…` | slow the chase, widen it over more fixtures, lengthen the effect's period, or lower its size |
| `“x” is defined but never run` (a warning) | add `run x` to `[cues]` |

## Skeleton

```text
show 1
title: (a name)
by: (you)

[track]
song: (a song id: a trance remix, which has a build section)

[rig]
par front*8 at -8,3,7 to 8,3,7 in pars
wash head*6 at -7.5,-1,8.5 to 7.5,-1,8.5 in heads
spot beam*4 at -6,-5.2,1.2 to 6,-5.2,1.2 in spots
wall screen at 0,-6.6,6 px 24x12 m 10x5
blinder blind*2 at -9.5,0.5,3 to 9.5,0.5,3
haze fog at 0,-6.8,0.5

[palette]
color main #59ff7a
color accent #ff5c8a
pos crowd pan -25..25 tilt 60

[cues]
1 fog: dim 50
1 pars: color main dim 20 fade 8 bars
build run lift for 15 bars
build+15.4 all: dim 0
drop blind: dim 100
drop.2 blind: dim 0 fade 1b
drop heads: pos crowd color accent dim 90
drop run hits for 32 bars

[chase lift]
on: pars
pattern: x x x x
look: dim 80 color main
decay: 0.75b

[chase hits]
on: pars
pattern: x x x x
order: inout
look: dim 100 color white
decay: 0.75b
```
