Procedural Wind

A procedural wind audio system for first person games driven by a single MetaSounds source. Wind is synthesized by routing noise through modulated filter banks, which adapt in response to windbreak and nearby geometry.

For a project set in a stormy environment, audio designer Nino Saglia and I created a procedural wind system using C++ and MetaSounds.

Activities

  • Programmed the classes for the system.
  • Created the environmental query algorithms.
  • Worked on the MetaSounds graphs and patches for the wind audio.

Project:
Procedural Wind
Software:

Unreal Engine 5

Language:

C++

Year:
2023

The wind is synthesized by routing noise through modulated filter banks, the filters are modulated by using a drunk algorithm that simulates the way wind howls.

To synthesize the wind, we route noise through modulated filter banks in MetaSounds to create an array of wind sounds that reflect individual wind gusts in natural environment. To create the resonance in the wind gusts, we created a 'drunk' algorithm for modulating these filters. This algorithm replicates the variable, oscillatory, howls that are characteristic of wind interacting with geometry.

To enable the wind to adapt to windbreak and surrounding geometry, we developed a system for querying the environment around the listener in C++. We captured data both in the direction of the wind and in a spherical distribution around the listener.

We use this data within the MetaSounds patch to modify the wind in each cardinal direction surrounding the listener. This way, we can create resonant, howling wind gusts when the listeners stands inside a door-opening, or near exterior walls or rocks.

Given that wind sound changes are relatively gradual, not requiring frame-by-frame accuracy, we created a temporal tracing algorithm to query the geometry. This algorithm conducts portions of the geometry query per frame, updating the entire system only upon completion of the query, usually after a few frames. This effectively spreads the performance load of multiple collision traces over numerous frames, rather than burdening a single frame with a full query.