Skip to main content
This example demonstrates how to create synchronized audio visualizations by analyzing audio data and rendering waveforms and visual effects that respond to the audio content.

Overview

The audio visualization example shows:
  • Synchronous audio buffer creation for deterministic rendering
  • Real-time waveform visualization from audio samples
  • Volume-based visual effects using RMS analysis
  • Frame-perfect audio-visual synchronization

Complete implementation

composition.html
main.ts

Key patterns

Synchronous audio buffer creation

Create audio buffers synchronously before Helios initialization to ensure deterministic rendering:
This approach ensures that audio data is available immediately during frame rendering without async delays.

Sample window calculation

Calculate which audio samples to visualize based on current time:
This creates a moving window of audio samples that stays synchronized with playback.

RMS volume analysis

Calculate root mean square (RMS) for volume-based effects:
RMS provides a perceptually accurate measure of audio loudness.

Waveform rendering

Draw audio waveforms by mapping samples to canvas coordinates:

Performance tips

Optimize sample window size

Balance visual detail with performance by choosing appropriate window sizes:
  • Small windows (256-512 samples): Fast rendering, less detail
  • Medium windows (1024-2048 samples): Good balance for most use cases
  • Large windows (4096+ samples): High detail, may impact performance

Use typed arrays efficiently

Audio sample data is stored in Float32Array. Access it directly without creating intermediate arrays:

Cache audio analysis results

For complex visualizations, cache analysis results per frame:

Limit canvas redraws

Only redraw elements that change between frames. Use layered canvases for static backgrounds:

Advanced techniques

Frequency analysis with FFT

For frequency-based visualizations, implement FFT analysis:

Multi-channel audio

Visualize stereo or multi-channel audio:

Beat detection

Implement simple beat detection for rhythm-based effects: