Shadow Frames

Sole audio designer: sound design, voice recording and editing, implementation and the mix, in Wwise and Unreal Engine 5.

Watch with sound Trailer on YouTube

A black-and-white horror game set in one abandoned pub. The player finds changes by ear and photographs them with a Polaroid camera.

2025, four months. A multi-school team: game developers from Howest DAE, plus a writer from RITCS and a composer from the Royal Conservatory of Ghent who were both finishing their master’s. Over 200 Wwise events in the finished game. Tools: Wwise, Unreal Engine 5, C++, REAPER.

The ambience follows the board

Every confirmed photograph goes on the board and moves the pub’s ambience one stage further. The first adds weird noises to the base layer and the third a ghostly screech. The fourth swaps both for a horror drone, and from the eighth only the horror background ambience is left.

In Wwise the board is a switch group on RTPC_Photos_OnBoard, with a stage for every count from 0 to 10. In SC_AMB_Progressive, a layer that two stages share keeps playing through the switch instead of restarting.

The ProgressiveAmbience switch group in Wwise, stepping from the initial state to StageTen as RTPC_Photos_OnBoard goes from 0 to 10
The ProgressiveAmbience switch group: one stage per photograph on RTPC_Photos_OnBoard.
The SC_AMB_Progressive switch container in Wwise, with the ambience layers assigned to each stage
The layers of each stage in the SC_AMB_Progressive switch container.
3 / 10
ProgressiveAmbience
StageThree
Layers in this stage
BC_AMB_BaseLayer BC_AMB_Stage2_WeirdNoises AMB_Stage3_GhostlyScreech

Anomaly sounds and Keiran’s voice lines

The view through the Polaroid camera: a rounded viewfinder over a candlelit booth, with the shot counter in the corner

With no on-screen markers, each anomaly reaches the player in four sounds.

  1. Alert

    A short alert with no direction signals that an object in the pub has changed.

  2. Object

    The changed object plays its own spatial sound, and the player follows it through the pub.

  3. Camera

    Raising the camera lowers the pub ambience and brings breathing and hand movement forward, in a mix state of its own.

  4. Whisper

    A reversed whisper confirms the shot.

DA_Anomaly_Global holds the shared anomaly events and gives every anomaly Blueprint its own AnomalyType switch value. The Data Asset

The KeiranVoicelinesSwitch container in Wwise: one voice line with its waveform under each StoryAnomaly value
KeiranVoicelinesSwitch in Wwise.

I recorded some of the game’s voices myself. The lines of Keiran, the player character, are AI-generated; I edited and implemented them. His lines for the story anomalies play from one switch container on the StoryAnomaly switch group. Four reminder lines, such as IshouldPickup, work the same way on a switch group of their own.

An Unreal Data Table , DT_Dialogue, lists the duration of each line.

Footsteps and the enemy

I exposed the floor and enemy settings as Unreal Data Assets that designers could tune without changing code.

The BP_FootstepAudioManager event graph in Unreal: the On Footstep event, a switch on the surface name, one Set Switch per surface and a Post Event

The player’s footsteps change with the floor: tiles, wood, concrete, creaky wood and creaky wooden stairs. BP_FootstepAudioManager listens to the On Footstep event, sets the FootstepSurface switch for the surface each step reports, then posts Play_PLYR_Footstep. The enemy’s footsteps cover the same five surfaces from a Data Asset of their own .

The DA_Enemy_Presence Data Asset in Unreal: Play_ENMY_Proximity and Stop_ENMY_Proximity, RTPC_Enemy_Proximity, Play_PLYR_NewBreath on RTPC_Player_Stress_Level, and hysteresis thresholds of 5.0 and 2.0

DA_Enemy_Presence runs dread layers on RTPC_Enemy_Proximity (max distance 700, min 100) and a breathing loop on the player’s stress level. The layers start at one threshold (5.0) and stop at a lower one (2.0), so they hold steady while the enemy hovers near the edge.