c64cast

Performing

Clips#

A clip is a scene fired from a pad. It takes every key an ordinary scene takes, plus how it launches.

[[performance.clips]]
slot = 1
pad = 60
type = "generative"
source = "tunnel"
launch = "trigger"
quantize = "bar"
launchBehavior
triggerPlays through, then loops
gatePlays while held, restores what it interrupted
toggleLatches on and off
quantizeFires
offAt once
beat / barAt the next beat or bar

Building a clip costs real setup time, so a press starts that work at once and the count-in hides it. A launch remembers what it interrupted, one level deep. A stopped clock fires immediately, so a pad always does something.

Tempo#

[performance].tempo_sourceThe grid follows
internal[performance].bpm, re-anchored by a tempo_tap pad
midiExternal MIDI clock, on clock_port if not the control port
audioThe tempo detected on a mic or listen scene

Phase is integrated from the tempo, never snapped, so it cannot jerk backward when a clock byte lands late, and silence freezes the audio grid. Launch quantization, effects with mod_source = "clock" and the WLED broadcast under broadcast_tempo_fallback all consume it.

Looks#

A look is the active clip plus the on-screen scene's whole effect-chain state: what is bypassed, what each parameter is set to, and what modulates it. look_save captures a slot, look_recall re-fires it. Recalled onto a differently built chain, it applies what it can by layer index.

The Console#

Two pages, both served by c64cast. [control].enabled and the control extra serve 127.0.0.1:8765.

RouteDoes
GET /perfThe phone console: clips, rack, tune, tempo, transport, looks, jump
GET /statusScene, index, paused, write latency
GET /scenesThe playlist, and which scene is live
POST /pause, /resume, /skipWhat the keyboard does
POST /reloadRebuild the playlist at the next scene boundary

Every route takes ?system= naming one system, or all. Nothing on the console reaches the audience's screen.

c64cast --serve and the web extra serve the full browser console on 127.0.0.1:8123 instead — a host that holds the Commodore across shows.

On the Live screenDoes
ScreenThe C64's own picture, tapped off the VIC by the U64's FPGA. Watch starts it, Stop ends it. U64 only
Tempo barTap tempo, pause, resume, skip
ScenesThe playlist, with a tap to jump — a cut, no interstitial
TuneThe running scene's color, generator and scope knobs
KeepWrites what you tuned into the config the show is running from

It prints a login URL holding its own token at startup; that token can stop the show, so hand out the read-only link from Session instead. [web].screen_fps = 0 turns the picture off. /perf needs no bundle — reach for it if make web was never run.

WLED#

DirectionSettingDoes
Out[wled].broadcastFixtures react to the music, with no microphone
In[wled].listenThe WLED app or Home Assistant drives c64cast
InA wled sceneLedFx, xLights or Jinx! streams pixels to the Commodore

Listening, the mapping is a pun on WLED's own vocabulary: power is pause, brightness is a real screen dim, the playlist is the effect list, color forces a palette, and speed and intensity are the scene's live parameters.

Several Commodores#

The control plane, the MIDI listener and the WLED device are process-wide: one of each for the whole wall.

SurfaceAddresses a system by
MIDIChannel N is system N in ensemble order; broadcast_channel (16) is all
WLEDA segment, in ensemble order
ConsoleA tab per system

At most one system may sound at a time, and a system that cannot claim the audio slot skips to its next quiet scene.

Before the Show#

CommandDoes
c64cast --list-devicesCameras and audio inputs, with identifiers
c64cast --midi-setupLearn a controller, write a reusable profile
c64cast --save-settingsPersist this machine's URL, devices, SID model
c64cast --doctor --skip-probeCheck the environment and the config, offline