57fb8a93dc99eb77b32cdbe6643b1a12b8f9ab9a
poof
Audio synthesis web application for generating random sound samples. Users generate sounds via different synthesis engines, mutate parameters, apply audio processors in multiple passes, and export as WAV. Built for musicians seeking unexpected textures and one-shots.
Technologies
- Svelte 5 + TypeScript
- Web Audio API
- Vite (rolldown-vite)
- pnpm
Structure
src/
├── main.ts # Entry point
├── App.svelte # Main UI
└── lib/
├── components/ # UI components (waveform, VU meter, modals)
├── audio/
│ ├── engines/ # synthesis engines + registry
│ ├── processors/ # audio processors + registry
│ ├── services/ # AudioService (Web Audio API wrapper)
│ └── utils/ # WAVEncoder, AudioEdit
└── utils/ # Colors, keyboard, pitch, settings
public/
├── fonts/ # DepartureMono
└── wavetables/ # 1000+ AKWF wavetables
Development
pnpm install
pnpm dev
pnpm build
Docker
docker build -t poof .
docker run -p 8080:80 poof
Opens on http://localhost:8080
Extending
Adding Synthesis Engines
- Create a single file in
src/lib/audio/engines/implementing theSynthEngineinterface - Implement
getName(),getDescription(),generate(),randomParams(), andmutateParams() - Must return stereo output:
[Float32Array, Float32Array] - Keep all DSP code, helpers, and types in the same file
- Register in
src/lib/audio/engines/registry.ts
Adding Audio Processors
- Create a single file in
src/lib/audio/processors/implementing theAudioProcessorinterface - Implement
getName(),getDescription(), andprocess() - Must take and return stereo:
[Float32Array, Float32Array] - Keep all processing logic, helpers, and types in the same file
- Register in
src/lib/audio/processors/registry.ts
Credits
Wavetables from Adventure Kid Waveforms by Kristoffer Ekstrand
Description
Languages
TypeScript
88.3%
Svelte
8.8%
JavaScript
2.5%
CSS
0.2%
Dockerfile
0.1%