← Research

Research notes · The tools behind the game

Real recordings, free to use: Freesound

Before the audio pass, Second Chance had three radio stations, sixty lines of speech and no sound effects at all. No footsteps, no traffic, no birds. A large part of what you hear in Oakhaven now started as a field recording somebody else made and shared on Freesound.

Freesound is a collaborative library of sounds, uploaded by the people who recorded them, each under a Creative Commons licence the uploader chooses. This page is how we use it: which licences we accept, how a long field recording becomes a sound the game can play, and the mistakes that would have cost us at release.

Six open-framed racing buggies in a diagonal row on a grey test floor, each a tubular roll cage over four chunky off-road tyres, with a mesh window net, a helmeted driver inside and a roof board reading RD and a number.
Six of the eight autograss buggies. Their engine sounds were cut from ten Freesound recordings, with the licence checked file by file.

Where these facts come from

The rules on this page are the project's own, written into its audio notes as we went. A recording's licence belongs to the person who uploaded it; read it on the sound's own Freesound page, and the CC0 and CC BY 4.0 deeds, before you use it. We are game developers, not lawyers.

The one rule: CC0 and CC BY only

Every sound on Freesound carries a licence, and we accept two. CC0 means the recordist has waived their rights, so the sound can be used without a credit. CC BY allows commercial use as long as the recordist is credited. Anything marked NonCommercial is banned outright, because it would block the game's commercial release.

That rule has teeth. The top results for a dog bark were all NonCommercial, so when the German Shepherd on Liz's walk was first built, its bark had no sound. Every linnet recording we found was NonCommercial, and there was no CC0 or CC BY stock dove at all, so those two birds were generated with ElevenLabs instead. The best diesel engine packs were NonCommercial too. The search tool we use cannot filter by licence, so the check happens file by file.

The same reasoning ruled out the BBC Sound Effects archive, which James suggested for British street sounds. Its licence covers personal, educational and research use, not a commercial game.

From a search result to a sound in the game

  1. A manifest. One JSON file lists every sound we use: its Freesound ID, the name it will have in the game, what kind of sound it is (a loop, a one-shot, a run of footsteps) and whether it should be mono or stereo. It is the single source of truth.
  2. A fetch script. It downloads each sound and checks the licence again from Freesound's API, so a licence is never copied across by hand. Downloading the original upload needs a logged-in OAuth2 token, and a plain API key only covers searching and reading details, so we use the high-quality previews. Because the manifest is keyed by ID, swapping in the originals later is one command.
  3. A conditioning script, which is where most of the work is (next section).
  4. An import script, run inside Unreal Engine 5.8, which makes the sound assets and the mix they play through: sound classes, attenuation, and the dip in background sound while someone is talking.
  5. A credits file, generated from the manifest and never written by hand.

Turning a field recording into a game sound

Eight spectrograms in two columns, amber on dark grey, one per bird call: house sparrow, chaffinch, goldfinch, greenfinch, bullfinch, coal tit, yellowhammer and collared dove. Each shows its call as bright marks, with a dashed blue line near the bottom marking the filter.
Eight hedgerow birds as the game plays them, drawn as spectrograms. The dashed blue line is the filter that removes the traffic. Recordings from Freesound by BeeProductive (CC0), TheKingOfGeeks360 (CC0), Sacha.Julien (CC0), BeeProductive (CC0), ERH (CC-BY), Walking.With.Microphones (CC0), reinsamba (CC-BY), reinsamba (CC-BY), klankbeeld (CC-BY).

Cut out the event. A Freesound "one-shot" is often a long field recording. Our first car pass-by was fifty seconds of traffic. The conditioner finds the single loudest event and cuts it out.

Make it loop, then check the join. Field recordings never loop. To make a background bed, the conditioner crossfades the tail over the head and then checks the seam: the jump at the join has to be under sixty times the median sample-to-sample jump, or the loop is rejected.

Level it. Levels vary wildly between recordists; the Nottingham city bed peaked at -26 dBFS. Background beds are matched to -26 dBFS RMS, and one-shots are peak-normalised to -3 dBFS.

Mono for anything in the world. A stereo file bypasses Unreal's attenuation panning entirely, so it never moves as you turn your head. Only wide background beds stay stereo.

Split the footsteps. A sixty-second recording of someone walking is cut at each footfall into twelve separate steps, so the game can vary every step instead of firing one clip over and over. Carpet has its own set, from two CC0 recordings.

Read birds by eye. For the hedgerow birds we draw every recording as a spectrogram, cut where the bird is alone and close, and filter the traffic out just below the bird's own pitch. The birds research page explains the method in full.

Measure it, then check the measurement

Engines. A dyno recording is a sweep, so most of it cannot loop. For an old, clapped-out sports car we scored every window of every candidate on pitch spread, level drift and loop seam, and kept only the flat ones. Its five engine layers are crossfaded by revs, and two of them are cut from the same recording a second and a half apart, because layers from two different engines beat against each other.

For the autograss buggies, ten recordings (a Hayabusa under load, a Chevrolet V8, a V6 coasting down) were followed along one harmonic, each slice time-stretched to a steady pitch, and cut into loops that repeat without a click, one for each band of revs.

The measuring tool can be wrong too. Cutting thirteen layers for the bin lorry out of recordings up to 984 seconds long, the first scoring method gave every window 0.999 and still printed CHOSEN: the feature it measured came out the same everywhere in those files. Crest factor, the ratio of peak to average level, was the measure that worked. Dense, continuous sound sits at about 6 to 14 dB; a single knock in a quiet room is above 18. A test that cannot fail is not a test, so the spread of scores is printed now, not only the winner.

Credits are generated, never typed

Every CC BY sound needs its credit to ship with the game, so the credits file is generated from the manifest. Once, a run that fetched only one batch of sounds rebuilt the credits from just that batch and silently wiped two CC BY attributions from earlier work. It was caught when we read the file back. The credits are now always rebuilt from the whole manifest, and the lesson goes wider than audio: a generated compliance file must come from the full source, never a subset.

We also turn down sounds to avoid a credit we do not need. A CC BY set of a croupier calling roulette numbers was rejected. Toby, the dealer at Last Tenner Bets, speaks all 37 numbers in his own voice, and a Freesound caller beside him would have been two different people dealing one table. Every other sound on the roulette wheel is CC0.

Where you will hear it

Four renders of a dark brindle Staffordshire Bull Terrier on a plain grey floor: standing three-quarter on, side on with his tail out, a close view of his head and white bib, and a face-on close-up with brown eyes, rose ears and his mouth open.
Tyson the Staffie. Every bark, growl and whine he makes comes from one real dog's recordings on Freesound.

What we have not solved yet

Further reading

In the devlog

Official sites

Watch the town come together

Second Chance is a British open-world life sim, built by one developer in Unreal Engine 5.8. The demo goes to the list first, before it goes anywhere else.

Join the list