Swiss Motion Graphics — our demo

One example among many. Don't reuse its story, arc, shots, props or timings.

Demo: Five Rules for a Poster (44 s) · swiss-motion.mp4 · source in demo/

A 30–60 second film: five rules build one concert poster on a grid; a red circle breaks the grid, and the poster turns out to be the score of the music. The demo sets Archivo as its one family.

Story & structure

Pure 2D graphic design animated on a grid: flat white paper, black type and bars, a very light grey and one saturated red. It is the language of 1950s–70s Zurich concert posters (Müller-Brockmann, Hofmann, Gerstner, Crouwel) turned into motion the way modern identity systems move (Experimental Jetset, Pentagram): every element snaps to the grid, every move lands on a beat, nothing bounces.

The charm is rigor with one exception. The whole frame obeys a system, so the one element that doesn't obey it becomes a character.

Never copy a specific historical poster's composition (no concentric-circle or fan compositions lifted from Müller-Brockmann). Don't use Helvetica or Akzidenz font files. Pick an OFL neo-grotesque (Archivo, Inter, Schibsted Grotesk, Instrument Sans…). Never name a real institution on a poster.

Pick stories where the system itself tells the story. The demo used all five native powers, the strongest (the grid means something) at the peak:

Native power Story use
The modular grid The grid is the stage and the rulebook. Show it being built (lines draw on the beat), show it briefly in section gaps, and at the peak make the grid mean something: in the demo, 7 columns = the 7 notes of A dorian and 16 rows = 16 eighth notes, so the poster is the score.
Snap = beat Every element's arrival is a percussion hit: type clack, knife, ruling pen. Picture and music share one coordinate system, not a sync pass after the fact.
Rules generate design (programme) The plot is a set of rules applied one by one to one artifact. End by showing the same programme generating many artifacts (the Gerstner reveal).
Extreme scale contrast A 700 px numeral next to 19 px technical notes. The giant element is the chapter card, the tiny one is texture.
One signal colour Only one thing is red, so red = the protagonist. When it breaks a rule it is the only thing on screen that is not exact.

Adapting any topic: turn it into a system plus one exception. A product launch: the product's spec sheet assembles on a grid, then one feature breaks out of it. A company's history: each decade is a rule added to one poster. A love story: two red elements on two different grids, and the film ends when one of them leaves its grid.

Emotional arc (30–60s): order being built (curious, crisp) → order complete (correct and a bit dull, say it) → hesitation (the red element twitches and snaps back) → the break (the only non-snapped, linear move in the film; drums drop out) → everything else re-flows around it, better (full band back) → the reveal (the grid means something) → scale reveal (same system, many outputs) → back to the hero artifact on the end card.

Shots

The "camera" is a 2D matrix (centre, scale, rotation). It moves only with the precise ease and only on beats.

Beat Camera
Opening Locked full frame. One gesture: a red line strikes across and the grid columns grow out of it on sixteenths
Building (rules) Locked spread, so the viewer reads cause (rule, left) → effect (artifact, right)
The break Left page slides out, artifact moves to centre-left, grid lines extend across the whole frame (the grid is bigger than the page)
Reveal Rotate the artifact 90° in 1.5 beats and stop. Only then do labels (note names, bar numbers) wipe in, then the playhead sweeps two bars. Each bar turns red on the exact frame of its onset: put onsets on whole frames (multiples of 0.25 s at 24 fps)
Scale reveal Rotate back while pulling out to a wall of artifacts from the same system
Ending The red line strikes again and cuts the other artifacts away. Push back to the opening spread, end card on the left page, hero artifact on the right

Score structure

Drop the drums for the one bar of the break, return on the landing. Before the reveal add one bar of near-silence (bass pedal + quarter-note tick). During the reveal keep only kick + bass + melody so every note is audible. - The melody comes from the same JSON as the picture (score.json: column → pitch, row → onset, length → duration). "The poster is the score" is true in code, not faked. - Foley follows materials, dry and close, no reverb: - letterpress clack (metal transient + 3.3 / 5.1 kHz resonances + wooden tray); - ruling pen "tss"; - guillotine (band-pass sweep + metal snick); - paper slap / slide; - numeral "thunk" per step; - block snap; - circle landing (58 Hz felt thump).

The rule-breaker is the only element that sings: a sine glide that follows its position. - Voice: cool, crisp female narrator, Kokoro af_sarah at speed 1.0. It has ~7× the 3–8 kHz consonant energy of af_kore. Keep lines rule-like: "Rule one. Build a grid." Check every line with whisper (write numbers as "asr": "Rule 1, …"). - Mix: voice compressed, music ducked ~−10 dB under voice (voice ≥ 6 dB above music), −14 LUFS.

Palette & props

Titles, subtitles & end card

Pitfalls

Build notes

styles/swiss-motion/demo/
  score.json  grid = score: stiff / final melody, bass, circle, bleeds, timeline
  ease.js     cubic-bezier(.7,0,.2,1), snap(t, t_arrive, dur), steps(), track()
  film.js     layout system, rules, poster, circle, reveal, wall, end card, foley events
  main.js     loads fonts, score, lines, whisper word times; ?nosub=1, ?poster=1
  lines.json  voice script (af_sarah)          tools/words.py  word timings → subtitle reveal
  music/score.py  motorik score from score.json   mix.py  foley + ducked voice + music
  tools/subs.py   subtitle intervals (asserted) → srt     build.sh  one-shot rebuild
  1. Design the layout system first: frame grid, artifact grid, what columns and rows mean. Write score.json.
  2. node core/render/still.mjs styles/swiss-motion/demo --range 0.5:43.5:1 --out … then sheet.py. Review a 1 s overview plus dense 0.25 s strips around the break and each transition.
  3. tts.py → asr_check.py (0 mismatches) → tools/words.py.
  4. music/score.py (onsets from score.json; check sweep onsets ≤ 5 ms) → events.mjs → mix.py (prints voice/music/foley dB per line).
  5. video.mjs --workers 3 (1056 frames in ~12 s) → mux.sh … 24 0. Or simply sh styles/swiss-motion/demo/build.sh (~55 s from zero).