Soundgen is a Rust workspace for generating 8-bit/chiptune sound effects, UI sounds, and ambient textures for game audio assets. It features JSON-first sound specs, an MCP server for LLM tool-use, an egui GUI editor, and a runtime library with NES-authentic DAC emulation. Features: - 6 voice types: pulse, triangle, noise, DPCM, wavetable, FM - Effects: ADSR envelope, frequency sweep, biquad filter, vibrato - 13 built-in presets (SFX/UI/ambient) as JSON data files - MCP server: list_presets, generate_sfx, render_sound tools - Pattern-based sequencer (JSON song format) - egui GUI: virtual keyboard, preset browser, channel editor, undo/redo - Runtime: NES nonlinear DAC + SoundBank for game embedding - 90 tests, 0 warnings Crates: - soundgen-core: synthesis engine (no I/O) - soundgen-fmt: SoundSpec JSON schema + PresetRegistry - soundgen-io: WAV writer + audio playback - soundgen-seq: sequencer (patterns, songs) - soundgen-cli: gen/render/render-song/list-presets - soundgen-mcp: MCP server for LLM integration - soundgen-gui: egui editor - soundgen-runtime: NES DAC + SoundBank
51 lines
2.2 KiB
Markdown
51 lines
2.2 KiB
Markdown
# Soundgen
|
|
|
|
8-bit sound synthesizer in Rust for game audio assets, with LLM integration via MCP.
|
|
|
|
## Status
|
|
|
|
Phases 1-4 complete. `PLAN.md` is the authoritative design doc.
|
|
|
|
## Architecture (from PLAN.md)
|
|
|
|
Cargo **workspace** with these crate boundaries:
|
|
|
|
- `soundgen-core` — synthesis engine (generators, effects, mixer). No I/O. Renders to `Vec<f32>`.
|
|
- `soundgen-fmt` — `SoundSpec` JSON schema (serde) + `PresetRegistry` loading from `presets/`.
|
|
- `soundgen-io` — WAV writer (`hound`) and playback (subprocess fallback: `paplay`/`aplay`).
|
|
- `soundgen-seq` — sequencer: patterns, songs.
|
|
- `soundgen-cli` — `gen`, `render`, `render-song`, `list-presets` commands (`clap`).
|
|
- `soundgen-mcp` — MCP server exposing `list_presets`, `generate_sfx`, `render_sound` tools (JSON-RPC over stdio, no rmcp dependency).
|
|
- `soundgen-gui` — egui editor with virtual keyboard, preset browser, SFX editor, sequencer, undo/redo, file dialogs.
|
|
- `soundgen-runtime` — NES-authentic nonlinear DAC + `SoundBank` for game embedding.
|
|
|
|
Presets are **JSON data files** in `presets/{sfx,ui,ambient}/`, not compiled code.
|
|
|
|
## Conventions
|
|
|
|
- **JSON-first**: every sound is a `SoundSpec` JSON object. LLMs generate JSON; CLI/MCP render to WAV.
|
|
- **No allocations in audio hot path**: generators use `&mut self`, `tick() -> f32`, no `Vec` per-sample.
|
|
- **Presets as data**: extend `presets/` with new `.json` files, no recompilation needed.
|
|
- **MIT license**.
|
|
|
|
## Commands
|
|
|
|
```bash
|
|
cargo test --workspace # run all tests (90 passing)
|
|
cargo run --bin soundgen -- list-presets
|
|
cargo run --bin soundgen -- gen <preset> --out <path>
|
|
cargo run --bin soundgen -- render <spec.json> --out <path>
|
|
cargo run --bin soundgen -- render-song <song.json> --out <path>
|
|
cargo run -p soundgen-mcp -- --presets-dir presets # MCP server on stdio
|
|
cargo run -p soundgen-gui # GUI editor
|
|
```
|
|
|
|
## Roadmap
|
|
|
|
Phase 1 (MVP): core generators (pulse/triangle/noise) + envelope/sweep/mixer + WAV I/O + CLI + SFX/UI presets.
|
|
Phase 2: DPCM/wavetable/FM + sequencer + MCP server + ambient presets.
|
|
Phase 3: egui GUI + realtime playback.
|
|
Phase 4: NES-authentic DAC, runtime library, sound bank.
|
|
|
|
See `PLAN.md` for full details, dependency versions, and the `SoundSpec` JSON format.
|