sfxit examples

8 game sounds, each a small graph of nodes rendered by sfxit: a coin, footsteps, a sword hit, a rain loop, a lute phrase, a whoosh, a UI click and a drum loop. Under each sound is its picture (a waveform over a spectrogram: time runs right, frequency runs up), which is how an agent that cannot hear checks what it made.

These sounds were built and checked by measurement and by their pictures alone; nobody had listened to them when this page was published. Headphones help with the stereo ones.

Coin

picking up a coin: two bright rings, the second a beat later

Waveform and spectrogram of Coin

0.46 s · mono · peak -1.0 dBFS · -16.7 LUFS · brightness 5981 Hz · no findings · 5 nodes, rendered in 1.3 ms

Six variants (loudness spread 1.8 LU) Contact sheet of six variants of Coin
  • v0, as written
  • v1
  • v2
  • v3
  • v4
  • v5
The graph (coin.toml)
version = 1
sr = 48000
dur = 0.4
output = "out"
about = "picking up a coin: two bright rings, the second a beat later"
vary = { "ring.freq" = 0.04, "ring2.freq" = 0.04 }

[nodes.ring]
type = "gen.modal"
params = { material = "metal.coin", freq = 3300, t60 = 0.35, seed = 7 }

[nodes.ring2]
type = "gen.modal"
params = { material = "metal.coin", freq = 4400, t60 = 0.25, seed = 8 }

[nodes.later]
type = "seq.repeat"
note = "the second ring lands 60 ms after the first"
inputs = { in = "ring2" }
params = { at = 0.06, count = 1 }

[nodes.mix]
type = "mix.sum"
inputs = { a = "ring", b = "later" }
params = { gain_b = -4 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "mix" }
params = { mode = "peak", target = -1 }

Drum loop

two bars of a four-on-the-floor beat at 120 bpm: euclidean kick, snare and hats, folded into an exact loop

Waveform and spectrogram of Drum loop

4.00 s · mono · peak -1.0 dBFS · -18.7 LUFS · brightness 370 Hz · no findings · 14 nodes, rendered in 8.3 ms

The graph (drum-loop.toml)
version = 1
sr = 48000
dur = 4.0
output = "out"
about = "two bars of a four-on-the-floor beat at 120 bpm: euclidean kick, snare and hats, folded into an exact loop"

[nodes.kick]
type = "gen.thump"
params = { freq = 150, to = 48, decay = 0.12, click = 0.3, dur = 0.4, gain_db = -2 }

[nodes.kicks]
type = "seq.euclid"
inputs = { in = "kick" }
params = { steps = 16, pulses = 4, bpm = 120, bars = 2 }

[nodes.snare_env]
type = "env.adsr"
params = { attack = 0, decay = 0.05, sustain = 0, dur = 0.25 }

[nodes.snare_noise]
type = "gen.noise"
inputs = { amp = "snare_env" }
params = { color = "white", dur = 0.25, gain_db = -8, seed = 4 }

[nodes.snare_body]
type = "gen.thump"
params = { freq = 220, to = 180, decay = 0.04, dur = 0.25, gain_db = -10 }

[nodes.snare]
type = "mix.sum"
inputs = { a = "snare_noise", b = "snare_body" }

[nodes.snares]
type = "seq.euclid"
inputs = { in = "snare" }
params = { steps = 16, pulses = 2, rotate = 4, bpm = 120, bars = 2 }

[nodes.hat_env]
type = "env.adsr"
params = { attack = 0, decay = 0.015, sustain = 0, dur = 0.08 }

[nodes.hat_noise]
type = "gen.noise"
inputs = { amp = "hat_env" }
params = { color = "white", dur = 0.08, gain_db = -14, seed = 6 }

[nodes.hat]
type = "filter.eq"
inputs = { in = "hat_noise" }
params = { type = "highpass", freq = 7000, stages = 2 }

[nodes.hats]
type = "seq.euclid"
inputs = { in = "hat" }
params = { steps = 16, pulses = 8, rotate = 2, bpm = 120, bars = 2, swing = 0.12 }

[nodes.kit]
type = "mix.sum"
inputs = { a = "kicks", b = "snares", c = "hats" }
params = { gain_b = -2, gain_c = -4 }

[nodes.loop]
type = "fx.loop"
inputs = { in = "kit" }
params = { length = 4.0 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "loop" }
params = { mode = "peak", target = -1 }

Footsteps

four footsteps on a wooden floor: a heel thump, a board knock and a scuff, walked with a little irregularity

Waveform and spectrogram of Footsteps

2.82 s · stereo · peak -1.1 dBFS · -18.0 LUFS · brightness 155 Hz · no findings · 9 nodes, rendered in 53.2 ms

Six variants (loudness spread 1.9 LU) Contact sheet of six variants of Footsteps
  • v0, as written
  • v1
  • v2
  • v3
  • v4
  • v5
The graph (footsteps.toml)
version = 1
sr = 48000
dur = 2.4
output = "out"
about = "four footsteps on a wooden floor: a heel thump, a board knock and a scuff, walked with a little irregularity"
vary = { "board.freq" = 0.08, "heel.freq" = 0.06 }

[nodes.heel]
type = "gen.thump"
params = { freq = 140, to = 70, decay = 0.035, click = 0.4, dur = 0.25, gain_db = -4 }

[nodes.board]
type = "gen.modal"
params = { material = "wood.plank", freq = 210, t60 = 0.12, hardness = 2500, strike = 0.006, dur = 0.3, gain_db = -8, seed = 4 }

[nodes.scuff_env]
type = "env.adsr"
params = { attack = 0.01, decay = 0.04, sustain = 0, dur = 0.25 }

[nodes.scuff]
type = "gen.noise"
inputs = { amp = "scuff_env" }
params = { color = "pink", dur = 0.25, gain_db = -14, seed = 11 }

[nodes.scuff_band]
type = "filter.eq"
inputs = { in = "scuff" }
params = { type = "bandpass", freq = 1800, q = 0.9 }

[nodes.step]
type = "mix.sum"
inputs = { a = "heel", b = "board", c = "scuff_band" }

[nodes.walk]
type = "seq.repeat"
inputs = { in = "step" }
params = { count = 4, every = 0.52, jitter = 0.04, gain_jitter_db = 3, pitch_jitter = 0.6, seed = 21 }

[nodes.room]
type = "fx.reverb"
inputs = { in = "walk" }
params = { room = "room", wet = 0.15, seed = 3 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "room" }
params = { mode = "loudness", target = -18 }

Lute melody

a short lute phrase in D dorian, for a tavern

Waveform and spectrogram of Lute melody

7.72 s · stereo · peak -1.3 dBFS · -18.0 LUFS · brightness 1488 Hz · no findings · 3 nodes, rendered in 172.8 ms

The graph (lute-melody.toml)
version = 1
sr = 48000
dur = 1.0
output = "out"
about = "a short lute phrase in D dorian, for a tavern"

[nodes.tune]
type = "seq.notes"
params = { voice = "lute", tune = "d4:0.5 f4 a4 c5:1 b4:0.5 a4 g4 a4:2 r:0.5 (d4 a4 d5):2", bpm = 96, key = "d", mode = "dorian", humanize = 0.012, tail = 1.5, seed = 3 }

[nodes.room]
type = "fx.reverb"
inputs = { in = "tune" }
params = { room = "room", wet = 0.25, seed = 3 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "room" }
params = { mode = "loudness", target = -18 }

Rain loop

steady rain on leaves, a 4 second seamless loop: a pink hiss bed with scattered drops

Waveform and spectrogram of Rain loop

4.00 s · stereo · peak -4.3 dBFS · -24.0 LUFS · brightness 3170 Hz · no findings · 7 nodes, rendered in 24.5 ms

The graph (rain-loop.toml)
version = 1
sr = 48000
dur = 4.0
output = "out"
about = "steady rain on leaves, a 4 second seamless loop: a pink hiss bed with scattered drops"

[nodes.bed]
type = "gen.noise"
params = { color = "pink", gain_db = -30, seed = 2 }

[nodes.bed_hp]
type = "filter.eq"
note = "a thin hiss: rain is mostly highs"
inputs = { in = "bed" }
params = { type = "highpass", freq = 600 }

[nodes.drop]
type = "gen.modal"
note = "one drop: a tiny, damped wooden tick"
params = { material = "wood.block", freq = 2600, t60 = 0.02, hardness = 9000, strike = 0.0006, dur = 0.06, gain_db = -2, seed = 1 }

[nodes.drops]
type = "seq.scatter"
inputs = { in = "drop" }
params = { rate = 45, gain_jitter_db = 20, pitch_jitter = 7, pan_spread = 0.8, seed = 13 }

[nodes.mix]
type = "mix.sum"
inputs = { a = "bed_hp", b = "drops" }
params = { gain_b = 0 }

[nodes.loop]
type = "fx.loop"
note = "folds the tail of the drops onto the start, so the end meets the beginning"
inputs = { in = "mix" }
params = { length = 4.0 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "loop" }
params = { mode = "loudness", target = -24 }

Sword hit

a sword striking a shield: a hard metallic clang over a short noise crack

Waveform and spectrogram of Sword hit

1.80 s · stereo · peak -1.0 dBFS · -17.4 LUFS · brightness 2750 Hz · no findings · 9 nodes, rendered in 33.0 ms

Six variants (loudness spread 1.9 LU) Contact sheet of six variants of Sword hit
  • v0, as written
  • v1
  • v2
  • v3
  • v4
  • v5
The graph (sword-hit.toml)
version = 1
sr = 48000
dur = 1.2
output = "out"
about = "a sword striking a shield: a hard metallic clang over a short noise crack"
vary = { "blade.freq" = 0.05, "plate.freq" = 0.05 }

[nodes.blade]
type = "gen.modal"
params = { material = "metal.bar", freq = 820, t60 = 1.1, hardness = 12000, strike = 0.0008, detune = 0.006, seed = 5 }

[nodes.plate]
type = "gen.modal"
params = { material = "metal.plate", freq = 310, t60 = 0.5, hardness = 9000, strike = 0.0012, gain_db = -9, seed = 6 }

[nodes.crack_env]
type = "env.adsr"
params = { attack = 0.0015, decay = 0.012, sustain = 0, dur = 0.12 }

[nodes.crack]
type = "gen.noise"
inputs = { amp = "crack_env" }
params = { color = "white", dur = 0.12, gain_db = -6, seed = 9 }

[nodes.crack_hp]
type = "filter.eq"
inputs = { in = "crack" }
params = { type = "highpass", freq = 2500 }

[nodes.mix]
type = "mix.sum"
inputs = { a = "blade", b = "plate", c = "crack_hp" }

[nodes.grit]
type = "fx.drive"
inputs = { in = "mix" }
params = { amount = 2.2, mode = "warm" }

[nodes.hall]
type = "fx.reverb"
inputs = { in = "grit" }
params = { room = "hall", wet = 0.2, tail = 0.6, seed = 3 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "hall" }
params = { mode = "peak", target = -1 }

UI click

a soft UI button click: a short sine blip with a woody tick on top

Waveform and spectrogram of UI click

0.12 s · mono · peak -3.0 dBFS · -17.6 LUFS · brightness 1086 Hz · no findings · 5 nodes, rendered in 0.7 ms

Six variants (loudness spread 0.7 LU) Contact sheet of six variants of UI click
  • v0, as written
  • v1
  • v2
  • v3
  • v4
  • v5
The graph (ui-click.toml)
version = 1
sr = 48000
dur = 0.12
output = "out"
about = "a soft UI button click: a short sine blip with a woody tick on top"
vary = { "blip.freq" = 0.1 }

[nodes.blip_env]
type = "env.adsr"
params = { attack = 0.001, decay = 0.018, sustain = 0 }

[nodes.blip]
type = "gen.osc"
inputs = { amp = "blip_env" }
params = { wave = "sine", freq = 1400, to = 900, glide = 0.03, gain_db = -3 }

[nodes.tick]
type = "gen.modal"
params = { material = "wood.block", freq = 2200, t60 = 0.015, strike = 0.0007, dur = 0.05, gain_db = -12, seed = 2 }

[nodes.mix]
type = "mix.sum"
inputs = { a = "blip", b = "tick" }

[nodes.out]
type = "fx.normalize"
inputs = { in = "mix" }
params = { mode = "peak", target = -3 }

Whoosh

a whoosh past the listener: noise swept up and back down through a band-pass, panned left to right

Waveform and spectrogram of Whoosh

1.20 s · stereo · peak -1.0 dBFS · -13.0 LUFS · brightness 2575 Hz · no findings · 7 nodes, rendered in 5.3 ms

The graph (whoosh.toml)
version = 1
sr = 48000
dur = 1.2
output = "out"
about = "a whoosh past the listener: noise swept up and back down through a band-pass, panned left to right"

[nodes.swell]
type = "env.adsr"
params = { attack = 0.55, decay = 0.25, sustain = 0, release = 0.2 }

[nodes.air]
type = "gen.noise"
inputs = { amp = "swell" }
params = { color = "pink", gain_db = -4, seed = 5 }

[nodes.sweep]
type = "env.adsr"
note = "drives the filter: up as it arrives, down as it leaves"
params = { attack = 0.6, decay = 0.3, sustain = 0, release = 0.2 }

[nodes.band]
type = "filter.eq"
inputs = { in = "air", mod = "sweep" }
params = { type = "bandpass", freq = 350, q = 1.6, mod_depth = 3.2 }

[nodes.travel]
type = "env.ramp"
params = { from = -1, to = 1, shape = "smooth" }

[nodes.pan]
type = "fx.pan"
inputs = { in = "band", mod = "travel" }
params = { pan = 0, mod_depth = 0.8 }

[nodes.out]
type = "fx.normalize"
inputs = { in = "pan" }
params = { mode = "peak", target = -1 }