These tools evolved from a few simple requirements for a small hobby band project. The tools have continually evolved into a fairly complex tech stack. This document chronicles the changes and thought process's that have lead to current system.
- A live music performance with interactive video game/music
- Requirement to trigger a video in sync with our live music (A holographic singer)
- Spacebar at the same time on two computers
- Cuebase
- vlc
- Ayacon July 2013
- BarCamp Canterbury June 2014
- Don't trigger things by human interaction. Trigger them automatically.
- Could we trigger/drive stage lights in time to our music without a lighting engineer?
If we could setup a virtual midi port that then trigger
's a message to be sent over a network to display
a video on another machine that is listening.
- displayTrigger
- Commandline pygame MIDI
trigger
listened to a midi port and send a json message- Test javascript web trigger used for manual control
display
was a HTML5/javascript webapp
- Commandline pygame MIDI
- lightingAutomation v0.1
- Send UDP Artnet3 DMX packets
- Lights described in
yaml
- Lights visualized by pygame DMXSimulator abstract representation that rendered DMX packets
display
played an audio file with seek bar to send absolute time tolightingAutomation
across websocket bridge
- Real-time control of lights with physical MIDI-Mixer controller with HTML5/js app
- pentatonicHero HTML5/js visuals and real-time control of lights
- Gulbenkian September 2015
- We could trigger videos, images, sliding text animations, iframes (for other interactive content)
- Basic DMX lights
pentatonicHero
realtime lights
- pygame MIDI
trigger
was a pain to constantly deploy to the music (Cuebase) machine (as it had no internet connection) - Single message bus for all
displays
. All messages went to every connected device. - If connections dropped we had to have access to computers/terminals to fix it
- Deprecate pygame MIDI
trigger
-> javascript webtrigger
through Chrome MIDI multisocketClient
self-healing network connections for websocket and tcpmultisocketServer
- SubscriptionServer- Network bus routing to route messages to specific/multiple listeners/displays
- Floor prompt subtitle
display
- RaspberyPi 2 with WiFi + Floor Screen
- Minami March 2016
- Amecon July 2016
- Ultra short throw projector mounted on lighting rig
lightingAutomation
scripting extremely limited- Could only tween entire lighting rig state to another state
- Overly complex nested anonymous function complexity every frame (too complex to test/debug properly)
lightingAutomation
:DMXSimulator
visualization was insufficient- Visualizing what was on the
display
and what pygame lights were doing was an exercise in abstract thinking - Clunky, fragile and unusable by anyone other than a linux wizard
- Visualizing what was on the
- Needed each
display
to have a separate browser instance.- Could we have multiple displays in a single instance of a browser?
- Cubase/music machine had lots of MIDI triggers that took a long time to setup.
- Some tracks had 10 + triggers. Total we had 60+ triggers
- Constant Cuebase manual maintenance was not committable to repo
- stageOrchestration - rename of
lightingAutomation
- Lighting is scripted in
python
and compiled down to binary frames on disk- Live reload/render on change
- Media triggers (eventline)
- media trigger in same script as lighting
- Separate realtime-renderer process takes binary frames off disk + send over network
- Testable segmented architecture
- ObjectRelationalMapper for lights
- Generic
python
timeline.py - Powerful programmatic animation framework- Inspired by other animation frameworks
- Overload mathematical operators
+
&
*
/
(split
in progress)
- Lighting is scripted in
- displayTrigger
- rewritten in
es6
,webpack
- Multiple displays in one browser instance
display
be bound to arbitrarydiv
s
- Greensock Animation Project engine for animations
- Allows timeline seek to set animation state
- Pixi.js Particle Engine
- Realtime, Rain, Fire, Firework effects
- Can control state with GSAP to allow rain to intensify
- Realtime, Rain, Fire, Firework effects
- rewritten in
- stageViewer - (two
es6
components)- 3D Stage representation
- three.js css3d component
- 3D stage, lights, screens
- Uses
display
library bound to screens/divs in 3D scene
- Uses
- timeline
react
component- Visual representation of lights
- 3D Stage representation
- superLimitBreakSetup
- Containerized/Segmented architecture
- Published DockerHub containers
- Sub component repos
- multisocketServer subscription/routing server + self healing clients for
python
/js
- mediatimelineRenderer WIP video thumbnails for timeline
- mediaInfoService REST API for metadata of media
- calaldees/libs
- multisocketServer subscription/routing server + self healing clients for
- Containerized/Segmented architecture
displayTrigger
used at Hibannacon 2018- Tech preview demoed in BarCamp 2019 June
- Hibanacon 2019 November
- Syncing with the cuebase music machine is still fiddly
- Individual triggers are difficult to time
- We could not trigger accurately with a 2 bar count-in as we have overlapping tracks where the clicktrack was just an audio sample
- The assumption of 2 bar countin was now invalid and defeated the purpose of automatic precaching of videos
- Individual triggers are difficult to time
- Difference in production
single_triggers
to developmentcontinuous_triggers
(for visualizer) - No ability to seek in cuebase project to visualize timing
- Calibrating sync offsets for visulisations is fiddley, complex and time consuming
- No live control of lights
- We did not implement that feature from
lightingAutomation
- We did not implement that feature from
multisocetServer
was saturated with messagegs at 30fps with text floating point number number in plain text json- each frame was hundreds of kb
multisocetServer
was unreliable and messages would get lost- The json message system manually joined multiple messages/packets strings and scanned for
}}
to denote end of messages. It was a mess.
- The json message system manually joined multiple messages/packets strings and scanned for
- The cuebase machine broadcasts timecode state continuously
- SMTPE (protocol designed to sync with analog gear)
- We can seek in cuebase project
timecode_to_track_router
translates timecode to a track position *- Move to
msgpack
for messaging - Move to a stable profetional message bus
- unknown