The audio visualizer is a standalone React library that builds as a dynamic module, designed for runtime loading via react-dynamic-module. It provides 55 auto-generated visualizers with full type safety and bidirectional communication.
┌─────────────────────────────────────────────────────────────┐
│ Audio-Visualizer (_audio-visualiser) │
│ - Builds in library mode → yz-audio-visualiser.js │
│ - Standalone module with full capabilities │
│ - Exports: AudioVisualiser component + useStore │
└─────────────────────────────────────────────────────────────┘
↓ (loaded via react-dynamic-module)
┌─────────────────────────────────────────────────────────────┐
│ Frontend (LedFx-Frontend-v2) │
│ - Uses react-dynamic-module for runtime loading │
│ - Consumes audio-visualizer exports │
│ - Shares Zustand store (useVstore = visualizer's useStore) │
└─────────────────────────────────────────────────────────────┘
↓ (embedded in)
┌─────────────────────────────────────────────────────────────┐
│ Backend (LedFx) │
│ - Python audio processing engine │
│ - Serves frontend as web interface │
│ - Generates audio data for visualizers │
└─────────────────────────────────────────────────────────────┘
↓ (packaged as)
┌─────────────────────────────────────────────────────────────┐
│ LedFxCC (Electron Binary) │
│ - Desktop application │
│ - Bundles backend + frontend + audio-visualizer │
│ - Cross-platform distribution │
└─────────────────────────────────────────────────────────────┘
src/
├── VisualiserIso.tsx (172 lines) # Main orchestrator component
├── index.ts # Public API exports
│
├── _generated/ # ⚡ AUTO-GENERATED (never edit!)
│ ├── registry.ts # Combined 55 visualizers
│ ├── schemas.ts # 10 schema-based configs
│ ├── backend-mapping.ts # 17 backend effects
│ └── webgl/ # 28 WebGL metadata
│
├── components/ # UI Components
│ ├── Audio/ # Audio context provider
│ ├── Handlers/ # Side-effect handlers
│ ├── Layout/ # Structural components
│ ├── Panels/ # Configuration panels
│ └── Visualisers/ # All visualizer components
│
├── engines/ # Core Logic (UI-independent)
│ ├── audio/ # Audio analysis engine
│ └── webgl/ # WebGL registry & shaders
│
├── hooks/ # Reusable React hooks
│
├── store/ # Zustand State Management
│ ├── useStore.ts # Main store (5 slices)
│ ├── migrate.ts # Version migrations
│ └── visualizer/ # Domain slices
│
├── types/ # TypeScript definitions
├── utils/ # Pure utilities
└── webgl/ # Backward compatibility
External (Root):
├── schemas/ # 10 .schema.ts files
├── scripts/ # 3 generator scripts
├── webgl-metadata.json # WebGL source of truth
└── docs/ # Documentation
- File:
webgl-metadata.json - Generator:
scripts/generate-webgl-registry.ts - Output:
src/_generated/webgl/registry.ts - Categories: Original Effects (10), 2D Effects (4), Matrix Effects (14)
- Files:
schemas/*.schema.ts - Generator:
scripts/generate-schemas.ts - Output:
src/_generated/schemas.ts - Examples: Butterchurn, Astrofox, Fluid, WaveMountain, etc.
- Source: GitHub API (LedFx backend repo)
- Generator:
scripts/extract-backend-schemas.ts - Output:
src/_generated/backend-mapping.ts - Examples: Blade, Scroll, Strobe, Plasma2d, etc.
useStore (Main Store)
├── storeVisualizer → Visual type, audio source, playback
├── storeUI → Overlays, fullscreen, panels
├── storePostProcessing → FX pipeline, WebGL context
├── storeConfigs → Visualizer configurations
└── storeShaderEditor → Custom shader editing
Middleware:
├── persist → localStorage ('visualiser-storage')
├── devtools → Redux DevTools (dev only)
└── migrations → Version-based state upgrades// Frontend directly accesses visualizer's store
const { useStore } = window.YzAudioVisualiser
const useVstore = useStore
// Direct reactive access (no polling!)
const visualType = useVstore(state => state.visualType)
const setVisual = useVstore(state => state.setVisualType)See COMMUNICATION.md for detailed evolution from props → window.api → direct store sharing.
Current State: Frontend shares the Zustand store directly via useVstore, enabling:
- Zero polling (reactive updates)
- Zero desync (single source of truth)
- Full type safety (TypeScript across modules)
- Bidirectional control (frontend ↔ visualizer)
- Single Responsibility - Every file < 700 lines, focused purpose
- Auto-Generation - Zero manual type/config duplication
- Type Safety - Full TypeScript coverage with strict mode
- Separation of Concerns - UI/Logic/State clearly separated
- Dual Mode - Works standalone AND integrated
- Performance - Selective re-renders, throttled updates
- COMMUNICATION.md - Frontend↔Visualizer communication
- ZUSTAND_STORE.md - State management guide
- GENERATORS.md - Auto-generation systems
- WEBGL_GENERATION.md - WebGL metadata system
- BACKEND-SCHEMA-GENERATION.md - Backend integration