For the first two EMF Camps I attended, I gave talks on interesting and exciting pieces of work that I’ve been involved in: Automated Science at Sea - The Mayflower Autonomous Ship (2022) and The Tech behind the Tennis (2024), however for 2026 I wanted to do something different from a talk - I wanted to make something.

Installations of all kinds dot the landscape of Eastnor Castle Deer park every two years for a weekend, ranging from noisy, bright, colourful, bizarre, fast, fun and sometimes on fire. They’re always interesting to look at / play with or just experience and you can tell that those who built them did it for the love of the craft and the festival. I really wanted to be a part of that this year, and so when the official theme was announced: Space, I started thinking about what I could build that might work with that theme.

The Idea

Coincidentally, when the theme was announced and the RFP opened, I had been watching a lot of SciFi. Project Hail Mary had just been released, having seen that and heard a familiar riff I then went home and watched Close Encounters of the Third Kind, Contact and a few other films that all shared an important plot point: How do you talk to an alien with no common basis in language? This got me thinking and soon enough I had the following list scribbled down:

  • Space
  • Communication
  • LEDs
  • Sound
  • Game?

I spent a while thinking of all kinds of complex games where you could slowly unpick a way to talk to an alien using light and sound as well as possible maths of music theory concepts that could be used or referenced. Eventually I stumbled across the Chromatic Scale and used that as an initial seed for the design. I went with a dodecahedron as the main form for the alien, with each face lighting up along with tones being played through a software synthesizer.

The first sketch I did of the orb

Initially 12 faces felt like the perfect number, however I quickly realised that this would introduce a number of challenges and complexity for the game.

Firstly, because the plan was for the dodecahedron to be interacted with from a single direction, there was little reason to fill in all 12 faces with LED panels as nobody would ever see them. It would also increase the cost, build time and overall structure significantly, so leaving six faces empty would make a big difference.

Secondly, having 12 faces and 12 notes as part of the game would make it quite complex for players who weren’t familiar with playing the piano or keyboard. It would require utilising all white and black keys, requiring good knowledge of the tones and keyboard layout as well as creating potentially very complex patterns to replicate. Given that I was expecting this to be the kind of game that it takes only a few minutes maximum to play and that it should be accessible to players of all backgrounds and ages, 12 faces & tones would be too much.

By reducing the number of “active” faces to 6, I also decided to reserve the middle most forward facing panel as a status indicator / heartbeat for the alien, this would mean that I could give very obvious win / fail signals to the player as well as some extra ambiance when in its idle state by pulsing slowly.

That left me with 5 faces and 5 notes to use. The black keys would make it harder to use with lower dexterity, so I went with the first 5 white keys: C, D, E, F and G. Easy to press on the keyboard even with one finger and sounded nice together.

The Build

The orb was going to be the most complex part to build, thankfully the maker community provides. I found this perfect STL design available on Etsy. Combined with 30 lengths of 2020 T-Slot aluminium, I’d have a perfect dodecahedron with all the mounting points needed.

Each panel is built from a foamboard back and edges with two layers of photography diffuser over the top. I used some cardboard strips punched with holes to keep the edges of the diffuser plastic tidy and attached to the T-Slot. The LEDs (WS2815Bs - The 12v variety) are evenly spread across the back and round the edge facing inwards. Because this was only destined to be a short term installation, I used a combination of Gaff Tape, hot glue and hopes and dreams to keep the Foamboard shells in place, as well as lots of spacers and braces between each of the shells to build as close to a rigid structure as possible. This worked really well and survived the journey in the car, 3 days in the Null Sector and the drive back without any issue.

To control the LEDs, I wanted to ensure I had really low latency control, but with relative simplicity so opted to use the Adafruit Feather RP2040 Scorpio as it provides 8 PIO channels with level shifters, runs Circuitpython and is pretty easy to get up and running. A 240v to 12v DC power supply with enough wattage to power all 6 strings at once completes the lighting.

Everything else was off the shelf parts saved from e-waste or in my box-o-bits:

  • Raspberry Pi 4 - Running the core conductor code and coordinating the whole game
  • Akai Professional LPK25 - USB Midi Keyboard as the game input
  • LED Display - To show the untranslated messages to players and watchers
  • MFD all in one display - To show more context and hints to the player as well as a bit of worldbuilding
  • Netgear Switch - To connect the Pi and MFD as well as my development laptop
  • An old Tv sound bar and Bass speaker
  • Yeti Blue Microphone - What I really needed was just a USB DAC, but alas could only find this in the box - did the trick though!

Wired together, the whole installation looks like this:

flowchart TD


    subgraph inputs [Player input]
        midi["Akai LPK25<br/>USB MIDI keyboard"]
    end

    subgraph brain [The brain]
        pi["Raspberry Pi 4"]
        switch["Ethernet switch"]
    end


        scorpio["Adafruit Feather RP2040 SCORPIO"]
        panels["6 × LED panel<br/>90 × WS2815B each"]
        sign["PolyComp LED banner"]
        mfd["MFD kiosk<br/>(pygame)"]
        dac["Yeti (as USB DAC)"]
        spk["Soundbar + sub"]
   


    midi -->|USB| pi
    pi -->|USB-CDC serial| scorpio
    scorpio -->|8 data lanes| panels
    pi -->|RS232 over USB| sign
    pi --- switch
    switch --- mfd
    pi -->|USB audio| dac
    dac --> spk

The Software

The code to run this is split into 4 parts:

  • The Conductor: Runs the core gameplay loop and instructs all other components
  • Scorpio 2040 firmware: Listens to commands from conductor over USB serial port to control the LED strips
  • Supercollider engine exposing Open Sound Control interface to conductor
  • MFD display app using pygame to show sci-fi visuals and game hints to player
flowchart TB
    midi["MIDI keyboard"]
    mfd["MFD app<br/>pygame kiosk"]
    scorpio["SCORPIO firmware<br/>CircuitPython"]
    sign["PolyComp banner"]
    spk["Speakers"]

    subgraph pi ["Raspberry Pi 4"]
        subgraph conductor ["conductor (one asyncio process)"]
            midi_in["midi_in"]
            state["state<br/>Simon game machine"]
            led_out["led_out"]
            banner_out["banner_out"]
            synth_out["synth_out"]
            mqtt_io["mqtt_io"]
        end
        sc["sclang → scsynth<br/>synth/orb.scd"]
        broker[("mosquitto")]
    end

    midi -->|USB MIDI| midi_in
    midi_in --> state
    state --> led_out
    state --> banner_out
    state --> synth_out
    state <--> mqtt_io

    led_out -->|serial frames| scorpio
    banner_out -->|GTXC protocol| sign
    synth_out <-->|OSC 57120 / 57121| sc
    sc --> spk
    mqtt_io <--> broker
    broker <-->|MQTT| mfd

The game uses MQTT to connect the conductor to the application running on the Multifunction Display as it’s quick and easy to implement as well as being trivial to tap in on and observe during development and testing. I had grander ideas about adding an “admin” or control app of some kind as well that would be able to make adjustments to the game live, but I never ended up implementing it.

Conductor

The hardest part of this was building the conductor; It needed to manage the game state as well as coordinate the inputs and outputs to all of the other components. Finally it needed to do all of that but with very tight timing constraints. I wanted the LEDs to react as close as possible to the sounds emitted by the synth.

So in order to achieve this, I used SuperCollider as the authority on timing. The conductor requests a sequence to be played and then listens to messages coming back in the OSC (Open Sound Control) messages, then triggering the lights to change

LLM Alert

As a software engineer by trade, I believe it’s important to be upfront when using LLM based software development tooling.

In this project, I could never have achieved the tight timing and state management in the time that I did without some help. In this case, I used Claude Code to solve some of the meatier coding challenges, freeing me up to work more on the physical design and build as well as the overall game design. It also came in very handy when making some last minute changes in the field (literally).

sequenceDiagram
    participant P as Player
    participant C as conductor
    participant SC as SuperCollider
    participant L as LEDs

    C->>SC: /game/play_sequence (notes)
    loop each note
        SC-->>C: /sc/note_played
        C->>L: flash panel
        SC->>SC: sound the note
    end
    SC-->>C: /sc/sequence_done
    Note over P,C: player's turn
    P->>C: MIDI note on
    C->>SC: /note/on
    C->>L: flash panel
    alt correct
        C->>L: middle light green
        C->>SC: /game/result 1
    else wrong
        C->>L: middle light red
        C->>SC: /game/result 0
        Note over C: lose a chance, replay the same pattern
    end

The MFD

The MFD is an aircraft-style Multifunction Display, a screen with a ring of unlabelled buttons around the edge, I saved it from E-Waste because it reminded me of the kinds of displays used in the Orion Spacecraft or in films like Project Hail Mary so thought it would fit well. It runs a relatively simple pygame app that subscribes to MQTT and draws what the conductor tells it.

At the top is the pattern so far, as a row of coloured dots, so you can check what you just watched. Below that was a drawing of the 25 key keyboard layout with the keys coloured to match the pattern so that it’s easy to work out which key to press. The untranslated and then translated messages are also shown here (this was a late addition for players who were looking down at the screen and keyboard, so missing what was on the LED display).

Finally, I added some extra decoration: Made up space-y labels around the edge and a wireframe render of the dodecahedron.

Talking in code

By the time I arrived at EMF, the orb was built and I had all of the parts but the game was still coming together. Fortunately, two good friends were joining me at the festival and so jumped in to help get everything installed and finish off the game. We were hacking on the game design and code whilst putting everything together in the boiling heat (thank you Rob and Josie !)

At its core, this is a game of Simon. The orb lights its faces and plays notes in order and the user repeats them as the pattern grows longer. As a game goes, this is fine, but it doesn’t quite cut the mustard for the concept of establishing contact with an alien.

So in order to make this more of a conversation, we added the concept of messages that would be translated as the player progressed through a sequence. For each of the three levels (sequences), a garbled message would be displayed on the LED display above the dodecahedron as well as on the MFD. For each successfully replayed note in the sequence, a proportional number of letters in the message would be translated to their English counterparts. By the end of each level, a message would be translated for the player

The message for the first and last levels were hardcoded, but we wrote a pool of about 20 different messages that could be randomly chosen for the second level for a bit of fun.

Friend Alert

No LLMs here, this idea and the pseudocode was all down to Josie who managed to come up with it in the boiling heat whilst the three of us were putting everything together.

Putting it all together

I was excited to be told that there was a 10ft shipping container available in the Null Sector for the installation, so planned around that space in the runup to the event. Once we arrived and unloaded, my two good friends and I set about building the installation out and decorating the space to fit in with the general aesthetic as best as we could.

The theme for EMF Camp 2026 was space and the Null Sector this year was Polybius Biotech GTN East-Nor Spaceport 4242, a newly liberated spaceport taken from Polybius by the Rebels and transformed into a haven for Art, Non-mandated entertainment, trade and a good rave or two. We took this lore dump and fashioned some signs together and piled up some old boxes and junk in the corner.

Somehow, we were ready by about 17:00 on Friday, with the Null Sector opening its boarding ramp at about 19:00. The first few people walked up, curiously tapped one of the keyboard keys and then started playing. Originally we were prepared to have at least one of us standing nearby in case the game broke or if people were finding it too confusing, but I’m very happy to say that within about 30 minutes of us quietly observing from the shadows, we felt like we could step back and let people play, leaving us to be able to also have a great night enjoying the rest of Null sector and the wider reaches of EMF Camp at night! (Venjent was very good)

Here’s an end to end playthrough to show all three levels.

So how did it do?

I’d left logging enabled on the conductor code, so we could pull out stats to see how many times games were started, failed, completed and when. From Friday to Sunday, there were 892 games played, 378 of which played all three levels and won. Game sessions lasted just shy of 1 minute 30 seconds. Whilst I’d not thought very much about how long a session should last, I think this is about the perfect time for folks who are wandering around. In total 7,461 rounds were completed and only 1,725 rounds were failed.

How the 892 sessions ended

Saturday was busiest with 474 sessions, and most tended to happen in the evening which is when the majority of folks gravitate towards the Null Sector. A lot of people stay up late at EMF, so there was definitely a chance that someone might want to play it in the early hours of the morning, and indeed a small group of folks apparently did: 63 people played between midnight and 1am!

When people played: sessions by hour of day, across the weekend

The clearest pattern in the whole weekend is the U-shape below: players either bounced off almost immediately or saw it through to the end, with very little in between. 377 sessions ended at Level 1 and 418 made it all the way to Level 3, but only 97 stopped at Level 2. That initial hook getting someone from a curious first tap to actually wanting to finish is clearly the hard part, and I’ve got a lot of respect for those who design games for a living!

How far players got: sessions grouped by the furthest level they reached

Would I do it again?

Absolutely. Being able to build something for EMF Camp and then seeing so many people playing with it is a pretty indescribable feeling. What made this year even better though was being able to put it all together and improve it with the help of my friends. After the drive home, shower and a week to reflect, I’ve already got ideas bubbling up, hough next time I’d like to build it as a team from the start. As with many things in life, it’s more fun with friends!

A massive thanks to Rob and Josie - couldn’t have done it without you.

Another big thanks to the EMF Camp Arts and Null Sector teams - it’s truely impressive what you pulled off and made us all feel so welcome.

The installation at night with ‘The End’ on the display.