title: Jam Buddy
emoji: πΈ
colorFrom: red
colorTo: purple
sdk: docker
app_port: 7860
pinned: false
short_description: You start playing, it joins in β an AI music companion.
Jam Buddy
An AI music companion that listens to what you play and joins in β at your tempo, in the instrument you pick. Built for the Stability AI Challenge at Music Hackspace Montreal (August 22β23, 2026).
TRY IT NOW AT Our HuggingFace Space
What this is
Jam Buddy is a call-and-response music practice partner. You start playing, it joins in.
- Load a MIDI take (from a controller) β the buddy detects your tempo and matches its length, then responds with a complementary part in your chosen instrument at the same tempo.
- Load an audio take (mic/interface) β the buddy uses Stable Audio 3's audio-to-audio path to actually hear your groove and respond to it rhythmically.
- Pick an instrument (bass / lead / rhythm / synth / drums), a genre, and a mood β the buddy generates the response with SA3.
- PLAY BOTH plays your take and the buddy's response together, in tempo.
- Every response is saved to
generations/so you can keep and inspect what it produced.
The whole thing is screenreader-compatible by design: every knob is a
labelled <input type=range>, buttons have accessible names, and the status is
announced via aria-live. Voice-first is accessibility.
The SA3 generation runs locally on the open Stable Audio 3 weights β
small-music for melodic instruments, small-sfx for clean isolated drum hits.
Built for the Stability AI Challenge at Music Hackspace Montreal (August 22β23, 2026, in partnership with MUTEK).
Quick start (web app)
cd apps/web
pnpm install
pnpm dev
# β http://localhost:3000
The web app shells out to tools/jam_buddy.py (the SA3 pipeline). That needs
the stable-audio-3 venv + a one-time model download. See
docs/06-stable-audio-integration.md.
CLI (the pipeline directly)
# MIDI take β tempo + length matched, then respond with bass
python3 tools/jam_buddy.py --midi take.mid --instrument bass --out out.wav
# Audio take β audio-to-audio, responds to the groove
python3 tools/jam_buddy.py --wav take.wav --genre metal --instrument lead --out out.wav
# Manual knob only
python3 tools/jam_buddy.py --bpm 120 --instrument drums --out out.wav
Documentation
| Doc | Purpose |
|---|---|
docs/01-vision.md |
What we're building and why |
docs/02-architecture.md |
System architecture, services, data flow |
docs/03-data-model.md |
Prompt builder, knobs, generation metadata |
docs/05-accessibility.md |
Screenreader/keyboard accessibility strategy |
docs/06-stable-audio-integration.md |
SA3 setup, audio-to-audio, Vega notes, LoRA |
docs/07-reaper-integration.md |
DAW integration via Reaper |
docs/08-build-plan.md |
Hackathon build plan |
docs/09-risks.md |
Ranked risks + mitigations |
docs/10-team-pitch.md |
Team pitch + skills |
Conventions
- Language: TypeScript (frontend), Python 3.10+ (audio pipeline)
- Linting: ESLint + Prettier (TS), ruff + black (Python)
- Accessibility: axe-core in CI, NVDA + VoiceOver tested before each demo
- Commits: Conventional Commits (
feat:,fix:,docs:, etc.) - Branches:
feat/*,fix/*,docs/*,chore/*
For the agent harness β commands, test contract, and what's deliberately not in
git β see docs/HARNESS.md.
License
MIT (code). Generated audio stays local / your own material; no third-party samples ship in this repo.